# AniList MCP Server (npm · anilist-mcp-server)

MCP server for the AniList GraphQL API — anime/manga search, details, and personal list management.

- Trust score: 83/100 (high trust)
- Change this week: +42
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- mcpb · `anilist-mcp-server.mcpb`: 47/100, [markdown](https://verifymcp.io/servers/grinv-anilist-mcp-server/https-github-com-grinv-anilist-mcp-server-releases-download-v0-7-1-anilist-mcp-s.md), [page](https://verifymcp.io/servers/grinv-anilist-mcp-server/https-github-com-grinv-anilist-mcp-server-releases-download-v0-7-1-anilist-mcp-s)
- npm · `anilist-mcp-server`: 83/100 (this document), [markdown](https://verifymcp.io/servers/grinv-anilist-mcp-server/anilist-mcp-server.md), [page](https://verifymcp.io/servers/grinv-anilist-mcp-server/anilist-mcp-server)

## Channel facts

- Registry: `npm`
- Package: `anilist-mcp-server`
- Version: `0.7.1`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 0 of 3 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to Grinv/anilist-mcp-server).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 75/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 11453 tokens (~233/item across 49 items; 49 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### Claude

```bash
claude mcp add grinv-anilist-mcp-server -- npx -y anilist-mcp-server
```

### Codex

```bash
codex mcp add grinv-anilist-mcp-server -- npx -y anilist-mcp-server
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "grinv-anilist-mcp-server": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "anilist-mcp-server"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add grinv-anilist-mcp-server --command npx --arg -y --arg anilist-mcp-server
```

### Hermes

```yaml
mcp_servers:
  grinv-anilist-mcp-server:
    command: "npx"
    args: ["-y", "anilist-mcp-server"]
```

### Other

```json
{
  "mcpServers": {
    "grinv-anilist-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "anilist-mcp-server"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-02 (score 82, +21)

- [security improvement] Malware scan: unverified → pass
- [functional improvement] Schema quality: unverified → excellent

### 2026-08-01 (score 61, +27)

- [functional regression] Schema quality: 177 → 233
- [functional regression] Schema quality: excellent → unverified
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Stability: unverified → 0.17
- [functional improvement] MCP protocol: unverified → pass

### 2026-07-31 (score 34, −7)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 41, 0)

- [functional] Package version: 0.4.0 → 0.7.0

### 2026-07-29 (score 41, −35)

- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional] Package version: 0.4.0 → 0.5.0

### 2026-07-28 (score 76, +35)

- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Tool coverage: 100
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Schema quality: fail

### 2026-07-27 (score 41, 0)

- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100
- [functional] Package version: 0.3.0 → 0.4.0

## MCP tools (49)

### `get_genres` (~52 tokens)

Get genres

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.

Output parameters:

- `genres` (array)

### `get_media_tags` (~208 tokens)

Get media tags

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).

Input parameters:

- `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).

Output parameters:

- `pageInfo` (object)
- `tags` (array)

### `get_site_statistics` (~144 tokens)

Get AniList site statistics

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.

Input parameters:

- `page` (integer): Page number for pagination.
- `perPage` (integer): Results per page/series (max 25, enforced by AniList itself).

Output parameters:

- `statistics` (object)

### `get_studio` (~181 tokens)

Get studio

Get a studio's profile (name, whether it's an animation studio) and its top 10 most popular produced titles (a fixed cap, not paginated — AniList's studio field exposes no more via this lookup), by AniList studio ID or by name. 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.

Input parameters:

- `id` (integer): AniList studio ID. Provide this or `name`.
- `name` (string): Studio name to look up. Provide this or `id`.

Output parameters:

- `studio` (object)

### `get_activity` (~79 tokens)

Get an activity post

Get a single AniList activity post (list update, text post, or message) by its ID, including `replyCount`, `likeCount`, and `isLiked`.

Input parameters:

- `id` (integer, required): AniList activity ID — from get_user_activity, get_user_recent_activity, search_activity, or the id returned by post_text_activity/post_message_activity.

Output parameters:

- `activity`

### `get_user_activity` (~268 tokens)

Get a user's activity feed

List recent AniList activity posts from a specific user — every activity type (list updates, text posts, and message activity they received), the underlying query applies no type filter of its own. 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 if you want to restrict to one activity type (TEXT/ANIME_LIST/MANGA_LIST/MEDIA_LIST/MESSAGE) or 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.

Input parameters:

- `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).
- `user` (required): AniList user ID, or username. Unlike search_activity's own `user` filter, both an unknown numeric ID and an unknown username error here rather than silently returning an empty feed.

Output parameters:

- `results` (object)

### `post_text_activity` (~81 tokens)

Post a text activity

[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`.

Input parameters:

- `id` (integer): Activity ID to update instead of creating a new post.
- `text` (string, required): The text to post (per AniList's own schema: 5-10000 characters).

Output parameters:

- `activity` (object)

### `post_message_activity` (~193 tokens)

Post a message activity

[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.

Input parameters:

- `id` (integer): Activity ID to update instead of creating a new post.
- `message` (string, required): The message text to post (per AniList's own schema: 2-10000 characters).
- `recipientId` (integer, required): AniList numeric user ID of the message recipient (resolve a username via search_user first).

Output parameters:

- `activity` (object)

### `delete_activity` (~83 tokens)

Delete an activity post

[Requires login] Delete an activity post the authenticated user owns. This cannot be undone, and calling it again on an already-deleted id errors rather than silently succeeding.

Input parameters:

- `id` (integer, required): 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.

Output parameters:

- `result` (object)

### `get_user_list` (~254 tokens)

Get a user's anime or manga list

Get a user's AniList anime or manga list, grouped by status/custom list, with each entry's status, score, progress and dates. 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. AniList itself caps this at the ~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).

Input parameters:

- `chunk` (integer): Chunk number for pagination (AniList paginates this list by chunk, not page).
- `perChunk` (integer): Entries per chunk, counted across all statuses combined (max 25).
- `type` (string, required): Whether to get the anime or manga list.
- `user` (required): AniList user ID, or username.

Output parameters:

- `hasNextChunk`
- `lists`

### `add_list_entry` (~782 tokens)

Add an entry to your AniList list

[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.

Input parameters:

- `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, required): 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,…

Output parameters:

- `entry` (object)

### `update_list_entry` (~590 tokens)

Update an entry on your AniList list

[Requires login] Update an existing entry on the authenticated user's own AniList list by its list-entry ID (NOT the media ID — get it from get_user_list, or from add_list_entry's response). Only set the fields you want to change.

Input parameters:

- `advancedScores` (object): New per-category scores, keyed and error-checked the same way as add_list_entry (errors if advanced scoring is disabled, or a key doesn't match a configured category). Unlike this tool's other fields…
- `completedAt` (object): New completion date.
- `customLists` (array): New set of custom lists for this entry — 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 under (c…
- `hiddenFromStatusLists` (boolean): Hide/unhide 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.
- `listEntryId` (integer, required): The list ENTRY id to update (not the media id).
- `notes` (string): New free-text notes (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 this entry from your public list.
- `progress` (integer): New episodes watched / chapters read.
- `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), always on this scale regardless of the account's configured scoreFormat (set via update_user) — no conversion needed.
- `startedAt` (object): New start date.
- `status` (string): New list status.

Output parameters:

- `entry` (object)

### `remove_list_entry` (~84 tokens)

Remove an entry from your AniList list

[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 rather than silently succeeding.

Input parameters:

- `listEntryId` (integer, required): The list ENTRY id to delete (not the media id).

Output parameters:

- `result` (object)

### `get_media` (~340 tokens)

Get anime/manga details

Get detailed information about one or more anime or manga by their AniList ID(s): 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. Use search_media first to resolve a title to its AniList ID. Returns a single object if `ids` is a single ID, or an array (same order as `ids`, with `null` in place of any ID that didn't resolve to a real anime/manga) if `ids` is an array.

Input parameters:

- `ids` (required): A single AniList anime/manga ID, or an array of up to 25 IDs to fetch in one call (same cap as this codebase's paginated list tools — each entry returned here includes the full synopsis/tags/rankings…
- `includeStreamingEpisodes` (boolean): Also fetch `streamingEpisodes` (per-episode streaming links). Kept off by default — AniList doesn't paginate this field, so a long-running title can return hundreds of entries.
- `type` (string, required): Whether `ids` refers to anime or manga.

Output parameters:

- `media`

### `get_media_statistics` (~78 tokens)

Get an anime/manga's score/status distribution

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.

Input parameters:

- `id` (integer, required): AniList ID.
- `type` (string, required): Whether `id` refers to anime or manga.

Output parameters:

- `statistics` (object)

### `get_media_characters` (~206 tokens)

Get an anime/manga's characters

List an anime/manga's characters with their role (Main/Supporting/Background) and, for anime, Japanese voice actors. Use search_media first to resolve a title to its AniList ID. No explicit ordering is requested — don't assume results are grouped by role or sorted by popularity (unlike get_character/get_staff's reverse-direction lookup, which IS popularity-sorted); confirmed live, a Main-role character can appear well after several Supporting ones.

Input parameters:

- `id` (integer, required): 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).
- `type` (string, required): Whether `id` refers to anime or manga.

Output parameters:

- `characters` (object)

### `get_media_staff` (~185 tokens)

Get an anime/manga's production staff

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).

Input parameters:

- `id` (integer, required): 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).
- `type` (string, required): Whether `id` refers to anime or manga.

Output parameters:

- `staff` (object)

### `get_media_reviews` (~230 tokens)

Get an anime/manga's reviews

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.

Input parameters:

- `id` (integer, required): 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).
- `type` (string, required): Whether `id` refers to anime or manga.

Output parameters:

- `reviews` (object)

### `get_media_relations` (~84 tokens)

Get a title's related media

Get the anime/manga related to a given title (prequels, sequels, side stories, adaptations, spin-offs) with the relation type. Use search_media first to resolve a title to its AniList ID.

Input parameters:

- `id` (integer, required): AniList anime/manga ID.
- `type` (string, required): Whether `id` refers to anime or manga.

Output parameters:

- `relations` (object)

### `get_anime_schedule` (~262 tokens)

Get the anime airing schedule

Get upcoming (or a specific title's) episode air times, soonest-airing first (confirmed live). 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. 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.

Input parameters:

- `mediaId` (integer): Restrict to this AniList anime ID (not manga).
- `notYetAired` (boolean): Set false to instead list only already-aired episodes (confirmed live: this swaps to a past-only result set, it doesn't add past episodes to the still-upcoming ones).
- `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).

Output parameters:

- `hasNextPage`
- `schedule` (array)

### `toggle_favourite` (~314 tokens)

Favourite/unfavourite an anime, manga, character, staff member, or studio

[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. The response is not scoped to just the toggled item: it returns the account's entire current favourites (id-only) across all 5 categories (anime/manga/characters/staff/studios), so expect a wide result even for a single toggle. 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 response already reflects the new favourites list correctly.

Input parameters:

- `id` (integer, required): AniList ID of that anime/manga/character/staff/studio.
- `kind` (string, required): Which kind of entity `id` refers to.

Output parameters:

- `favourites` (object)

### `get_character` (~84 tokens)

Get character details

Get a character's profile by AniList character ID: name, image, description, and the anime/manga they appear in (`media`, up to 25 by popularity, with their `characterRole` — MAIN/SUPPORTING/BACKGROUND — in each). Use search_character first to resolve a name to its ID.

Input parameters:

- `id` (integer, required): AniList character ID.

Output parameters:

- `character` (object)

### `get_staff` (~88 tokens)

Get staff member details

Get a staff member's profile by AniList staff ID: name, image, occupations, description, and the anime/manga they worked on (`staffMedia`, up to 25 by popularity, with their `staffRole` — e.g. Director, Character Design — in each). Use search_staff first to resolve a name to its ID.

Input parameters:

- `id` (integer, required): AniList staff ID.

Output parameters:

- `staff` (object)

### `get_todays_birthdays` (~139 tokens)

Get today's birthday characters or staff

List AniList characters or staff members whose birthday (month/day) is today, up to 50 results (a fixed cap, not paginated — entries beyond 50 are silently omitted, not an error). 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 — call get_character/get_staff by ID for an entry's full roles/works, don't read a missing filmography here as 'none'.

Input parameters:

- `kind` (string, required): Whether to list characters or staff members.

Output parameters:

- `results` (array)

### `get_recommendation` (~220 tokens)

Get a recommendation by ID

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.

Input parameters:

- `id` (integer, required): AniList recommendation ID.

Output parameters:

- `recommendation` (object)

### `get_recommendations_for_media` (~267 tokens)

Get recommendations for a title

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 filter those out server-side instead of checking each one yourself.

Input parameters:

- `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, required): 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).

Output parameters:

- `recommendations` (object)

### `search_media` (~1062 tokens)

Search anime/manga

Search AniList for anime or manga by title and/or filters (genre, format, status, season/year), 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` — see the `sfw` parameter. Returns AniList IDs to use with get_media and other ID-based tools.

Input parameters:

- `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).
- `endDate_greater` (object): Restrict to entries whose end date is on or after this date.
- `endDate_lesser` (object): Restrict to entries whose end date is on or before this date.
- `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,…
- `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 25 results per call, always including it would burn tokens on text you may not need; use get_media for a singl…
- `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. Confirmed live: silently no-ops (identical results fo…
- `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).
- `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. 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 on or after this date.
- `startDate_lesser` (object): Restrict to entries whose start date is on or before this date.
- `status_in` (array): Restrict to 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…
- `term` (string): Free-text search term (matches title). Omit to only filter.
- `type` (string, required): Whether to search anime or manga.

Output parameters:

- `results` (object)

### `search_character` (~124 tokens)

Search characters

Search AniList for characters by name. Returns AniList IDs to use with get_character.

Input parameters:

- `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).
- `term` (string, required): Character name (or part of it) to search for.

Output parameters:

- `results` (object)

### `search_staff` (~126 tokens)

Search staff

Search AniList for staff members by name. Returns AniList IDs to use with get_staff.

Input parameters:

- `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).
- `term` (string, required): Staff member name (or part of it) to search for.

Output parameters:

- `results` (object)

### `search_studio` (~170 tokens)

Search studios

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.

Input parameters:

- `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).
- `term` (string, required): Studio name (or part of it) to search for.

Output parameters:

- `results` (object)

### `search_user` (~150 tokens)

Search users

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.

Input parameters:

- `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).
- `term` (string, required): Username (or part of it) to search for.

Output parameters:

- `results` (object)

### `search_thread` (~308 tokens)

Search forum threads

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.

Input parameters:

- `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). Not existence-checked: a nonexistent media ID doesn't error, it silently filters to an empty result — resolv…
- `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).
- `term` (string): Free-text search term (matches thread title/body). Omit to just filter/browse.

Output parameters:

- `results` (object)

### `search_activity` (~362 tokens)

Search activity feed

Search/browse AniList's activity feed (list updates, text posts, messages), optionally filtered to one user and/or one activity type. 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).

Input parameters:

- `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).
- `type` (string): Restrict to this activity type. MEDIA_LIST matches both ANIME_LIST and MANGA_LIST activities; use ANIME_LIST/MANGA_LIST to restrict to just one.
- `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). V…

Output parameters:

- `results` (object)

### `get_thread` (~85 tokens)

Get a forum thread

Get an AniList forum thread's title, body and metadata (including `replyCount`, `viewCount`, `likeCount`, `isLiked`) by its ID.

Input parameters:

- `id` (integer, required): 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>).

Output parameters:

- `thread` (object)

### `get_thread_comments` (~179 tokens)

Get comments on a forum thread

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.

Input parameters:

- `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).
- `threadId` (integer, required): 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).

Output parameters:

- `comments` (object)

### `post_thread` (~608 tokens)

Post a forum thread

[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).

Input parameters:

- `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…

Output parameters:

- `thread` (object)

### `post_thread_comment` (~179 tokens)

Post a comment on a forum thread

[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`.

Input parameters:

- `comment` (string, required): 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, required): AniList thread ID to comment on (from get_thread/search_thread).

Output parameters:

- `comment` (object)

### `delete_thread` (~74 tokens)

Delete a forum thread

[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 rather than silently succeeding.

Input parameters:

- `id` (integer, required): AniList thread ID to delete.

Output parameters:

- `result` (object)

### `delete_thread_comment` (~72 tokens)

Delete a comment on a forum thread

[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 rather than silently succeeding.

Input parameters:

- `id` (integer, required): AniList comment ID to delete.

Output parameters:

- `result` (object)

### `get_user_profile` (~134 tokens)

Get a user's profile

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.

Input parameters:

- `user` (required): AniList user ID, or username.

Output parameters:

- `profile` (object)

### `get_user_stats` (~151 tokens)

Get a user's statistics

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.

Input parameters:

- `user` (required): AniList user ID, or username.

Output parameters:

- `stats` (object)

### `get_full_user_info` (~146 tokens)

Get a user's complete profile and stats

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.

Input parameters:

- `user` (required): AniList user ID, or username.

Output parameters:

- `user` (object)

### `get_user_recent_activity` (~154 tokens)

Get a user's most recent activity

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).

Input parameters:

- `user` (required): AniList user ID, or username. Unlike search_activity's own `user` filter, both an unknown numeric ID and an unknown username error here rather than silently returning an empty feed.

Output parameters:

- `activity` (object)

### `get_authorized_user` (~187 tokens)

Get the logged-in user's profile

[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.

Output parameters:

- `user` (object)

### `toggle_follow_user` (~70 tokens)

Follow/unfollow a user

[Requires login] Toggle following another AniList user from the authenticated user's account. Calling it again on the same user unfollows them.

Input parameters:

- `id` (integer, required): AniList numeric user ID to follow/unfollow — this mutation has no username form; resolve one via search_user or get_user_profile first.

Output parameters:

- `user` (object)

### `update_user` (~857 tokens)

Update your AniList account settings

[Requires login] Update settings on the authenticated user's own AniList account (about text, preferred title language, adult-content visibility, score format, notification/messaging preferences, anime/manga list options). Only set the fields you want to change — most fields are a true partial update (see `notificationOptions`/`disabledListActivity` below for two confirmed exceptions, PLUS `animeListOptions`/`mangaListOptions`'s nested `customLists` — a third: that one field's ARRAY VALUE is a full replace even though its sibling fields and the other list type merge normally).

Input parameters:

- `about` (string): New profile 'about' text.
- `activityMergeTime` (integer): Minutes within which consecutive list activity posts get merged into one. Per AniList's own schema: 0 = never merge, 20160+ (2 weeks) = always merge.
- `airingNotifications` (boolean): Whether to notify about new episode airings for anime on your list.
- `animeListOptions` (object): New anime-list display/scoring options — only the fields you set are changed (confirmed live: this is a partial merge, unlike add_list_entry's advancedScores).
- `disabledListActivity` (array): ALL 6 list statuses, every time — confirmed live: AniList rejects this with a 400 error if any status is missing ("Incorrect number of disabled list activity options"), it's not a partial per-status…
- `displayAdultContent` (boolean): Whether to show adult content in search/browse.
- `donatorBadge` (string): Custom donator badge text, up to 24 characters per AniList's own schema (only takes effect on a donator account).
- `mangaListOptions` (object): New manga-list display/scoring options — same partial-merge behavior as `animeListOptions` above.
- `notificationOptions` (array): ALL 20 notification types, every time — confirmed live this is a full replace, not a partial merge: AniList silently drops every type you don't list (not just resets it to default, removes it) with n…
- `profileColor` (string): Profile accent color (name or hex). Confirmed live: AniList silently ignores an unrecognized value instead of erroring — the account's existing color is left unchanged, with no error surfaced and no…
- `restrictMessagesToFollowing` (boolean): Only allow message activity from users you follow.
- `rowOrder` (string): Internal list-table row ordering key — reads back from `mediaListOptions.rowOrder` in the profile tools/this tool's own response. Confirmed live: AniList validates this server-side and rejects an unr…
- `scoreFormat` (string): Preferred list score format (affects how scores DISPLAY on anilist.co only — add_list_entry/update_list_entry's `score` parameter always stays on a 0-10 scale regardless of this setting, so no conver…
- `staffNameLanguage` (string): Preferred staff/character name display language.
- `timezone` (string): Display timezone as an offset, in AniList's own documented "-?HH:MM" format (e.g. "09:00", "-05:00"). Confirmed live that AniList validates this server-side and rejects a malformed value with a clear…
- `titleLanguage` (string): Preferred title display language.

Output parameters:

- `user` (object)

### `get_notifications` (~329 tokens)

Get your AniList notifications

[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`).

Input parameters:

- `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 25).
- `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…

Output parameters:

- `results` (object)

### `login_anilist` (~221 tokens)

Log in to AniList

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.

Output parameters:

- `authorize_url` (string): The AniList OAuth authorization URL — open it in a browser and click Approve.
- `auto_capture` (boolean): 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)
- `redirect_uri` (string): 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…

### `submit_anilist_redirect` (~91 tokens)

Complete AniList login with a pasted redirect URL

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. A bare code string is also accepted.

Input parameters:

- `redirect_url` (string, required): The full redirected URL (contains ?code=...), or just the code value.

Output parameters:

- `success` (boolean)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/grinv-anilist-mcp-server/anilist-mcp-server#diagnostics

## Score history

- 2026-08-03: 83
- 2026-08-02: 82
- 2026-08-01: 61
- 2026-07-31: 34
- 2026-07-30: 41
- 2026-07-29: 41
- 2026-07-28: 76
- 2026-07-27: 41
- 2026-07-26: 41

## Links

- npm package: https://www.npmjs.com/package/anilist-mcp-server
- Socket report: https://socket.dev/npm/package/anilist-mcp-server
- Repository: https://github.com/Grinv/anilist-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/grinv-anilist-mcp-server/anilist-mcp-server/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/grinv-anilist-mcp-server/anilist-mcp-server/changelog.json
- HTML version of this page: https://verifymcp.io/servers/grinv-anilist-mcp-server/anilist-mcp-server
