AniList MCP Server (Unofficial)
MCPB · ANILIST-MCP-SERVER.MCPB · 2 COMPONENTS
MCP server for the AniList GraphQL API — anime/manga search, details, and personal list management.
Available components
Last scanned (4 minutes ago)
Scores higher than 98% of MCPB servers
Category Entertainment and Games
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security25
- No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
- Known CVEs were checked across the 3 of 3 dependencies we could resolve, so this covers what we could see, not the whole tree.Partial
- No install/post-install scripts declared.Pass
- 0 of 3 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency48
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 13 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability77
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 16545 tokens (~330/item across 50 items; 50 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 51 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 25 Oct 26 0
- Stability: 0.97 → pass security
- 24 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 22 Oct 26 +1
- Package version: 0.10.0 → 0.11.0 functional
- 20 Oct 26 +1
- Schema quality: 268 → 330 ▼ functional
- Package version: 0.9.0 → 0.10.0 functional
- 18 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 50 to 57. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed mcpb/https://github.com/Grinv/anilist-mcp-server/releases/download/v0.11.0/anilist-mcp-server.mcpb@0.11.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | mcpb |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Dependencies 3 packages
| Packages resolved | 3 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_list_entry Add an entry to your AniList list ~855
[Requires login] Add an anime/manga to the authenticated user's own AniList list. Use search_media first to resolve the title to its AniList media ID. Only set the fields you care about — everything else is left at AniList's defaults ONLY if this media isn't already on the list. AniList upserts by media ID: if an entry for it already exists (e.g. previously dropped, with its own score/notes/progress), calling this updates that entry in place instead — every field you don't set here keeps its previous value, not a default. Use get_user_list first to check for an existing entry if you need a guaranteed-fresh one. The response echoes what AniList actually stored, so check it rather than assuming the write landed verbatim. It includes `customLists`/`advancedScores` only when you set them — those are the fields AniList zeroes/replaces rather than merges, so they're worth reading back; otherwise the echo is trimmed, since a list sync is hundreds of writes.
| Name | Type | Req | Description |
|---|---|---|---|
| advancedScores | object | – | Per-category scores, 0-10 scale (e.g. {Story: 8, Characters: 9}) — errors if advanced scoring isn't enabled for this media's type, or if a key doesn't match the account's configured category list for… |
| completedAt | object | – | Date you completed. |
| customLists | array | – | Names of custom lists to file this entry under — REPLACES this entry's full set of enabled lists, not merged: naming only a subset silently turns OFF every other list this entry was previously filed… |
| hiddenFromStatusLists | boolean | – | Hide this entry from the public status-grouped list views (e.g. 'Watching') while still counting it in statistics — distinct from `private`, which hides the entry entirely. |
| mediaId | integer | yes | AniList anime/manga ID to add (from search_media). |
| notes | string | – | Free-text notes for this entry (per AniList's own schema, capped at 6000 characters). |
| priority | integer | – | List priority (higher = more important; per AniList's own schema, capped at 255). |
| private | boolean | – | Hide this entry from your public list. |
| progress | integer | – | Episodes watched / chapters read. |
| progressVolumes | integer | – | Volumes read (manga only). |
| repeat | integer | – | Number of times rewatched/reread (per AniList's own schema, capped at 1000). |
| score | number | – | Score out of 10 (decimals allowed, e.g. 8.5), always on this scale regardless of the account's configured scoreFormat (set via update_user) — no conversion needed. |
| startedAt | object | – | Date you started. |
| status | string | – | List status. If omitted on a genuinely NEW entry, AniList defaults to CURRENT (with `startedAt` auto-set to today) — confirmed live; despite AniList's own site UI defaulting new entries to Planning,… |
| Name | Type | Req | Description |
|---|---|---|---|
| entry | object | yes | – |
No examples provided.
delete_activity Delete an activity post ~86
[Requires login] Delete an activity post the authenticated user owns. This cannot be undone, and calling it again on an already-deleted id errors as not found rather than silently succeeding.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList activity ID to delete — from get_user_activity, get_user_recent_activity, search_activity, or the id returned by a previous post_text_activity/post_message_activity call. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
delete_thread Delete a forum thread ~77
[Requires login] Delete a forum thread the authenticated user owns, by its ID (from search_thread, get_thread, or the id returned by post_thread). This cannot be undone, and calling it again on an already-deleted id errors as not found rather than silently succeeding.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList thread ID to delete. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
delete_thread_comment Delete a comment on a forum thread ~75
[Requires login] Delete a comment the authenticated user owns, by its ID (from get_thread_comments or the id returned by post_thread_comment). This cannot be undone, and calling it again on an already-deleted id errors as not found rather than silently succeeding.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList comment ID to delete. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
get_activity Get an activity post ~79
Get a single AniList activity post (list update, text post, or message) by its ID, including `replyCount`, `likeCount`, and `isLiked`.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList activity ID — from get_user_activity, get_user_recent_activity, search_activity, or the id returned by post_text_activity/post_message_activity. |
| Name | Type | Req | Description |
|---|---|---|---|
| activity | – | yes | – |
No examples provided.
get_anime_schedule Get the anime airing schedule ~467
Get upcoming (or a specific title's) episode air times, soonest-airing first (confirmed live) — or, with `notYetAired: false`, already-aired ones newest first. Omit `mediaId` for the site-wide upcoming schedule, or pass it (from search_media/get_media) to get one title's next-episode air time. Set `airingAfter`/`airingBefore` for a date window instead (e.g. what airs this week, or what aired yesterday). Anime only — manga has no airing schedule; a manga id (like any non-anime id) is rejected as not-found rather than silently returning an empty schedule, though that error reads the same as a nonexistent id and doesn't single out the manga/anime mismatch.
| Name | Type | Req | Description |
|---|---|---|---|
| airingAfter | string | – | Only episodes airing after this instant — ISO 8601 with a timezone, e.g. "2026-10-20T00:00:00Z" or "2026-10-20T09:00:00+09:00". |
| airingBefore | string | – | Only episodes airing before this instant (same format as `airingAfter`). Pair the two for a window, e.g. this week's episodes. |
| mediaId | integer | – | Restrict to this AniList anime ID (not manga). |
| notYetAired | boolean | – | true: only not-yet-aired episodes; false: only already-aired ones (confirmed live: false swaps to a past-only result set, it doesn't add past episodes to the upcoming ones). Omitted, it defaults to t… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| Name | Type | Req | Description |
|---|---|---|---|
| hasNextPage | boolean|null | – | – |
| schedule | array | yes | – |
No examples provided.
get_authorized_user Get the logged-in user's profile ~187
[Requires login] Get the profile of the AniList account currently authorized via login_anilist/ANILIST_ACCESS_TOKEN — use this to confirm which account is connected. Also the authoritative source to fetch BEFORE an update_user call touching `options.notificationOptions`/`options.disabledListActivity` (confirmed live: full array replace, not merge by entry) or `mediaListOptions.animeList/mangaList.customLists` (confirmed live: same full-replace behavior) — read the current values here first and resend them in full alongside your changes. The sibling `advancedScoring` array carries a related but distinct risk instead: it's positional, not name-matched, so reordering/renaming its entries silently reinterprets already-scored list entries (see update_user's own `advancedScoring` field for detail) — fetch it here first too before changing it.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| user | object | yes | – |
No examples provided.
get_character Get character details ~347
Get a character's profile by AniList character ID: name, image, description, and the anime/manga they appear in (`media`, most popular first, with their `characterRole` — MAIN/SUPPORTING/BACKGROUND — in each). Use search_character first to resolve a name to its ID. `media` is paginated (`page`/`perPage`, max 25): a long-running franchise character can appear in far more titles than one page holds, so check `media.pageInfo.hasNextPage` before treating it as the full list. Narrow it with `type` (anime or manga only) or `onList`.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList character ID. |
| onList | boolean | – | [Requires login] Restrict the filmography to (true) or exclude (false) titles already on the authenticated user's own list. Omit to ignore list status entirely. Errors if not logged in (AniList would… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 25, AniList's own ceiling — it silently clamps anything higher). |
| type | string | – | Only return anime (ANIME) or only manga (MANGA) in `media` — filtered by AniList before pagination, so pages stay full. Omit for both. |
| Name | Type | Req | Description |
|---|---|---|---|
| character | object | yes | – |
No examples provided.
get_full_user_info Get a user's complete profile and stats ~159
Get an AniList user's profile AND statistics in a single call — use this instead of calling get_user_profile and get_user_stats separately. Like get_user_profile, this also returns the target's account settings (notifications, list display, etc.) regardless of who's authenticated — AniList doesn't viewer-gate those fields. Accepts an exact AniList username directly — no need to call search_user first unless you only have a partial/fuzzy name. Its embedded statistics carry the same staleness caveat as get_user_stats: AniList's own aggregation can lag and read all-zero even for an account with real list entries.
| Name | Type | Req | Description |
|---|---|---|---|
| user | – | yes | AniList user ID (as a number — a digit string is read as a username), or username. |
| Name | Type | Req | Description |
|---|---|---|---|
| user | object | yes | – |
No examples provided.
get_genres Get genres ~52
List every genre name AniList uses to tag anime/manga (e.g. Action, Comedy, Slice of Life). Call this before filtering search_media by genre, so you pass a name AniList actually recognizes.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| genres | array | yes | – |
No examples provided.
get_media Get anime/manga details ~776
Get information about one or more anime or manga by their AniList ID(s). At the default `format: "full"` that means the whole card: title, format, status, episode/chapter/volume count, genres, score, synopsis, dates, and `rankings` — AniList's own ranking badges (e.g. "#134 highest rated all time", "#11 highest rated 2024"), one entry per rated/popular ranking window the title currently appears in. Also returns `nextAiringEpisode` (for currently-releasing anime), `externalLinks` (official sites, streaming platforms), and — [requires login] — `mediaListEntry`, the authenticated user's own list entry for this title, or null if it isn't on their list. Identify titles by AniList ID (`ids`) or by MyAnimeList ID (`malIds`) — exactly one of the two, and either accepts a batch. Use search_media first only when you have neither: a title search costs a call per title and can match the wrong entry, so prefer `malIds` whenever you already have MAL IDs. For a batch whose point is mapping IDs to titles rather than reading them, pass `format: "compact"` instead, which drops everything above except the identifiers, titles, type/format/status and episode/chapter counts — measured at 5KB against 125KB for the same 30-title batch. Returns a single object if you passed a single ID, or an array (same order as the IDs you passed, with `null` in place of any that didn't resolve to a real anime/manga) if you passed an array.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | How much of each title to return. `full` (default) is the whole card — synopsis, tags, rankings, external links and your own list entry — which is the point of looking one title up. `compact` returns… |
| ids | – | – | A single AniList anime/manga ID, or an array of up to 50 IDs to fetch in one call (AniList's own per-page ceiling; it clamps anything higher, which would silently drop the surplus). Pass this OR `mal… |
| includeStreamingEpisodes | boolean | – | Also fetch `streamingEpisodes` (per-episode streaming links). Has no effect under `format: "compact"`, which returns no detail fields at all. Kept off by default — AniList doesn't paginate this field… |
| malIds | – | – | A single MyAnimeList ID (`idMal`), or an array of up to 50, to resolve straight to AniList titles — use this instead of searching by title when you already have MAL IDs (e.g. syncing a MAL list), sin… |
| type | string | yes | Whether the IDs refer to anime or manga. Required for `malIds` in particular: MAL numbers the two separately, so the same ID means different titles. |
| Name | Type | Req | Description |
|---|---|---|---|
| media | – | yes | – |
No examples provided.
get_media_characters Get an anime/manga's characters ~323
List an anime/manga's characters with their role (MAIN/SUPPORTING/BACKGROUND) and, for anime, their voice actors. Use search_media first to resolve a title to its AniList ID. Grouped by role — MAIN first, then SUPPORTING, then BACKGROUND (confirmed live) — and in AniList's own relevance order within each. Voice actors come back in every dub language unless you set `voiceActorLanguage`; set `role` to list only one role (e.g. just the MAIN cast).
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList ID. |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 25, AniList's own ceiling — it silently clamps anything higher). |
| role | string | – | Only return characters with this role. Omit for every role. |
| type | string | yes | Whether `id` refers to anime or manga. |
| voiceActorLanguage | string | – | Only return voice actors for this dub language (e.g. JAPANESE for the original cast, ENGLISH for the English dub). Omit for every language — AniList then returns all dubs per character (8 for most of… |
| Name | Type | Req | Description |
|---|---|---|---|
| characters | object | yes | – |
No examples provided.
get_media_relations Get a title's related media ~134
Get the anime/manga related to a given title, each with its `relationType`: PREQUEL, SEQUEL, PARENT, SIDE_STORY, SPIN_OFF, ALTERNATIVE, SUMMARY, CHARACTER, ADAPTATION (this title adapted into another format), SOURCE (the material this title was adapted from), COMPILATION, CONTAINS, SAME_UNIVERSE or OTHER. Use search_media first to resolve a title to its AniList ID.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList anime/manga ID. |
| type | string | yes | Whether `id` refers to anime or manga. |
| Name | Type | Req | Description |
|---|---|---|---|
| relations | object | yes | – |
No examples provided.
get_media_reviews Get an anime/manga's reviews ~242
List user-written reviews for an anime or manga, most-helpful-voted first (confirmed live: ordered by `rating`, not `score` — see those fields' own descriptions). Always includes `summary` (a short excerpt); set `includeBody` to also fetch each review's full text (can be long — leave it off unless you actually need the full text). Use search_media first to resolve a title to its AniList ID.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList ID. |
| includeBody | boolean | – | Also fetch each review's full text (`body`), not just its short `summary`. |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 25, AniList's own ceiling — it silently clamps anything higher). |
| type | string | yes | Whether `id` refers to anime or manga. |
| Name | Type | Req | Description |
|---|---|---|---|
| reviews | object | yes | – |
No examples provided.
get_media_staff Get an anime/manga's production staff ~197
List an anime/manga's staff (director, writer, character designer, author, illustrator, etc.) with their role. Use search_media first to resolve a title to its AniList ID. No explicit ordering is requested — don't assume results are sorted by role or popularity (unlike get_staff's reverse-direction lookup, which IS popularity-sorted).
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList ID. |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 25, AniList's own ceiling — it silently clamps anything higher). |
| type | string | yes | Whether `id` refers to anime or manga. |
| Name | Type | Req | Description |
|---|---|---|---|
| staff | object | yes | – |
No examples provided.
get_media_statistics Get an anime/manga's score/status distribution ~78
Get an anime/manga's watch/read-status counts (watching/completed/planning/etc.) and score distribution histogram across all AniList users. Use search_media first to resolve a title to its AniList ID.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList ID. |
| type | string | yes | Whether `id` refers to anime or manga. |
| Name | Type | Req | Description |
|---|---|---|---|
| statistics | object | yes | – |
No examples provided.
get_media_tags Get media tags ~220
List every descriptive tag AniList uses on anime/manga (finer-grained than genres, e.g. 'Time Skip', 'Tragedy', 'Reincarnation'), with category and adult-content flag. There are ~425 tags total, so results are paginated — use `page`/`perPage` rather than expecting them all in one response. Use this to look up a tag's exact name before passing it to search_media's `tag_in` — tag names are case-sensitive, and an unrecognized name doesn't error, it just silently matches nothing (confirmed live).
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| Name | Type | Req | Description |
|---|---|---|---|
| pageInfo | object | – | – |
| tags | array | yes | – |
No examples provided.
get_notifications Get your AniList notifications ~341
[Requires login] Get the authenticated user's AniList notifications: new episodes airing, activity likes/replies/mentions, new followers, thread replies/likes, and media/staff/character data-submission updates. Every item has `id`, `type` and a human-readable `context`/`contexts` string; the rest of the fields depend on `type` (e.g. an AIRING item includes `media`/`episode`, a FOLLOWING item includes `user`, an ACTIVITY_MESSAGE item includes `message.message` — the actual DM text is nested one level inside `message`).
| Name | Type | Req | Description |
|---|---|---|---|
| markAsRead | boolean | – | Set true to also reset AniList's unread-notification badge count to 0, as a side effect of this call (the same effect as opening the notifications page on the site). Defaults to false so a routine ch… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| type_in | array | – | Restrict to these notification types. Omit to get every type. This only filters what's returned here — whether a type is generated at all is controlled separately by the account's own notificationOpt… |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
get_recommendation Get a recommendation by ID ~220
Get a single AniList recommendation pairing (media + the media users recommend alongside it) by its AniList recommendation ID — useful for re-checking one specific pairing's current `rating`/`userRating` (e.g. after voting on it directly on anilist.co — this server has no tool to cast that vote itself) without re-paginating the whole list. Use get_recommendations_for_media instead to discover recommendation IDs for a title in the first place, or to browse/list them. Confirmed live (raw GraphQL, independent of this server): this is an AniList-side inconsistency, not a client bug — a majority of ids from get_recommendations_for_media's own `nodes[].id` 404 here anyway (7 of 10 tested for one title), with no correlation to that pairing's `rating`. A 404 on an id you just got from that tool doesn't mean the pairing doesn't exist, only that this specific lookup can't resolve it.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList recommendation ID. |
| Name | Type | Req | Description |
|---|---|---|---|
| recommendation | object | yes | – |
No examples provided.
get_recommendations_for_media Get recommendations for a title ~300
List anime/manga AniList users recommend as similar to a given title, ranked by rating (highest first). Use search_media first to resolve the title to its AniList ID. Each result's `mediaRecommendation.mediaListEntry` (requires login) shows whether it's already on your own list — set `excludeInList: true` to drop those from the fetched page instead of checking each one yourself (a local post-fetch filter: AniList's own `onList` filter applies to the source title, not the recommended one).
| Name | Type | Req | Description |
|---|---|---|---|
| excludeInList | boolean | – | [Requires login] Omit recommendations already on your own list. Filtered after fetching this page, so a page can come back with fewer than `perPage` results — not an error, just fewer new ones on tha… |
| mediaId | integer | yes | AniList ID of the anime/manga to get recommendations for. |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 25, AniList's own ceiling — it silently clamps anything higher). |
| Name | Type | Req | Description |
|---|---|---|---|
| recommendations | object | yes | – |
No examples provided.
get_site_statistics Get AniList site statistics ~144
Get AniList's own site-wide statistics (new users/anime/manga daily counts), newest first. Useful for questions about AniList's growth/activity, not for anime data. Defaults to the last 7 days; use `page`/`perPage` to go further back. Confirmed live (bypassing this tool's own 25 cap): AniList's SiteStatistics field silently caps `perPage` at 25 itself, so this tool's own limit doesn't lose you anything.
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | Page number for pagination. |
| perPage | integer | – | Results per page/series (max 25, enforced by AniList itself). |
| Name | Type | Req | Description |
|---|---|---|---|
| statistics | object | yes | – |
No examples provided.
get_staff Get staff member details ~457
Get a staff member's profile by AniList staff ID: name, image, occupations, description, and the anime/manga they hold production credits on (`staffMedia`, most popular first, with their `staffRole` — e.g. Director, Character Design, Theme Song Performance — in each). Use search_staff first to resolve a name to its ID. Voice-acting roles are NOT part of `staffMedia` (confirmed live: Kana Hanazawa's lists only her theme/insert song credits) — for a voice actor, pass `credits: "voice"` to get `characterMedia` instead: each title with the character(s) voiced and their `characterRole`. Either list is paginated (`page`/`perPage`, max 25) — check its `pageInfo.hasNextPage` before treating it as the full list. Narrow it with `onList`, or `type` (anime or manga only; production credits only).
| Name | Type | Req | Description |
|---|---|---|---|
| credits | string | – | Which filmography to return: "production" (`staffMedia` — director, writer, theme song, …) or "voice" (`characterMedia` — voice-acting roles). One per call. |
| id | integer | yes | AniList staff ID. |
| onList | boolean | – | [Requires login] Restrict the filmography to (true) or exclude (false) titles already on the authenticated user's own list. Omit to ignore list status entirely. Errors if not logged in (AniList would… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 25, AniList's own ceiling — it silently clamps anything higher). |
| type | string | – | Only return anime (ANIME) or only manga (MANGA) in `staffMedia` — filtered by AniList before pagination, so pages stay full. Omit for both. |
| Name | Type | Req | Description |
|---|---|---|---|
| staff | object | yes | – |
No examples provided.
get_studio Get studio ~452
Get a studio's profile (name, whether it's an animation studio) and the titles it's credited on (`media`, most popular first), by AniList studio ID or by name. `media` is paginated (`page`/`perPage`, max 25) — check `media.pageInfo.hasNextPage` before treating it as the studio's full catalog. By default it mixes titles the studio animated with ones it's only credited on (e.g. as a producer); set `isMain` to split them. Confirmed live: `name` already does AniList's own fuzzy search (same mechanism as search_studio), so a partial name (e.g. "Kyoto Anim") resolves directly — reach for search_studio instead only when you need to browse multiple candidates rather than take the closest match. If both `id` and `name` are given, `id` takes precedence and `name` is ignored.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | – | AniList studio ID. Provide this or `name`. |
| isMain | boolean | – | true: only titles where this was the main animation studio. false: only titles it's credited on without being the main studio (e.g. as a producer). Omit for both. Confirmed live: Aniplex has 1 main-s… |
| name | string | – | Studio name to look up. Provide this or `id`. |
| onList | boolean | – | [Requires login] Restrict the filmography to (true) or exclude (false) titles already on the authenticated user's own list. Omit to ignore list status entirely. Errors if not logged in (AniList would… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 25, AniList's own ceiling — it silently clamps anything higher). |
| Name | Type | Req | Description |
|---|---|---|---|
| studio | object | yes | – |
No examples provided.
get_thread Get a forum thread ~85
Get an AniList forum thread's title, body and metadata (including `replyCount`, `viewCount`, `likeCount`, `isLiked`) by its ID.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList thread ID — use search_thread to find one, or pass one already known (e.g. from an AniList forum URL, anilist.co/forum/thread/<id>). |
| Name | Type | Req | Description |
|---|---|---|---|
| thread | object | yes | – |
No examples provided.
get_thread_comments Get comments on a forum thread ~191
List top-level comments posted on an AniList forum thread, by the thread's ID. Replies (posted via post_thread_comment's `parentCommentId`) are nested under their parent's `childComments` rather than appearing as separate entries in this list.
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| threadId | integer | yes | AniList thread ID — use search_thread to find one, or pass one already known (e.g. from an AniList forum URL, or from get_thread). |
| Name | Type | Req | Description |
|---|---|---|---|
| comments | object | yes | – |
No examples provided.
get_todays_birthdays Get today's birthday characters or staff ~318
List AniList characters or staff members whose birthday (month/day) is today, most favourited first. Paginated — a single day can have well over a thousand entries, so check `hasNextPage` before treating a page as the full list. Returns character-shaped or staff-shaped objects for kind: CHARACTER/STAFF respectively, but a lighter fetch than get_character/get_staff: it does NOT include those tools' `media`/`staffMedia` filmography, nor each entry's bio (`description`) unless you set `includeDescription` — call get_character/get_staff by ID for an entry's full roles/works and bio, don't read a missing filmography here as 'none'.
| Name | Type | Req | Description |
|---|---|---|---|
| includeDescription | boolean | – | Also fetch each result's full bio (`description`). Kept off by default — a bio can run to several thousand characters, and always including it would burn tokens on text you may not need; use get_char… |
| kind | string | yes | Whether to list characters or staff members. |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| Name | Type | Req | Description |
|---|---|---|---|
| hasNextPage | boolean|null | – | – |
| results | array | yes | – |
No examples provided.
get_user_activity Get a user's activity feed ~443
List recent AniList activity posts from a specific user, newest first — by default every activity type (list updates, text posts, and message activity they received). Narrow it server-side with `type` and/or a `createdAfter`/`createdBefore` window rather than paging through everything and discarding. Accepts an exact AniList username directly (it's resolved to an id with one extra internal lookup) — no need to call search_user first unless you only have a partial/fuzzy name. Use search_activity instead to browse without pinning to one user. Use get_user_recent_activity instead if you just want a quick, fixed-size (5-item) recent snapshot without paginating.
| Name | Type | Req | Description |
|---|---|---|---|
| createdAfter | string | – | Only activities created strictly after this moment — an ISO 8601 datetime with a `Z` or ±hh:mm offset (e.g. 2026-01-01T00:00:00Z). AniList stores whole seconds; an activity at exactly this second is… |
| createdBefore | string | – | Only activities created strictly before this moment — same format and exclusive bound as `createdAfter`. A window where createdBefore is not after createdAfter just returns no activities, not an erro… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| type | – | – | Restrict to this activity type, or pass an array to match ANY of several (e.g. ["TEXT", "MESSAGE"]). MEDIA_LIST matches both ANIME_LIST and MANGA_LIST activities; use ANIME_LIST/MANGA_LIST to restric… |
| user | – | yes | AniList user ID, or username. An unknown ID or username errors rather than returning an empty feed. |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
get_user_list Get a user's anime or manga list ~1,268
Get a user's AniList anime or manga list. Returns a compact table of one row per entry by default (`format: "compact"`) — entry id, media id, MAL id, status, score, progress and title, which is what a sync, comparison or pick-something-to-watch task needs; switch to `format: "full"` only when you actually need dates, notes, custom lists, advanced scores or the status/custom-list grouping, since that response is roughly ten times larger per entry. Filter server-side with `statuses` rather than fetching everything and discarding — asking for just CURRENT costs a fraction of a whole-list read. Pass `sort` (e.g. UPDATED_TIME_DESC) to have AniList order the list before chunking, so a small `perChunk` returns the top entries by that key rather than an arbitrary slice. To answer "what did they finish/start in a period", use the `completedAt_*`/`startedAt_*` bounds (strict, server-side) instead of scanning the list — e.g. everything completed in 2026 is `completedAt_greater: {year: 2025, month: 12, day: 31}` plus `completedAt_lesser: {year: 2027}`; chunking then counts only the matching entries. Works for any public/unlisted user. Accepts an exact AniList username directly — no need to call search_user first unless you only have a partial/fuzzy name. Paginated by `chunk`/`perChunk` (AniList's own mechanism for this — counted across entries of ALL statuses combined, not per status), since a large list can otherwise return thousands of entries in one response; check `hasNextChunk` and increment `chunk` to keep paging. `perChunk` itself has no cap — AniList accepts values in the thousands, so raise it to pull a whole list in one call instead of paging through it. The collection AniList exposes here is capped at its ~11,000 most recently updated unique entries — irrelevant for virtually every account, but a hard ceiling if one is ever hit (older entries beyond it aren't retrievable through this field at all, by any chunk).
| Name | Type | Req | Description |
|---|---|---|---|
| chunk | integer | – | Chunk number for pagination (AniList paginates this list by chunk, not page). |
| completedAt_greater | object | – | Only entries completed strictly AFTER this date (AniList filters server-side; the bound date itself is excluded). An omitted month/day counts as 0, so {year: 2026} here means "from 2026-01-01 on". En… |
| completedAt_lesser | object | – | Only entries completed strictly BEFORE this date (AniList filters server-side; the bound date itself is excluded). An omitted month/day counts as 0, so {year: 2026} here means "up to 2025-12-31". Ent… |
| format | string | – | How much of each entry to return. `compact` (default) is a tab-separated table of entry id, media id, MAL id, status, score (0-10), progress and title, one de-duplicated row per entry — enough for sy… |
| perChunk | integer | – | Entries per chunk, counted across all statuses combined. Defaults to 25 so an unattended call stays small, but nothing caps it — pass a larger value (AniList accepts values in the thousands) to pull… |
| sort | array | – | Order AniList applies server-side; later keys break ties in earlier ones (e.g. [SCORE_DESC, UPDATED_TIME_DESC]). Applied to the whole list BEFORE chunking — `chunk` 1 with `perChunk` 10 and UPDATED_T… |
| startedAt_greater | object | – | Only entries started strictly AFTER this date (AniList filters server-side; the bound date itself is excluded). An omitted month/day counts as 0, so {year: 2026} here means "from 2026-01-01 on". Entr… |
| startedAt_lesser | object | – | Only entries started strictly BEFORE this date (AniList filters server-side; the bound date itself is excluded). An omitted month/day counts as 0, so {year: 2026} here means "up to 2025-12-31". Entri… |
| statuses | array | – | Only return entries with these statuses (AniList filters server-side, so this genuinely shrinks the response — prefer it over fetching the whole list and discarding). Omit for every status. Custom-li… |
| type | string | yes | Whether to get the anime or manga list. |
| user | – | yes | AniList user ID (as a number — a digit string is read as a username), or username. |
| Name | Type | Req | Description |
|---|---|---|---|
| columns | string | – | `compact` only: the tab-separated column names for `rows`, in order. |
| count | integer | – | `compact` only: how many unique entries `rows` contains. |
| format | string | yes | Which shape this response is in — echoes the `format` argument. |
| hasNextChunk | boolean|null | – | True if another `chunk` of this list is available. |
| lists | – | – | `full` only: AniList's own status/custom-list groups, with full entries. |
| rows | string | – | `compact` only: one tab-separated row per entry, newline-separated, matching `columns`. An empty cell means AniList has no value for that field (e.g. no MAL id); a score of 0 means unscored. |
No examples provided.
get_user_profile Get a user's profile ~147
Get an AniList user's public profile: name, about text, avatar, donator status — plus their account settings (title/name-language preferences, notification toggles, list display options). Confirmed live these settings are NOT viewer-gated, so they're included for any user, not just the authenticated caller. Accepts an exact AniList username directly — no need to call search_user first unless you only have a partial/fuzzy name and need to look up the exact one. Need statistics too? Use get_full_user_info instead of also calling get_user_stats separately.
| Name | Type | Req | Description |
|---|---|---|---|
| user | – | yes | AniList user ID (as a number — a digit string is read as a username), or username. |
| Name | Type | Req | Description |
|---|---|---|---|
| profile | object | yes | – |
No examples provided.
get_user_recent_activity Get a user's most recent activity ~138
Get an AniList user's 5 most recent activity posts, with full content (not just IDs) — every activity type (list updates, text posts, and message activity they received; the underlying query applies no type filter of its own), a fixed count, not configurable; use get_user_activity for a paginated full feed instead. Accepts an exact AniList username directly — no need to call search_user first unless you only have a partial/fuzzy name (username resolution costs one extra internal lookup either way).
| Name | Type | Req | Description |
|---|---|---|---|
| user | – | yes | AniList user ID, or username. An unknown ID or username errors rather than returning an empty feed. |
| Name | Type | Req | Description |
|---|---|---|---|
| activity | object | yes | – |
No examples provided.
get_user_stats Get a user's statistics ~164
Get an AniList user's anime/manga statistics: counts, mean score, time watched, episodes/chapters/volumes consumed. Accepts an exact AniList username directly — no need to call search_user first unless you only have a partial/fuzzy name. AniList's own stats aggregation can lag behind the account's real list — confirmed live, an account with real scored/progressed entries still read back all-zero statistics — so don't treat a zeroed result as 'this account has no list activity' without cross-checking get_user_list. Need the profile too? Use get_full_user_info instead of also calling get_user_profile separately.
| Name | Type | Req | Description |
|---|---|---|---|
| user | – | yes | AniList user ID (as a number — a digit string is read as a username), or username. |
| Name | Type | Req | Description |
|---|---|---|---|
| stats | object | yes | – |
No examples provided.
login_anilist Log in to AniList ~221
Authorize the personal-list and social tools with your AniList account (one-time). Prerequisite: register an app at anilist.co/settings/developer with Redirect URL set to `http://localhost:8082/callback` (the default; override the port via ANILIST_OAUTH_PORT if 8082 is taken — it must match exactly what you register), and set ANILIST_CLIENT_ID + ANILIST_CLIENT_SECRET in the server env. Calling this returns an authorization URL: open it, log in, and click Approve. If your browser genuinely runs on the same machine as this server, login then completes automatically; otherwise copy the URL you land on and pass it to submit_anilist_redirect. `auto_capture` in the response is NOT a reliable detector of that — it only reflects whether this server process could bind its own localhost listener, which typically succeeds even when the server runs remotely (SSH/headless) and the browser can never reach it; you (or the user) know the actual machine layout, the response doesn't.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| authorize_url | string | yes | The AniList OAuth authorization URL — open it in a browser and click Approve. |
| auto_capture | boolean | yes | Whether this server process could bind a local callback listener — NOT whether the browser opening authorize_url is actually on the same machine. A remote/SSH server can still bind its own loopback p… |
| instructions | string | yes | – |
| redirect_uri | string | yes | The exact localhost callback URI this login attempt used (port from ANILIST_OAUTH_PORT, default 8082) — must exactly match the Redirect URL registered for your AniList app, or the token exchange fail… |
No examples provided.
post_message_activity Post a message activity ~193
[Requires login] Post a new message-style activity to another AniList user's profile, or update an existing one by passing its `id`. Despite the name, this is NOT a private DM — like post_text_activity, it's publicly visible on both users' activity feeds/profiles to anyone who can view them. This is a limitation of this tool, not AniList itself: AniList's underlying mutation does accept a `private` argument, but this tool doesn't expose it, so every message sent through it is public. Don't use it for anything the sender expects to stay confidential.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | – | Activity ID to update instead of creating a new post. |
| message | string | yes | The message text to post (per AniList's own schema: 2-10000 characters). |
| recipientId | integer | yes | AniList numeric user ID of the message recipient (resolve a username via search_user first). |
| Name | Type | Req | Description |
|---|---|---|---|
| activity | object | yes | – |
No examples provided.
post_text_activity Post a text activity ~81
[Requires login] Post a new text-status update to the authenticated user's own AniList profile, or update an existing one by passing its `id`.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | – | Activity ID to update instead of creating a new post. |
| text | string | yes | The text to post (per AniList's own schema: 5-10000 characters). |
| Name | Type | Req | Description |
|---|---|---|---|
| activity | object | yes | – |
No examples provided.
post_thread Post a forum thread ~608
[Requires login] Post a new forum thread to the authenticated user's own AniList account, or update an existing one by passing its `id`. Use search_thread first if you want to check whether a similar thread already exists before posting a new one. Note: this tool's own response doesn't include `categories`/`mediaCategories`/`isSticky`/`isLocked` — call get_thread with the returned `id` afterward to confirm whether a category/sticky/locked change actually applied, especially since sticky/locked can silently no-op and categories/mediaCategories can silently drop existing values (see those fields' own descriptions below).
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | – | Thread body (markdown; per AniList's own schema, up to 30000 characters) — REQUIRED when creating a new thread, optional when updating one via `id` (confirmed live: omitting it on an update leaves th… |
| categories | array | – | Forum category IDs to post this thread under — REQUIRED when creating a new thread (AniList rejects the mutation otherwise), optional when updating one via `id`. When updating and you DO set this, it… |
| id | integer | – | Thread ID to update instead of creating a new one. |
| locked | boolean | – | Lock this thread to prevent further replies (only takes effect if you have moderator permission — confirmed live that a non-mod account's own thread silently stays unlocked). |
| mediaCategories | array | – | AniList anime/manga IDs to tag this thread with, for threads about a specific title (from search_media/get_media). Optional on both create and update. When updating and you DO set this, it's a full r… |
| sticky | boolean | – | Pin this thread (only takes effect if you have moderator permission — confirmed live that a non-mod account's own thread silently stays unpinned). |
| title | string | – | Thread title (per AniList's own schema: 6-120 characters) — REQUIRED when creating a new thread, optional when updating one via `id` (confirmed live: omitting it on an update leaves the existing titl… |
| Name | Type | Req | Description |
|---|---|---|---|
| thread | object | yes | – |
No examples provided.
post_thread_comment Post a comment on a forum thread ~179
[Requires login] Post a new comment on an AniList forum thread from the authenticated user's account, or update an existing one by passing its `id`.
| Name | Type | Req | Description |
|---|---|---|---|
| comment | string | yes | The comment text to post (markdown; per AniList's own schema, up to 12000 characters). |
| id | integer | – | Comment ID to update instead of creating a new one. Not the comment you're replying to — that's `parentCommentId`. |
| parentCommentId | integer | – | Reply to this specific comment instead of posting top-level (from get_thread_comments). The reply then appears nested under that comment's `childComments` in get_thread_comments, not as a new top-lev… |
| threadId | integer | yes | AniList thread ID to comment on (from get_thread/search_thread). |
| Name | Type | Req | Description |
|---|---|---|---|
| comment | object | yes | – |
No examples provided.
remove_list_entry Remove an entry from your AniList list ~87
[Requires login] Delete an entry from the authenticated user's own AniList list by its list-entry ID (NOT the media id) — get it from get_user_list. This cannot be undone, and calling it again on an already-deleted id errors as not found rather than silently succeeding.
| Name | Type | Req | Description |
|---|---|---|---|
| listEntryId | integer | yes | The list ENTRY id to delete (not the media id). |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
search_activity Search activity feed ~505
Search/browse AniList's activity feed (list updates, text posts, messages), optionally filtered to one user or — with `isFollowing` [Requires login] — to your following feed, to one or more activity types, and/or to a creation-time window. Each result already includes its full content (text/message/status, `replyCount`/`likeCount`/`isLiked`, the posting user, and — for list activity — the media) — no follow-up get_activity call needed unless you need to re-check one specific result's `replyCount`/`likeCount`/`isLiked` later (e.g. after liking it).
| Name | Type | Req | Description |
|---|---|---|---|
| createdAfter | string | – | Only activity created strictly after this ISO 8601 datetime with an offset (e.g. "2026-10-01T00:00:00Z"); compared at whole-second precision. |
| createdBefore | string | – | Only activity created strictly before this ISO 8601 datetime. |
| isFollowing | boolean | – | [Requires login] Set true for your following feed: activity from users the logged-in account follows plus its own (AniList's `isFollowing` filter — confirmed live: an account following nobody gets on… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| type | – | – | Restrict to this activity type, or pass an array to match ANY of several (e.g. ["TEXT", "MESSAGE"]). MEDIA_LIST matches both ANIME_LIST and MANGA_LIST activities; use ANIME_LIST/MANGA_LIST to restric… |
| user | – | – | Restrict results to this AniList user — numeric ID or exact username (resolved to an id with one extra internal lookup; no need to call search_user first unless you only have a partial/fuzzy name). A… |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
search_character Search characters ~210
Search AniList for characters by name. Returns AniList IDs to use with get_character. Each result's bio (`description`) is omitted unless you set `includeDescription`.
| Name | Type | Req | Description |
|---|---|---|---|
| includeDescription | boolean | – | Also fetch each result's full bio (`description`). Kept off by default — a bio can run to several thousand characters, and always including it would burn tokens on text you may not need; use get_char… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| term | string | yes | Character name (or part of it) to search for. |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
search_media Search anime/manga ~1,758
Search AniList for anime or manga by title and/or filters (genre, tag, format, status, season/year, country, length — most with an exclusion variant), or browse term-less by ranking (top-rated, most popular, trending — see the `sort` parameter) when you don't have a title to search for. Adult (NSFW) results are included unless you set `sfw: true` (or `isAdult: false`); `isAdult: true` returns adult titles only. Returns AniList IDs to use with get_media and other ID-based tools.
| Name | Type | Req | Description |
|---|---|---|---|
| averageScore_greater | integer | – | Restrict to entries with an average score strictly greater than this (0-100). |
| averageScore_lesser | integer | – | Restrict to entries with an average score strictly less than this (0-100). |
| chapters_greater | integer | – | Manga only: more chapters than this. Same underlying column as `episodes_greater` — with type: ANIME it filters episode count (confirmed live). |
| chapters_lesser | integer | – | Manga only: fewer chapters than this (same column as `episodes_lesser`). |
| countryOfOrigin | string | – | Restrict to this country of origin, as an uppercase ISO 3166-1 alpha-2 code (e.g. "JP", "KR" for manhwa, "CN" for manhua/donghua, "TW"). An unused code matches nothing. |
| duration_greater | integer | – | Anime only: episode length strictly greater than this, in minutes. With type: MANGA AniList silently applies it to volume count instead (shared column, confirmed live). |
| duration_lesser | integer | – | Anime only: episode length strictly less than this, in minutes (see above). |
| endDate_greater | object | – | Restrict to entries whose end date is strictly AFTER this date (the bound date itself is excluded). An omitted month/day counts as 0, so {year: 2020} here means "from 2020-01-01 on". |
| endDate_lesser | object | – | Restrict to entries whose end date is strictly BEFORE this date (the bound date itself is excluded). An omitted month/day counts as 0, so {year: 2020} here means "up to 2019-12-31". |
| episodes_greater | integer | – | Restrict to entries with more episodes/chapters than this. |
| episodes_lesser | integer | – | Restrict to entries with fewer episodes/chapters than this. |
| format_in | array | – | Restrict to these formats. Only formats valid for the `type` you're searching match anything — e.g. NOVEL/ONE_SHOT with type: ANIME, or TV/OVA/ONA with type: MANGA, will just filter out all results,… |
| format_not_in | array | – | Exclude these formats. |
| genre_not_in | array | – | Exclude entries having ANY of these genres. Unlike `genres`, an unrecognized name excludes nothing (no-op, confirmed live). |
| genres | array | – | Restrict to entries matching ALL of these genre names (see get_genres for valid names) — an unrecognized genre name doesn't error, it just filters out all results, same silent-mismatch behavior as `f… |
| includeDescription | boolean | – | Also fetch each result's full synopsis (`description`). Kept off by default — with up to 50 results per call, always including it would burn tokens on text you may not need; use get_media for a singl… |
| isAdult | boolean | – | AniList's own adult-content filter: true returns ONLY adult (18+) entries, false excludes them (same as `sfw: true`). Omit to include both. No login or account setting is needed for adult results. `s… |
| licensedBy_in | array | – | Restrict to entries licensed/streamed by ANY of these sites (names as in get_media's `externalLinks[].site`, e.g. "Crunchyroll", "Netflix"; case-insensitive). An unrecognized site name matches nothin… |
| minimumTagRank | integer | – | Only count a tag in `tag_in`/`tag_not_in` when its relevance rank (0-100, as in get_media's `tags[].rank`) is at least this — e.g. 90 for titles where the tag is central, not incidental. Applies to b… |
| onList | boolean | – | [Requires login] Restrict to (true) or exclude (false) entries already on the authenticated user's own list. Omit to ignore list status entirely. Errors if not logged in (confirmed live: AniList woul… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| popularity_greater | integer | – | Restrict to entries with more list-adds than this. |
| popularity_lesser | integer | – | Restrict to entries with fewer list-adds than this. |
| season | string | – | Restrict to this airing season. Works alone — matches every year's occurrence of that season, NOT just the current year (unlike anilist.co's own season filter UI, which implicitly assumes the current… |
| seasonYear | integer | – | Restrict to this airing/release year (matches any season within it). Works alone or combined with `season` for one specific season+year — neither requires the other. |
| sfw | boolean | – | Set true to exclude adult (isAdult) entries — same as `isAdult: false`. Adult results are NOT filtered by default. |
| sort | array | – | Sort order, most-significant key first (e.g. ["SCORE_DESC"] for highest-rated first, ["POPULARITY_DESC"] for most popular, ["TRENDING_DESC"] for what's hot right now). Defaults to relevance-ranked SE… |
| source_in | array | – | Restrict to entries adapted from these source material types. |
| startDate_greater | object | – | Restrict to entries whose start date is strictly AFTER this date (the bound date itself is excluded). An omitted month/day counts as 0, so {year: 2020} here means "from 2020-01-01 on". |
| startDate_lesser | object | – | Restrict to entries whose start date is strictly BEFORE this date (the bound date itself is excluded). An omitted month/day counts as 0, so {year: 2020} here means "up to 2019-12-31". |
| status_in | array | – | Restrict to these release statuses. |
| status_not_in | array | – | Exclude these release statuses. |
| tag_in | array | – | Restrict to entries matching ALL of these exact tag names (see get_media_tags for valid names — unlike `genres`, tag names are case-sensitive and more specific, e.g. "Time Loop" or "Tragedy"). An unr… |
| tag_not_in | array | – | Exclude entries having ANY of these exact tag names (see `tag_in`). |
| term | string | – | Free-text search term (matches title). Omit to only filter. |
| type | string | yes | Whether to search anime or manga. |
| volumes_greater | integer | – | Manga only: more volumes than this. With type: ANIME AniList silently applies it to episode duration instead (shared column, confirmed live). |
| volumes_lesser | integer | – | Manga only: fewer volumes than this (see above). |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
search_staff Search staff ~212
Search AniList for staff members by name. Returns AniList IDs to use with get_staff. Each result's bio (`description`) is omitted unless you set `includeDescription`.
| Name | Type | Req | Description |
|---|---|---|---|
| includeDescription | boolean | – | Also fetch each result's full bio (`description`). Kept off by default — a bio can run to several thousand characters, and always including it would burn tokens on text you may not need; use get_staf… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| term | string | yes | Staff member name (or part of it) to search for. |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
search_studio Search studios ~182
Search/browse AniList's animation/production studios by name, when you want to see multiple candidates rather than take the closest match — get_studio's own `name` param already does this same fuzzy search directly and resolves a partial name on its own. Returns AniList IDs to use with get_studio.
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| term | string | yes | Studio name (or part of it) to search for. |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
search_thread Search forum threads ~299
Search/browse AniList's forum threads by title/body text and/or restrict to one category. Returns AniList thread IDs (with title/category for context) to use with get_thread, get_thread_comments, post_thread, or post_thread_comment.
| Name | Type | Req | Description |
|---|---|---|---|
| categoryId | integer | – | Restrict to this forum category ID. Not independently listable by any tool — resolve one from a thread you've already read (its `categories` field) or from a forum URL like anilist.co/forum/recent?ca… |
| mediaCategoryId | integer | – | Restrict to threads tagged with this AniList anime/manga ID (from search_media/get_media). A nonexistent ID errors as not found. |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| term | string | – | Free-text search term (matches thread title/body); results are relevance-ranked. Omit to browse, most recently replied-to first. |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
search_user Search users ~225
Search AniList for users by username. Returns AniList user IDs to use with get_user_profile/get_full_user_info (profile), get_user_stats (statistics), get_user_list (their public list), or toggle_follow_user.
| Name | Type | Req | Description |
|---|---|---|---|
| includeDescription | boolean | – | Also fetch each result's full bio (`about`). Kept off by default — a bio can run to several thousand characters, and always including it would burn tokens on text you may not need; use get_user_profi… |
| page | integer | – | Page number for pagination. AniList's paginated connections (search results, a title's characters/staff/reviews, activity feeds, forum comments) reject a page whose page × perPage exceeds ~5000 entri… |
| perPage | integer | – | Results per page (max 50, AniList's own ceiling — it silently clamps anything higher). |
| term | string | yes | Username (or part of it) to search for. |
| Name | Type | Req | Description |
|---|---|---|---|
| results | object | yes | – |
No examples provided.
submit_anilist_redirect Complete AniList login with a pasted redirect URL ~143
Complete a login started with login_anilist by submitting the URL your browser was redirected to after clicking Approve (the one containing ?code=...). Use this when login didn't complete automatically — e.g. the server runs on a remote/headless host. Pass the whole URL, not just the code: its `state` is checked against the login attempt, so a bare code or a URL from another login is rejected. Fails if no login is in progress (e.g. the server restarted since login_anilist) — run login_anilist again.
| Name | Type | Req | Description |
|---|---|---|---|
| redirect_url | string | yes | The full redirected URL (contains ?code=...&state=...). |
| Name | Type | Req | Description |
|---|---|---|---|
| success | boolean | yes | – |
No examples provided.
toggle_favourite Favourite/unfavourite an anime, manga, character, staff member, or studio ~346
[Requires login] Toggle an anime, manga, character, staff member, or studio in the authenticated user's AniList favourites. Calling it again on the same `kind`+`id` un-favourites it. Read `isFavourite` for the outcome: true = now favourited, false = now removed, null = can't tell (the list runs past the first 50 returned, and a newly added favourite goes to its end). `favourites` holds the first page (up to 50, id-only) of the toggled kind, under its key (anime/manga/characters/staff/studios). Resolve `id` first via search_media/get_media (kind: ANIME/MANGA), search_character/get_character, search_staff/get_staff, or search_studio/get_studio, matching `kind`. Confirmed live: AniList does NOT validate that `id` actually belongs to the given `kind` — e.g. passing an anime's ID with `kind: CHARACTER` succeeds silently instead of erroring, favouriting a nonexistent character. Always resolve `id` from the tool matching `kind` rather than reusing an ID you already have on hand. Note: immediately re-checking with get_media/get_character/get_staff/get_studio's own `isFavourite` can briefly still show the pre-toggle value — a confirmed AniList-side read-after-write lag, not a bug in this call; this tool's own `isFavourite` already reflects the new state.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList ID of that anime/manga/character/staff/studio. |
| kind | string | yes | Which kind of entity `id` refers to. |
| Name | Type | Req | Description |
|---|---|---|---|
| favourites | object | yes | – |
| isFavourite | boolean|null | yes | true: now a favourite; false: no longer one; null: undetermined (the toggled id isn't in the first 50 returned and the list continues). |
No examples provided.
toggle_follow_user Follow/unfollow a user ~70
[Requires login] Toggle following another AniList user from the authenticated user's account. Calling it again on the same user unfollows them.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | AniList numeric user ID to follow/unfollow — this mutation has no username form; resolve one via search_user or get_user_profile first. |
| Name | Type | Req | Description |
|---|---|---|---|
| user | object | yes | – |
No examples provided.
update_list_entries Update many entries on your AniList list at once ~504
[Requires login] Apply ONE set of values to many entries on the authenticated user's own AniList list in a single request — e.g. mark thirty titles COMPLETED, or set the same score on a batch. Use this instead of calling update_list_entry in a loop whenever the entries share the values you're writing; use update_list_entry when each entry needs DIFFERENT values (this tool cannot vary them per entry), or when you need to set `customLists`/`advancedScores`, which this tool deliberately doesn't accept. Takes list-ENTRY ids (not media ids) — get them from get_user_list. The whole call is all-or-nothing: if any id is unknown or isn't yours, AniList rejects the request and applies NOTHING, so there is never a half-applied batch to clean up — but the error does not say which id was at fault, so re-check the ids against get_user_list. Returns a summary (how many were updated, and their ids), not the full entries.
| Name | Type | Req | Description |
|---|---|---|---|
| completedAt | object | – | New completion date for every listed entry. |
| hiddenFromStatusLists | boolean | – | Hide/unhide every listed entry from the public status-grouped list views. |
| listEntryIds | array | yes | The list ENTRY ids to update (not media ids), from get_user_list. Every id must exist and belong to you — one bad id fails the entire call without changing anything. |
| notes | string | – | New free-text notes, written to every listed entry (per AniList's own schema, capped at 6000 characters). |
| priority | integer | – | New list priority (higher = more important; per AniList's own schema, capped at 255). |
| private | boolean | – | Hide/unhide every listed entry. |
| progress | integer | – | New episodes watched / chapters read, applied to every listed entry — only meaningful when they genuinely share a progress value. |
| progressVolumes | integer | – | New volumes read (manga only). |
| repeat | integer | – | New rewatch/reread count (per AniList's own schema, capped at 1000). |
| score | number | – | New score out of 10 (decimals allowed), applied to every listed entry. Always on this scale regardless of the account's configured scoreFormat. |
| startedAt | object | – | New start date for every listed entry. |
| status | string | – | New list status, applied to every listed entry. |
| Name | Type | Req | Description |
|---|---|---|---|
| listEntryIds | array | yes | The list-entry ids AniList reported as updated. |
| updated | integer | yes | How many entries AniList reported as updated. |
No examples provided.
How do I install the AniList MCP Server (Unofficial) server?
AniList MCP Server (Unofficial) ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 6cc99cb83fec9c311f1f7cad1e731a13b1b1accc81eb3430e571cc453f5dd7bb; the commands to do that are on this page. If it does not match, do not open it.
mcpb · anilist-mcp-server.mcpb
Download bundleCheck the download matches the SHA-256 the MCP registry declares before you open it. If it does not match, do not open the file.
SHA-256
6cc99cb83fec9c311f1f7cad1e731a13b1b1accc81eb3430e571cc453f5dd7bb
macOS / Linux
echo "6cc99cb83fec9c311f1f7cad1e731a13b1b1accc81eb3430e571cc453f5dd7bb anilist-mcp-server.mcpb" | shasum -a 256 -c
Windows (PowerShell)
(Get-FileHash -Algorithm SHA256 .\anilist-mcp-server.mcpb).Hash -eq "6cc99cb83fec9c311f1f7cad1e731a13b1b1accc81eb3430e571cc453f5dd7bb"
Run it in the folder you saved the bundle to, then open the file with an MCPB-capable host such as Claude Desktop.
What is the AniList MCP Server (Unofficial) server?
AniList MCP Server (Unofficial) is listed in the public MCP registry as io.github.Grinv/anilist-mcp-server. MCP server for the AniList GraphQL API, anime/manga search, details, and personal list management. This page covers its MCPB bundle (https://github.com/Grinv/anilist-mcp-server/releases/download/v0.11.0/anilist-mcp-server.mcpb).
Is the AniList MCP Server (Unofficial) server safe to use?
AniList MCP Server (Unofficial) scores 63 out of 100 on VerifyMCP. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the AniList MCP Server (Unofficial) server expose?
AniList MCP Server (Unofficial) exposes 50 tools: get_genres, get_media_tags, get_site_statistics, get_studio, get_activity, and 45 more. Their descriptions and schemas cost roughly 16,427 tokens of context every time the server is loaded.
What licence is the AniList MCP Server (Unofficial) server under?
AniList MCP Server (Unofficial) declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.