anime-mcp-server
Click on "Deploy 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., "@anime-mcp-serversearch for anime Attack on Titan"
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.
Overview
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 watch order, check the airing schedule, and look up characters, voice actors, and studio filmographies from any MCP client. Runs as a stdio process or a local Streamable HTTP server.
Tools
Tool | Description |
| 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. |
| 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. |
| Franchise untangler. Walks the related-works graph from a media ID beyond one hop — sequels, prequels, side stories, movies, OVAs, source and adaptation — and returns them in suggested watch/read order. |
| 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. |
| 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. |
| AniList recommendations with matching Jikan (MAL) vote counts. Optionally echoes what the user liked about the source title to contextualize picks. |
| 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. |
| 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. |
Resources
Resource | Description |
| Compact media record by AniList ID — title, synopsis, scores, genres, streaming count, and cover image. Stable URI for injectable context. |
All resource data is also reachable via tools. Use anime_search_media to discover AniList IDs before fetching the resource URI.
Related MCP server: MyAnimeList MCP Server
Capability reference
anime_search_media tool
Free-text title search with AniList primary. When AniList has no match at all for a query-only search, it falls back to Jikan (MAL) and maps the rows to AniList IDs, honoring
include_adult. The fallback runs only atper_page25 or less (Jikan's page size); above that, or if Jikan is unavailable, the AniList empty page comes back with a notice instead of an errorFilter by genre, tag, season/year, format (
TV,MOVIE,OVA,MANGA,NOVEL, etc.), and status (RELEASING,FINISHED, etc.); up to 5 sort valuesNeeds at least one criterion; blank or whitespace
query/genre/tagvalues count as absent, and a sort other thanSEARCH_MATCHalone browses the catalog (missing_criteriaotherwise)Default sort:
SEARCH_MATCHwith aquery,POPULARITY_DESCwithout oneAdult content gated behind explicit
include_adult: true(default off)Pagination via
pageandper_page(max 50), driven byhas_next_page;total_resultsis exact and appears only on the final page. AniList serves the first 5,000 results — the last reachable page carries a notice saying so, and deeper pages fail withpage_depth_exceeded
anime_get_media tool
AniList full-detail query supplemented in parallel by Jikan (MAL score) and Kitsu (streaming links with sub/dub language flags) via
Promise.allSettled;data_sourcesflags which succeededAniList and MAL scores surfaced side by side — never blended — plus AniList weighted average/popularity and MAL rank/popularity
Tags carry an
is_spoilerflag from AniList'sisGeneralSpoiler; the formatted text view hides spoiler and adult tags while the full array stays in structured outputStreaming links: Kitsu primary (with per-platform sub/dub language lists), AniList
externalLinksfallback when Kitsu has nonenot_foundwhen the AniList ID doesn't resolve — useanime_search_mediafirst
anime_get_relations tool
Multi-hop BFS over AniList's relation graph, up to
max_depthhops (default 2, max 4)Entries split into
main(source, adaptation, prequel, sequel — canonical story) andsupplementary(side story, spin-off, compilation, and similar) viawatch_order_categoryEach entry includes
season_yearand episode/chapter count for contextnot_foundwhen the root AniList ID doesn't resolve
anime_get_schedule tool
Two modes:
season(all anime airing in a season/year — bothseasonandseason_yearrequired) andupcoming(next episode per airing title withindays_ahead, 7 when omitted, max 30)invalid_seasonwhen mode isseasonbutseason/season_yearis missing;conflicting_inputswhen a mode gets the other mode's fields (upcomingwithseason/season_year,seasonwithdays_ahead)Adult titles excluded by default (
include_adult); pagination viapage/per_page(max 50), driven byhas_next_page. In season modetotal_resultsis exact and appears only on the final page; AniList serves the first 5,000 entries — the last reachable page carries a notice saying so, and deeper pages fail withpage_depth_exceededAiring timestamps are UTC ISO 8601, with
time_until_airing_secondsfor countdowns
anime_find_characters tool
Three lookup modes:
id(media → cast),character_name, orvoice_actor_name— exactly one per call. None failsmissing_identifier; more than one failsconflicting_inputs. Names are trimmed, and a blank name counts as absentBy-media mode supports a
languagefilter over AniList'sStaffLanguageenum (JAPANESE, ENGLISH, KOREAN, etc.);languagewith a name search failsconflicting_inputsCast list capped at
per_page(max 25); a capped page returnstruncated: truewith next-page guidancemedia_not_found/not_founddistinguish an invalid media ID from a name search with no match
anime_get_recommendations tool
Returns AniList recommendations, adding Jikan/MAL vote counts when the same recommendation appears in both sources;
sourcesidentifies each contributionScores stay separate —
anilist_ratingandjikan_votesare never blended into one figureOptional
liked_aspectsfree-text field is echoed back unmodified, for the caller to contextualize picksAniList page capped at
per_page(max 25); a capped page returnstruncated: truewith next-page guidancenot_foundwhen the source AniList ID doesn't resolve
anime_get_rankings tool
Three modes:
top(all-time by score),trending(current week),seasonal(current or specified season/year, sorted by popularity)Filterable by
genre,tag(an AniList tag name such asIsekai), andformatin every mode; blank values count as absent. Adult content excluded by default (include_adult)seasonaltakesseasonandseason_yeartogether, or neither for the current season (invalid_seasonotherwise); intop/trendingthey restrict the ranking, andseason_labelnames the applied filterPagination via
page/per_page(max 50), driven byhas_next_page; each entry carries a 1-basedrank.total_resultsis exact and appears only on the final page; AniList serves the first 5,000 entries — the last reachable page carries a notice saying so, and deeper pages fail withpage_depth_exceeded
anime_get_studio tool
Look up by
name(search, trimmed) orid(direct AniList studio ID) — exactly one: neither failsmissing_identifier, both failconflicting_inputs; a blanknamecounts as absentFilmography sortable by
POPULARITY_DESC(default),SCORE_DESC,START_DATE_DESC, orSTART_DATEOne row per distinct title on a page, with
is_main_studioset when any of the studio's credits on it is a main-studio creditnot_foundwhen neither the name search nor the ID lookup resolvesPagination via
page/per_page(max 25, AniList's page size for a studio's titles), driven byhas_next_page;total_titlesis exact only when the whole filmography fits on page 1
anime://media/{id} resource
Compact media record as
application/json— title variants, synopsis, scores, genres, streaming count, cover imageidcomes fromanime_search_mediaoranime_get_mediaA flatter subset of
anime_get_media— no tags, studios, streaming links, or relations
Features
Built 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:
Three-source architecture: AniList GraphQL (primary), Jikan v4 REST (MAL scores + recommendations), Kitsu JSON:API (streaming links with sub/dub language detail)
ID reconciliation via AniList's
idMalbridge — no cross-source ID guessingFranchise relation graph traversal with heuristic ordering by relation-type priority, then season year
Rate-limit-aware service layer: AniList 30 req/30s with automatic backoff; Jikan 350ms floor between calls
Keyless by design — all three sources are public and require no API credentials
Agent-friendly output:
Dual scores surfaced separately — AniList
meanScore(0–100) and MALscore(0–10) with population size (scored_by) so agents can reason about weight; never blended into a compositeSpoiler safety — tags carry an
is_spoilerflag from AniList'sisGeneralSpoiler; the formatted text view hides spoiler and adult tags while the full array stays in structured outputSupplement provenance —
anime_get_media.data_sourcesreports whether AniList, MAL/Jikan, and Kitsu data was retrieved; an unavailable supplement leaves its flag falseUTC timestamps throughout; season labels echoed (
WINTER 2024) to avoid the winter/spring/summer/fall boundary footgun
Getting started
No 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/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+). No API keys needed.
Installation
Clone the repository:
git clone https://github.com/cyanheads/anime-mcp-server.gitNavigate into the directory:
cd anime-mcp-serverInstall dependencies:
bun installConfigure environment (optional):
cp .env.example .env
# edit .env if you want to change transport or log levelConfiguration
No server-specific env vars are required. All framework variables are optional with sensible defaults.
Variable | Description | Default |
| Transport: |
|
| Port for HTTP server. |
|
| Hostname for HTTP server. |
|
| Endpoint path for the MCP server. |
|
| Overrides the source-declared default: |
|
| Auth mode: |
|
| Log level (RFC 5424): |
|
| Enable OpenTelemetry instrumentation. |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun 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
docker build -t anime-mcp-server .
docker run --rm -p 3010:3010 anime-mcp-serverThe 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.
Project structure
Directory | Purpose |
|
|
| Tool definitions ( |
| Resource definitions ( |
| AniList GraphQL client — primary source for all queries. |
| Jikan v4 REST client — MAL scores and recommendations. |
| Kitsu JSON:API client — streaming links with sub/dub language detail. |
| Unit and integration tests mirroring |
| Per-version changelog files ( |
Development guide
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools and resources via the barrels in
src/mcp-server/*/definitions/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
AniList is primary — supplement failures (Jikan, Kitsu) degrade gracefully via
Promise.allSettled
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Unlock a world of television with the TV Maze MCP server. Effortlessly search for shows by name or
MCP server for AI dialogue using various LLM models via AceDataCloud
Capability registry for the agentic economy. Semantic search over verified MCP server listings.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that provides access to MyAnimeList's API for anime and manga data. It enables users to search, view rankings, manage their personal lists, and get recommendations through Claude and other MCP clients.109 npm1MIT
- AlicenseBqualityDmaintenanceMCP Server for interacting with the MyAnimeList API, allowing LLM clients to access and interact with anime, manga and more.154MIT
- AlicenseAqualityAmaintenanceMCP server for MyAnimeList that enables searching anime/manga, getting details, rankings, seasons, characters, reviews, and user profiles without authentication, and managing personal anime/manga lists with authentication (token required).54109 npm3MIT
- AlicenseAqualityAmaintenanceMCP server for Anime News Network, enabling search of anime and manga encyclopedia entries, retrieval of details like cast, staff, and episodes, and access to news feeds. No API key or configuration required.4102 npmMIT