Search anime/manga, franchise watch order, schedule, characters, rankings, studio filmography.
Search anime/manga, get full detail, franchise watch order, 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 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.
| 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 fallback on empty results. |
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 | 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. |
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 | AniList recommendations with matching Jikan (MAL) vote counts. Optionally echoes what the user liked about the source title to contextualize picks. |
anime_get_rankings | Top, trending, or seasonal rankings. Filterable by genre 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. |
All resource data is also reachable via tools. Use anime_search_media to discover AniList IDs before fetching the resource URI.
anime_search_media toolquery was givenTV, MOVIE, OVA, MANGA, NOVEL, etc.), and status (RELEASING, FINISHED, etc.); up to 5 sort valuesinclude_adult: true (default off)page and per_page (max 50)anime_get_media toolPromise.allSettled; data_sources flags which succeededis_spoiler flag from AniList's isGeneralSpoiler; the formatted text view hides spoiler and adult tags while the full array stays in structured outputexternalLinks fallback when Kitsu has nonenot_found when the AniList ID doesn't resolve — use anime_search_media firstanime_get_relations toolmax_depth hops (default 2, max 4)main (source, adaptation, prequel, sequel — canonical story) and supplementary (side story, spin-off, compilation, and similar) via watch_order_categoryseason_year and episode/chapter count for contextnot_found when the root AniList ID doesn't resolveanime_get_schedule toolseason (all anime airing in a season/year — both season and season_year required) and upcoming (next episode per airing title within days_ahead, default 7, max 30)invalid_season when mode is season but season/season_year is missinginclude_adult); pagination via page/per_page (max 50)time_until_airing_seconds for countdownsanime_find_characters toolid (media → cast), character_name, or voice_actor_name — at least one identifier required, or missing_identifier; when several are supplied, id takes precedence, then character_namelanguage filter over AniList's StaffLanguage enum (JAPANESE, ENGLISH, KOREAN, etc.)per_page (max 25); a capped page returns truncated: true with next-page guidancemedia_not_found / not_found distinguish an invalid media ID from a name search with no matchanime_get_recommendations toolsources identifies each contributionanilist_rating and jikan_votes are never blended into one figureliked_aspects free-text field is echoed back unmodified, for the caller to contextualize picksper_page (max 25); a capped page returns truncated: true with next-page guidancenot_found when the source AniList ID doesn't resolveanime_get_rankings tooltop (all-time by score), trending (current week), seasonal (current or specified season/year, sorted by popularity)genre and format; adult content excluded by default (include_adult)page/per_page (max 50); each entry carries a 1-based rankanime_get_studio toolname (search) or id (direct AniList studio ID) — at least one required, or missing_identifier; id takes precedence when both are suppliedPOPULARITY_DESC (default), SCORE_DESC, START_DATE_DESC, or START_DATEnot_found when neither the name search nor the ID lookup resolvespage/per_page (max 50)anime://media/{id} resourceapplication/json — title variants, synopsis, scores, genres, streaming count, cover imageid comes from anime_search_media or anime_get_mediaanime_get_media — no tags, studios, streaming links, or 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 compositeis_spoiler flag from AniList's isGeneralSpoiler; the formatted text view hides spoiler and adult tags while the full array stays in structured outputanime_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 | Overrides the source-declared default: auto, stateful, or stateless. The framework schema default auto resolves to stateful. | stateless |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424): debug, info, notice, warning, error. | info |
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/. |
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.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @cyanheads/anime-mcp-serverMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-cyanheads-anime-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/anime-mcp-server"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceio.github.cyanheads/anime-mcp-server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.