{"name":"io.github.Grinv/anilist-mcp-server","slug":"grinv-anilist-mcp-server","title":"AniList MCP Server (Unofficial)","description":"MCP server for the AniList GraphQL API — anime/manga search, details, and personal list management.","url":"https://mcp.market/server/grinv-anilist-mcp-server","rating":null,"grade":"B","score":75,"certified":false,"status":"active","category":"search","tags":["search"],"presence":{"score":29,"stars":1,"forks":1,"downloads_week":197,"last_push_at":"2026-10-22T09:24:35.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"mixed","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Grinv/anilist-mcp-server","website":null,"version":"0.11.0","remotes":[],"packages":[{"registryType":"npm","identifier":"anilist-mcp-server","version":"0.11.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Optional. From an app registered at anilist.co/settings/developer — needed to use login_anilist.","name":"ANILIST_CLIENT_ID"},{"description":"Optional. Paired with the Client ID above — needed to use login_anilist.","isSecret":true,"name":"ANILIST_CLIENT_SECRET"},{"description":"Optional. A pre-obtained AniList access token, as an alternative to running login_anilist.","isSecret":true,"name":"ANILIST_ACCESS_TOKEN"},{"description":"Optional. Localhost port for the login_anilist callback (default 8082).","name":"ANILIST_OAUTH_PORT"},{"description":"Optional. Overrides where the AniList access token is persisted (defaults under the OS config dir).","name":"ANILIST_TOKEN_STORE"}]},{"registryType":"mcpb","identifier":"https://github.com/Grinv/anilist-mcp-server/releases/download/v0.11.0/anilist-mcp-server.mcpb","version":"0.11.0","fileSha256":"6cc99cb83fec9c311f1f7cad1e731a13b1b1accc81eb3430e571cc453f5dd7bb","transport":{"type":"stdio"},"environmentVariables":[{"description":"Optional. From an app registered at anilist.co/settings/developer — needed to use login_anilist.","name":"ANILIST_CLIENT_ID"},{"description":"Optional. Paired with the Client ID above — needed to use login_anilist.","isSecret":true,"name":"ANILIST_CLIENT_SECRET"},{"description":"Optional. A pre-obtained AniList access token, as an alternative to running login_anilist.","isSecret":true,"name":"ANILIST_ACCESS_TOKEN"},{"description":"Optional. Localhost port for the login_anilist callback (default 8082).","name":"ANILIST_OAUTH_PORT"},{"description":"Optional. Overrides where the AniList access token is persisted (defaults under the OS config dir).","name":"ANILIST_TOKEN_STORE"}]}],"tools":[{"name":"add_list_entry","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"delete_activity","description":"[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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_thread","description":"[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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_thread_comment","description":"[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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_activity","description":"Get a single AniList activity post (list update, text post, or message) by its ID, including `replyCount`, `likeCount`, and `isLiked`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_anime_schedule","description":"Get upcoming (or a specific title's) episode air times, soonest-airing first (confirmed live) \\u2014 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 ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_authorized_user","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_character","description":"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` \\u2014 MAIN/SUPPORTING/BACKGROUND \\u2014 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 p","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_full_user_info","description":"Get an AniList user's profile AND statistics in a single call \\u2014 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 \\u2014 AniList doesn't viewer-gate those fields. Accepts an exact AniList username directly \\u2014 no need to call","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_genres","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_media","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_media_characters","description":"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 \\u2014 MAIN first, then SUPPORTING, then BACKGROUND (confirmed live) \\u2014 and in AniList's own relevance order within each. Voice actors come back in every dub language unless you set `voiceActorLanguage`; s","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_media_relations","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_media_reviews","description":"List user-written reviews for an anime or manga, most-helpful-voted first (confirmed live: ordered by `rating`, not `score` \\u2014 see those fields' own descriptions). Always includes `summary` (a short excerpt); set `includeBody` to also fetch each review's full text (can be long \\u2014 leave it off unless you actually need the full text). Use search_media first to resolve a title to its AniList ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_media_staff","description":"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 \\u2014 don't assume results are sorted by role or popularity (unlike get_staff's reverse-direction lookup, which IS popularity-sorted).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_media_statistics","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_media_tags","description":"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 \\u2014 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` \\u2014 tag names are","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_notifications","description":"[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 inclu","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_recommendation","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_recommendations_for_media","description":"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 \\u2014 set `excludeInList: true` to drop those from the fetched page instead of checking each one yourself (a local post-","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_site_statistics","description":"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 any","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_staff","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_studio","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_thread","description":"Get an AniList forum thread's title, body and metadata (including `replyCount`, `viewCount`, `likeCount`, `isLiked`) by its ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_thread_comments","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_todays_birthdays","description":"List AniList characters or staff members whose birthday (month/day) is today, most favourited first. Paginated \\u2014 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 t","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user_activity","description":"List recent AniList activity posts from a specific user, newest first \\u2014 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 lo","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user_list","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user_profile","description":"Get an AniList user's public profile: name, about text, avatar, donator status \\u2014 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 \\u2014 no need to call search_user first un","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user_recent_activity","description":"Get an AniList user's 5 most recent activity posts, with full content (not just IDs) \\u2014 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 \\u2014 no need to call search_user ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user_stats","description":"Get an AniList user's anime/manga statistics: counts, mean score, time watched, episodes/chapters/volumes consumed. Accepts an exact AniList username directly \\u2014 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 \\u2014 confirmed live, an account with real scored/progressed entries still read back ","write_action":false,"price_micros":0,"input_schema":null},{"name":"login_anilist","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"post_message_activity","description":"[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 \\u2014 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 `pr","write_action":true,"price_micros":0,"input_schema":null},{"name":"post_text_activity","description":"[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`.","write_action":true,"price_micros":0,"input_schema":null},{"name":"post_thread","description":"[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` \\u2014 call get_thread with the returned `id` afterw","write_action":true,"price_micros":0,"input_schema":null},{"name":"post_thread_comment","description":"[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`.","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_list_entry","description":"[Requires login] Delete an entry from the authenticated user's own AniList list by its list-entry ID (NOT the media id) \\u2014 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_activity","description":"Search/browse AniList's activity feed (list updates, text posts, messages), optionally filtered to one user or \\u2014 with `isFollowing` [Requires login] \\u2014 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 \\u2014 for list activity","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_character","description":"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`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_media","description":"Search AniList for anime or manga by title and/or filters (genre, tag, format, status, season/year, country, length \\u2014 most with an exclusion variant), or browse term-less by ranking (top-rated, most popular, trending \\u2014 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` re","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_staff","description":"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`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_studio","description":"Search/browse AniList's animation/production studios by name, when you want to see multiple candidates rather than take the closest match \\u2014 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_thread","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_user","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"submit_anilist_redirect","description":"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 \\u2014 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","write_action":true,"price_micros":0,"input_schema":null},{"name":"toggle_favourite","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"toggle_follow_user","description":"[Requires login] Toggle following another AniList user from the authenticated user's account. Calling it again on the same user unfollows them.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_list_entries","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_list_entry","description":"[Requires login] Update an existing entry on the authenticated user's own AniList list by its list-entry ID (NOT the media ID \\u2014 get it from get_user_list, or from add_list_entry's response). Only set the fields you want to change. Updating MANY entries to the SAME values? Use update_list_entries instead \\u2014 one request rather than one per entry. The response echoes what AniList actually st","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_user","description":"[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 \\u2014 most fields are a true partial update (see `notificationOptions`/`disabledListActivity` below for two confirmed exceptions, PLUS `a","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":75,"grade":"B","scanned_at":"2026-11-03T14:23:09.912Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-03T14:23:09.841Z","components":{"code":{"score":20,"max":25,"notes":["2 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 12 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/index.js: …&(j=this.opts.code.process(j,y));let ee=new Function(`${o.default.self}`,`${o.default.scope}`…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"anilist-mcp-server","version":"0.11.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-10-22T09:32:46.656Z","repositoryUrl":"git+https://github.com/Grinv/anilist-mcp-server.git","weeklyDownloads":197}],"repo":{"found":true,"owner":"Grinv","repo":"anilist-mcp-server","archived":false,"pushedAt":"2026-10-22T09:24:35Z","stars":1,"forks":1,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/4070730?v=4","ownerCreatedAt":"2013-04-05T16:23:24Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/4070730?v=4&s=128","source":"registry"},"presence":{"stars":1,"forks":1,"downloadsWeek":197,"license":"MIT","lastPushAt":"2026-10-22T09:24:35.000Z","score":29}}}},"grade_history":[],"reviews":[]}