AniList MCP — wraps AniList GraphQL API (free, no auth)
AniList MCP has well-structured tool definitions with clear naming (search_anime, get_anime, trending_anime) and complete input schemas. All three tools have descriptions (194 - 234 chars, within baseline 34 - 392 range) and typed parameters. However, output schemas are not documented, LLMs cannot predict response structure. Parameter descriptions lack constraints (e.g., limit 1 - 25 is stated in description but not enforced in schema). Error handling is minimal; no recovery guidance or actionable error messages. No tool annotations (readOnlyHint, idempotentHint). Composition is sound: each tool has one responsibility, and search_anime returns results that could chain to get_anime via ID.
Get full details for an anime by its AniList ID. Returns title, synopsis, episodes, duration, status, score, genres, studios, and season info.
Search anime by title using AniList. Returns title, episode count, status, average score, genres, and a synopsis.
Get currently trending anime on AniList, ranked by trending score. Returns title, status, score, episodes, and genres.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). formatMedia() returns ~15 fields but no schema is visible to the agent.
Parameter constraints (limit 1 - 25) stated in description text only, not in JSON Schema. LLMs cannot parse natural-language constraints; schema should include minimum/maximum.
No error handling or recovery guidance. gqlPost() throws generic errors ('AniList API error', 'AniList GraphQL error') with no actionable next steps for the LLM.
No tool annotations. All three tools are read-only and idempotent, but readOnlyHint and idempotentHint are absent. Agents cannot infer safety properties.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
search_anime description mentions 'synopsis' but formatMedia() returns 'description' field. Field naming mismatch risks agent confusion.