Releases: Grinv/anilist-mcp-server
Releases · Grinv/anilist-mcp-server
Release list
v0.7.1
Changed
- Stop defaulting
search_media'ssortto SEARCH_MATCH for a term-less or whitespace query; it now browses in AniList's own order, and the term is trimmed. 53c4592 - Model
get_todays_birthdays' output as a single list instead of a degeneratecharacter | staffunion. 3f2f93b - Reword
get_anime_schedule: a manga id is rejected as not-found, not silently returned as an empty schedule. 53c4a8f - Document AniList's ~5000-entry page-depth cap on paginated connections (search, characters/staff/reviews, activity, comments). 53c4592 513da8d
- Note that
donatorBadgereads"Donator"even atdonatorTier0, so it isn't a donator signal. 53c4a8f 0f483e3
Security
v0.7.0
Changed
- Reject non-positive AniList IDs locally instead of sending them upstream, where such values always fail anyway. 069bbe4
- Reject negative values locally for numeric fields that can never be negative (counts, years, scores, etc.). 069bbe4 b80f321
- Model activity results as their real type-specific shape (text/list-update/message), not one object mixing every type's fields. 069bbe4
- Validate URL fields (site links, avatar/cover/banner images, the AniList API base URLs) as real http/https URLs, not just strings. 069bbe4 b80f321
- Disclose that
add_list_entry/update_list_entry'sadvancedScoresare positional — reordering categories later reinterprets written scores. 0a1aff4 - Disclose that
post_thread's response omitscategories/isSticky/isLocked— callget_threadafterward to confirm a change applied. 4a2a5ac - Disclose that
post_thread_comment'sidandparentCommentIdrefer to different comments — the branded type can't tell them apart. 4a2a5ac - Disclose that
get_user_recent_activityapplies no activity-type filter, same asget_user_activity. 3ce5ca3 - Disclose
login_anilist's actual default redirect URI and itsANILIST_OAUTH_PORToverride, needed before registering an AniList app. c194eca - Clarify that
get_recommendation's rating/vote is cast on anilist.co directly — this server has no tool to vote itself. a74780b - Clarify
get_media_reviewssorts byrating(a review's community-helpfulness vote), notscore(the reviewer's own rating). 628c2df - Confirm
get_site_statistics'pageInfo.total/.lastPageare accurate here, unlike this schema's usual meaning elsewhere. e024968
Fixed
v0.6.0
Added
- Add
PRIVACY.mdandSECURITY.md, linked fromREADME.md. 768c458 3b961fe - Add an MCPB bundle icon using AniList's real brand colors. 4317281 691f05d
Changed
Fixed
- Ship
PRIVACY.mdin the published npm package — it was missing frompackage.json'sfilesallowlist. 3342e6c - Ship
SECURITY.mdin the published npm package too — README links to it the same way it links toPRIVACY.md, but it was missing from the samefilesallowlist. 6cf0271 - Exclude dev-only contributor tooling and
glama.jsonfrom the.mcpbbundle. 1fed97a dd29f14 - Point
README.md'sdocs/links at absolute GitHub URLs so they still resolve from inside an installed.mcpbextension, which excludesdocs/. a645d5b - Relax
post_thread'stitle/bodyto required only when creating — omitting either on an update keeps its existing value. c928316 - Disclose that
post_thread'smediaCategoriesis a full replace on update, same ascategories. c928316 - Fix
search_activity's description andoutputSchema, both of which wrongly modeled results as bare IDs — the query already returns full activity content. f1d0d61 - Disclose that
get_user_activity/get_user_recent_activityerror on an unknown user, unlikesearch_activity's ownuserfilter, which silently returns empty. 4563fc0 - Cap
get_media'sidsarray at 25 entries — previously unbounded, a batch of hundreds succeeded live with no cap, each entry returning full synopsis/tags/rankings. 8d9eba7 - Disclose that a majority of ids from
get_recommendations_for_media404 onget_recommendation's own lookup — a confirmed AniList-side inconsistency, not a bug in this server. 35a6226 - Correct
PRIVACY.md's claim thatget_notifications"does not write anything" — itsmarkAsRead: trueoption resets AniList's real unread-notification badge count. c9485a4 - Correct
idempotentHinttofalseondelete_activity/delete_thread/delete_thread_comment/remove_list_entry— each one errors, not silently succeeds, when retried on an already-deleted id. fc4fc5e - Document that
update_list_entry'scustomListsreplaces the entry's full set of enabled lists, not merges — the same warningadd_list_entry's identical field already had. 53f8351 - Document that
update_list_entry'shiddenFromStatusListsstill counts the entry in statistics — the same clauseadd_list_entry's identical field already had. eceace6 - Document that
post_thread'sstickyis confirmed live to silently no-op for a non-mod account, matchinglocked's existing wording (both were verified together). eceace6 - Document that
search_media'sonListsilently no-ops when not logged in, matchingget_recommendations_for_media'sexcludeInList. ad6d8a7 - Fix
update_user'snotificationOptions/disabledListActivityto reject a duplicated type, not just check full coverage — a duplicate-plus-full array previously passed silently. 2cfa0fe - Document that
get_studio'snamealready does AniList's own fuzzy search, so a partial name resolves directly without needingsearch_studiofirst. 995e071 - Reject a manga id in
get_anime_scheduleinstead of silently returning an empty schedule; also stop discardinghasNextPagefrom its output. a3c7664 - Type
get_recommendation/get_recommendations_for_media'srating/userRatingfields per AniList's actual schema (a plain int and a real 3-value enum), not generic number/string. 9bf34b5 - Reject
post_threadcalls that omitcategorieswhen creating a new thread, matching AniList's own mutation requirement, instead of surfacing an upstream error. 67ec0fc - Correct
update_user's stale claim thatdisabledListActivitycan leave a mutation non-atomic — that trigger is now blocked client-side before any request is sent. 3784af2 - Narrow
get_authorized_user's claim thatadvancedScoringis full-replace likecustomLists— onlycustomListsis confirmed that way. 3784af2 - Clarify
login_anilist'sauto_captureonly reflects whether this server could bind a local port, not whether the browser is actually local. 6c48045 - Document that
get_user_activityreturns every activity type (including received messages), not just list updates/text posts as previously stated. 39981cc - Fix
get_notifications'pageInfooutput to match its actual query (onlyhasNextPageis ever returned). 3594f1d - Document
get_user_list's ~11,000-entry AniList-side cap. 902ccb1 - Confirm
post_thread'scategoriesis a full replace (not a merge) when set on an update. 0554ff6 - Disclose
isFavourite's confirmed read-after-write staleness consistently acrossget_media/get_character/get_staff/get_studio— previously onlyget_mediahad it. 76196f0 - Add
get_media's missingmediaListEntryoutput disclosure, matchingget_recommendations_for_media's existing one. 76196f0
Security
- Harden log redaction to also strip JSON-style credentials (
"client_secret":"..."), matching the OAuth token exchange's actual request body shape. 0a70a08
v0.5.0
Added
- Add an hour-long public cache hint to
tools/list/prompts/list/server/discoverfor 2026-07-28-era clients.
Safe because every tool/prompt here registers unconditionally, with no runtime/auth-dependent branching. 482bb10 - Add AniList-schema-sourced length/format limits to mutation tool inputs, rejecting invalid values locally instead of an upstream round trip. 307321d
Changed
- Bump
@modelcontextprotocol/server/clientto the first stable2.0.0(from2.0.0-beta.5).
No breaking changes — the only two behavior changes since beta.5 don't affect this stdio-only server. 036788f - Move
get_studio's id/name check into its Zod schema — same core message, now wrapped in the SDK's validation-error prefix. 307321d - Document that
update_user'sprofileColorsilently ignores bad values, whilerowOrder/timezonereject them with a clear error (confirmed live). 307321d
v0.4.0
Everything below is one commit: 48049f6.
Added
- Add
pageInfo.lastPagetoget_media_tags's response — computed client-side, so unlike AniList-paginated tools it's accurate, not degraded.
Changed
- BREAKING: Rename tools
favourite→toggle_favouriteandfollow_user→toggle_follow_user, matching this server's verb+resource naming.
Update any pinned tool names in your own configs/prompts. - Document that
update_user'scustomListsreplaces the whole array rather than merging by name.
Omitting an existing list silently deletes it. - Document that
add_list_entryupserts by media ID rather than always creating a fresh entry.
Unset fields (includingstatus) keep their previous value on an existing entry, not a new-entry default. - Document that
add_list_entry/update_list_entry'scustomListsreplaces an entry's full set of enabled lists, not merges.
Naming only a subset silently un-tags every list left out. - Document a third
update_userfull-replace exception:customLists, alongsidenotificationOptions/disabledListActivity. - Document that reordering/renaming
advancedScoringcategories silently reinterprets already-stored per-category scores. - Document that
get_user_stats/get_full_user_infostatistics can lag behind an account's real list state (AniList's own aggregation). - Document that
post_message_activityis always public — AniList's mutation accepts aprivateargument this tool doesn't expose. - Document
search_activity's asymmetricuservalidation: unknown username errors, unknown numeric ID silently returns empty. - Document that
search_thread'scategoryId/mediaCategoryIdsilently filter to an empty result on an unknown ID. - Document that
search_media'sgenres/tag_insilently filter to no results on an unrecognized name, matchingformat_in. - Document that
get_user_recent_activityreturns full activity content, not just IDs. - Document that
update_user'snotificationOptions/disabledListActivityentries require an explicitenabled/disabledvalue.
Omitting it writesnullonnotificationOptions, but fails the whole call with a500ondisabledListActivity(confirmed live). - Document that
search_userpoints to specific downstream tools (profile, stats, list, follow), not a generic "profile/list tools." - Document that
get_media_characters/get_media_staffrequest no explicit ordering, unlikeget_character/get_staff's popularity sort. - Document that
get_anime_schedulereturns results soonest-airing first. - Document
get_recommendations_for_media'smediaListEntrylogin-gating, and add its missingpageInfo.hasNextPageto the output schema.
v0.3.0
Added
- Add
page/perPagepagination toget_site_statistics(previously fixed to the last 7 days); AniList capsperPageat 25 regardless of input. 4af0916
Changed
- Halve
get_thread_comments's network round-trips for a giventhreadIdby combining the not-found existence check into the same request as the real query, instead of a separate one. 4268f5f - Add missing
destructiveHint/idempotentHint/openWorldHintMCP tool annotations across write tools, for accurate client-side risk hints. ff469f6 - Document that
get_studio's returned titles cap at 10 andget_todays_birthdays's results cap at 50 — both fixed, unpaginated limits. ff469f6 - Document that
favouritereturns the account's entire current favourites across all 5 categories, not just the toggled item. ff469f6 - Document that
get_user_activitydoesn't filter by activity type, cross-referencingsearch_activityfor that. ff469f6
v0.2.2
Changed
- Rename
search_activity'suserIdparameter touser, accepting a username too — the old name was silently ignored, falling back to the unfiltered global feed instead of erroring. f2b28bd - Document that
delete_activity/delete_thread/delete_thread_comment/remove_list_entryerror on an already-deleted id instead of silently succeeding. 8fa063c - Document that
add_list_entry/update_list_entry'sadvancedScoreserrors when advanced scoring is disabled or a category name doesn't match. 8fa063c
Fixed
v0.2.1
Changed
- Halve
get_anime_schedule/get_user_activity's network round-trips for a givenmediaIdor numeric user ID by combining the not-found existence check into the same request as the real query, instead of a separate one. aacfa8b
Fixed
- Fix
get_user_activitysilently returning an empty activity list for a nonexistent numeric user ID instead of an error, unlike its existing username path. 33a0262 - Fix
get_anime_schedulesilently returning an empty schedule for a nonexistentmediaIdinstead of an error. 33a0262 - Fix several single-ID tools (
get_activity,get_character,get_staff,get_studio,get_recommendation,get_recommendations_for_media,get_thread,get_media_statistics,get_media_characters,get_media_staff,get_media_reviews,get_media_relations) crashing or silently returning invalid output for a nonexistent ID — they now return a clean not-found error instead. 58ee542 - Fix
get_mediasilently dropping arrayidsthat don't resolve to a real title — it now fillsnullin that position instead, keeping the result the same length asids. 58ee542 - Fix
get_thread_commentsreturning a misleadingly-empty success for a nonexistentthreadIdinstead of an error. 58ee542 - Fix not-found tool errors discarding their specific detail (e.g. which ID was invalid) behind a generic "(404)" message. 58ee542
- Fix a 403 error always blaming the authenticated account's permissions, even when it's actually an unrelated upstream security block (e.g. a WAF rejecting unusual request content). 58ee542
- Fix inline GraphQL errors always being classified as a generic bad request, even when AniList embeds a specific status (e.g. 404/401) in the response. 58ee542
- Reject
add_list_entry/update_list_entry'sadvancedScoresvalues outside the documented 0-10 scale, instead of accepting e.g.15silently. 58ee542 - Give a clear validation message for
get_media'sidsand every user-scoped tool'suserparameter when missing/malformed, instead of a generic Zod error. 58ee542 - Clarify
get_user_profile/get_full_user_info's description: the account settings they return (notifications, list display, etc.) aren't restricted to the caller's own account — AniList returns them for any user looked up. 58ee542 - Clarify
favourite's description: AniList doesn't validate thatidactually belongs to the givenkind— a mismatched pair silently succeeds instead of erroring. 58ee542 - Fix the
seasonal_overviewprompt ignoringseason/yearwhen only one of the two was given, instead of treating them as the independent filterssearch_mediaactually supports. 58ee542
v0.2.0
Everything below is one commit: 0a537f7.
Added
- Add
tag_in,onList,averageScore/popularity/episodesrange filters,startDate/endDaterange filters, andsource_intosearch_media. - Add
includeDescriptiontosearch_media, returning each result's full synopsis on request (kept off by default — up to 25 results per call). - Return
media/staffMediafilmography (withcharacterRole/staffRole) fromget_character/get_staff. - Add
includeBodytoget_media_reviews, returning each review's full text on request (kept off by default — it can be long). - Return
nextAiringEpisode,externalLinks, and (login required)mediaListEntryfromget_media; addincludeStreamingEpisodesforstreamingEpisodes(kept off by default — AniList doesn't paginate this field, so long-running titles can return hundreds of entries). - Return
replyCount/likeCount/isLikedfrom activity tools, andreplyCount/viewCount/likeCount/isLikedfrom thread/comment tools. - Add
airingNotifications,profileColor,donatorBadge,timezone,activityMergeTime,staffNameLanguage, andrestrictMessagesToFollowingtoupdate_user. - Add
rowOrdertoupdate_user, readable back viamediaListOptions.rowOrder. - Add
notificationOptionstoupdate_user— requires all 20 notification types every call, since AniList replaces the entire list rather than merging a partial one. - Add
disabledListActivitytoupdate_user— requires all 6 list statuses every call; AniList rejects a partial list. - Add
animeListOptions/mangaListOptionstoupdate_user(advanced scoring, custom lists, list display settings, andtheme) — previously not settable at all;theme's AniList read-back is an untyped, deprecated value, not guaranteed to match what was set. - Add
hiddenFromStatusListstoadd_list_entry/update_list_entry, and return it fromget_user_list. - Return
isSticky,isLocked,mediaCategories, andchildCommentsfrom the thread read tools, so apost_thread/post_thread_commentcall can actually be verified. - Return account preferences (
options,mediaListOptions) from the user-profile tools and fromupdate_user's own response, so a settings change can actually be verified. - Return
customListsandadvancedScoresfromget_user_list— previously set viaadd_list_entry/update_list_entrybut unreadable.
Fixed
- Stop
search_threadfrom treating an empty/whitespacetermdifferently from an omitted one (same fix already applied tosearch_media). - Clear the read cache after every successful mutation — a read immediately after a write could otherwise serve stale pre-mutation data for up to
CACHE_TTL_MS. - Correct
add_list_entry's description: AniList defaults an entry with nostatustoCURRENT(withstartedAtset to today), notPLANNING. - Clarify that
search_media'sseason/seasonYeareach work standalone (e.g. every Summer across all years) — the previous "pair with X" wording implied they're only meaningful together. - Give
submit_anilist_redirecta clean, actionable message when the OAuth redirect denied access or had nocode, instead of a generic "Unexpected error". - Reject
add_list_entry/update_list_entry'sadvancedScoreswhenadvancedScoringEnabledisfalse, instead of only checking that a category list exists. - Fix
get_notifications' ACTIVITY_MESSAGE items always coming back with an empty message: AniList nests the DM text one level insidemessage.message, not directly onmessage. - Add the 3 stylised variants (
ROMAJI_STYLISED,ENGLISH_STYLISED,NATIVE_STYLISED) toupdate_user'stitleLanguage— the enum only listed half of AniList's actual options. - Fix
get_mediawith an array ofidsreturning results sorted by AniList's own default order instead of the input order the tool's own description promises — confirmed live ([154587, 21]came back as[21, 154587]). - Stop
get_media_tags' description from claimingsearch_mediacan't filter by tag — it now can (tag_in, added this same release).
Changed
- Bump
@modelcontextprotocol/serverto2.0.0-beta.5(frombeta.4).
v0.1.5
Everything below is one commit: 194c7d3.
Added
- Add
search_thread,post_thread,post_thread_comment, anddelete_thread_comment— forum threads were previously read/delete-only.
Fixed
- Stop every
pageInfofield (total,perPage,currentPage,lastPage,hasNextPage) from failing output validation when AniList returnsnullfor it instead of omitting it — confirmed live on an emptied thread's comment page.