Skip to main content
Glama
MAL MCP Server

MAL MCP Server

Get anime reviews

get_anime_reviews
Read-only

Retrieve user reviews for a specific anime by MyAnimeList ID, with scores, spoiler/preliminary flags, sentiment filters, and pagination for review summaries or comparisons.

Instructions

Get user reviews for one anime (by mal_id): review text (truncated to 1200 characters), score, spoiler/preliminary flags, episodes watched at review time (episodes_watched, not chapters_read — that field is manga-only), and community reaction counts. limit (default 5) caps how many of the fetched page's reviews come back — it does not itself fetch further pages, use page for Tenrai's own ~20-per-page listing. sort/preliminary/spoilers/sentiment filter/order the underlying set before that cap is applied. Get the mal_id from search_anime.

Input Schema

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
pageNo1-based page number for pagination (1-20000).
sortNoSort order. Defaults to most_helpful (Tenrai's own default) when omitted.
limitNoHow many of the page's reviews to return (1-20; a page holds 20).
spoilersNoFilter by spoiler. 'true' includes them alongside other reviews, 'false' (default) excludes them, 'only' returns exclusively spoiler reviews.
sentimentNoRestrict to reviews with this overall sentiment tag. Omit for all sentiments.
preliminaryNoFilter by preliminary. 'true' includes them alongside other reviews, 'false' (default) excludes them, 'only' returns exclusively preliminary reviews.

Output Schema

NameRequiredDescriptionDefault
pageYes
reviewsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv0.11.0
    • changedInput schema / properties / limit / description
      Previous value: -"Max results per page (1-50)."New value: +"How many of the page's reviews to return (1-20; a page holds 20)."
    • changedInput schema / properties / limit / maximum
      Previous value: -50New value: +20
    • changedInput schema / properties / page / description
      Previous value: -"1-based page number for pagination (1-1000)."New value: +"1-based page number for pagination (1-20000)."
    • changedInput schema / properties / page / maximum
      Previous value: -1000New value: +20000
    • changedInput schema / properties / preliminary / description
      Previous value: -"Filter by preliminary. 'true' includes them alongside other reviews (default), 'false' excludes them, 'only' returns exclusively preliminary reviews."New value: +"Filter by preliminary. 'true' includes them alongside other reviews, 'false' (default) excludes them, 'only' returns exclusively preliminary reviews."
    • changedInput schema / properties / spoilers / description
      Previous value: -"Filter by spoiler. 'true' includes them alongside other reviews (default), 'false' excludes them, 'only' returns exclusively spoiler reviews."New value: +"Filter by spoiler. 'true' includes them alongside other reviews, 'false' (default) excludes them, 'only' returns exclusively spoiler reviews."
    • addedOutput schema / properties / page
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "current_page": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 9007199254740991,
      +      "type": "integer"
      +    },
      +    "has_next_page": {
      +      "type": "boolean"
      +    },
      +    "last_visible_page": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 9007199254740991,
      +      "type": "integer"
      +    },
      +    "total": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedOutput schema / properties / reviews / items / properties / date / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    • changedOutput schema / required
      Previous value: -[
      -  "reviews"
      -]New value: +[
      +  "reviews",
      +  "page"
      +]
  2. Changed17 schema fields changedv0.9.0
    • changedInput schema / properties / limit / description
      Previous value: -"Max results per page (1-25)."New value: +"Max results per page (1-50)."
    • changedInput schema / properties / limit / maximum
      Previous value: -25New value: +50
    • addedInput schema / properties / page
      Added value: +{
      +  "description": "1-based page number for pagination (1-1000).",
      +  "maximum": 1000,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / preliminary
      Added value: +{
      +  "description": "Filter by preliminary. 'true' includes them alongside other reviews (default), 'false' excludes them, 'only' returns exclusively preliminary reviews.",
      +  "enum": [
      +    "true",
      +    "false",
      +    "only"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / sentiment
      Added value: +{
      +  "description": "Restrict to reviews with this overall sentiment tag. Omit for all sentiments.",
      +  "enum": [
      +    "recommended",
      +    "mixed_feelings",
      +    "not_recommended"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / sort
      Added value: +{
      +  "description": "Sort order. Defaults to most_helpful (Tenrai's own default) when omitted.",
      +  "enum": [
      +    "newest",
      +    "oldest",
      +    "most_helpful"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / spoilers
      Added value: +{
      +  "description": "Filter by spoiler. 'true' includes them alongside other reviews (default), 'false' excludes them, 'only' returns exclusively spoiler reviews.",
      +  "enum": [
      +    "true",
      +    "false",
      +    "only"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / reviews / items / properties / chapters_read
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / reviews / items / properties / date / format
      Added value: +"date-time"
    • addedOutput schema / properties / reviews / items / properties / date / pattern
      Added value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    • addedOutput schema / properties / reviews / items / properties / episodes_watched
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / reviews / items / properties / is_preliminary
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / reviews / items / properties / is_spoiler
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / reviews / items / properties / reactions
      Added value: +{
      +  "additionalProperties": {
      +    "maximum": 9007199254740991,
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / reviews / items / properties / score / maximum
      Added value: +10
    • addedOutput schema / properties / reviews / items / properties / score / minimum
      Added value: +1
    • changedOutput schema / properties / reviews / items / properties / score / type
      Previous value: -"number"New value: +"integer"
  3. Addedv0.8.0
  4. Removedv0.7.1
  5. First observedv0.1.0

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover read-only/open-world, so the description carries real weight: it discloses 1200-character truncation, the default sort (Tenrai's most_helpful), the ~20-per-page listing size, and critically that `limit` does not fetch additional pages. That last point prevents a common misuse loop and is not derivable from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource and return fields, then the pagination caveat, then the prerequisite — a sensible order. It is dense with parentheticals and backticked field names, which slightly hampers scanning, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter read tool with an output schema, everything an agent needs to call it correctly is present: the ID source, page vs limit semantics, filter-before-cap ordering, and default sort. Return value structure is left to the output schema, as appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds ordering semantics the schema omits: `sort`/`preliminary`/`spoilers`/`sentiment` filter and order the underlying set *before* the `limit` cap is applied. The limit-vs-page distinction is also restated in operational terms rather than schema terms.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get user reviews for one anime (by mal_id)') and immediately enumerates what a review contains, so the agent knows exactly what payload to expect. It also distinguishes itself from get_manga_reviews by calling out that `episodes_watched` is not `chapters_read` (manga-only), which disambiguates a near-identical sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete prerequisite chain ('Get the mal_id from search_anime') and explains how to page further ('use `page` for Tenrai's own ~20-per-page listing'), which is the main decision an agent faces. It stops short of saying when to prefer get_manga_reviews or when reviews are unavailable, but the routing context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.