ani-mcp demonstrates solid tool definition quality with consistent naming patterns, reasonable descriptions, and complete input schemas across all 19 tools. Strengths include verb-based naming (search_, get_, update_), comprehensive parameter types with enums for enumerated values, and good coverage of optional/required parameters. Key gaps: output schemas are not documented in the visible code; error handling descriptions are minimal; some parameter descriptions lack actionable constraint information. The server uses fastmcp framework which abstracts schema registration, making full schema validation harder to verify from static analysis. Overall, this is a well-structured domain-specific tool suite that follows basic MCP patterns but lacks the polish and error guidance expected of A-grade tools.
Tools (19)
anilist_airing_scheduleread only50/100
Get airing schedule and next episodes for currently airing anime
anilist_character_searchread only50/100
Search for anime/manga characters by name
anilist_discoverread only50/100
Discover top-rated anime or manga by genre without a search term
anilist_get_recommendationsread only50/100
Get anime/manga recommendations for a title
anilist_get_user_listread only50/100
Fetch a user's anime or manga list with filtering options
anilist_import_kitsuwriteauth50/100
Import anime list from Kitsu
anilist_import_malwriteauth50/100
Import anime list from MyAnimeList via Jikan API
anilist_media_inforead only50/100
Get detailed information about a specific anime or manga title
Output schemas not documented in source code. While input schemas are complete and properly typed, no visible documentation of what fields/structure each tool returns to the LLM. This forces agents to infer response structure and risks failed downstream chain attempts.
Parameter descriptions lack actionable constraints. E.g., 'page' parameter has no guidance on valid range (1-N?), what happens at boundary conditions, or default value. 'sort' parameters reference sort order like 'POPULARITY_DESC' but no description explains what each option means or when to use.
Recommendations
Document output schema for every tool. Include sample response structure and key fields the agent should expect. For example, anilist_search should document: returns array of {id, title, format, year, score, popularity}, plus a 'pageInfo' object with 'hasNextPage' and 'total'.
Add constraint documentation to all numeric and enum parameters. E.g., 'page: integer, valid range 1 - 999 (may be lower if fewer results); defaults to 1 if omitted. Returns empty array if out of range.' and 'sort: one of [POPULARITY_DESC, SCORE_DESC, TRENDING_DESC, FAVOURITES_DESC, UPDATED_DESC]; defaults to POPULARITY_DESC.'
For tools accepting multiple ways to identify a resource (search by ID or name), explicitly state the resolution priority: 'If both id and search are provided, id takes precedence. search is ignored.'
Add error mode descriptions to write tools and import tools. Example for anilist_import_mal: 'On success, returns count of imported entries. On user not found, returns error with actionable message: "Username 'xyz' not found on MyAnimeList. Try search_anilist_user() first to verify.". On merge conflict (entry exists with different status), behavior depends on merge=true: merged entries show merged=true in response.'
Document idempotency for anilist_update_entry: 'This tool is idempotent. Calling with the same arguments multiple times produces the same result; no duplicate entries or side effects. Safe to retry on timeout.'
Clarify anilist_undo semantics. Describe what action(s) it undoes, whether it maintains a stack, max undo depth, and whether it requires authentication.
Score history
Overall score trend
↑ 6 points across a rubric change (v1 → v2)
59/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
D
59
2026-07-28+
v2
2026-03-09
D
53
-
v1
read only50/100
Search for anime or manga by title, genre, year, or format
anilist_seasonalread only50/100
Browse anime or manga by season and year
anilist_seasonal_recapread only50/100
Generate seasonal recap card of anime watched this season
anilist_social_compatread only50/100
Calculate compatibility between two users based on shared lists and taste
anilist_staff_inforead only50/100
Get staff and voice actors for a media title
anilist_taste_profileread only50/100
Generate a taste profile showing genre, tag, and theme preferences
anilist_trendingread only50/100
Get trending anime or manga right now
anilist_undoreversibleauth50/100
Undo the last action (revert a list update)
anilist_update_entrywriteauth50/100
Update a media list entry (status, score, progress)
anilist_user_statsread only50/100
Get aggregated statistics about a user's anime/manga consumption and taste
anilist_year_wrappedread only50/100
Generate year-in-review statistics card for a user's anime/manga consumption
No error handling guidance in tool descriptions. Tools that import from external services (anilist_import_kitsu, anilist_import_mal) provide no description of failure modes: What if the username doesn't exist? What if the import partially succeeds? How should the agent recover?
Dual parameter acceptance (e.g., search by ID or title in anilist_media_info, anilist_get_recommendations, anilist_airing_schedule) not documented as mutually exclusive. Description does not clarify if both can be provided, what happens if both are passed, or which takes precedence.
anilist_undo has empty input schema (no parameters). Description does not explain what 'undo' reverts: the last write operation? The last 5 minutes of actions? Scope and limitation unclear.
No pagination guidance in tool descriptions. Tools like anilist_search and anilist_seasonal accept 'page' parameter but descriptions never mention: what is the page size? What is the max page number? What does an out-of-range page return?
Add per-tool pagination metadata in descriptions. E.g., anilist_search: 'Returns up to 25 results per page. Use page parameter to fetch additional pages. Response includes pageInfo.hasNextPage and pageInfo.total to guide iteration.'
For social/comparison tools (anilist_social_compat, anilist_user_stats), document what happens when the user account is private or does not exist: does it return partial data, or full error?
Validate and document all enum values in descriptions. Replace 'Sort order (POPULARITY_DESC, SCORE_DESC, TRENDING_DESC, etc.)' with explicit exhaustive list: 'sort must be one of: POPULARITY_DESC, SCORE_DESC, TRENDING_DESC, UPDATED_DESC, FAVOURITES_DESC, ID_DESC. Defaults to POPULARITY_DESC.'
Add recovery guidance to tool descriptions that depend on external authentication (import tools). E.g., 'If import fails with 'auth_required', ensure the target user's profile is public and the Kitsu account exists. Try anilist_get_user_list() with the same username first to verify.')