Skip to main content
Glama
Grinv

MAL MCP Server

MAL MCP Server

npm version CI license: MIT MCP Registry mal-mcp MCP server

An MCP server for MyAnimeList. It works with any MCP-compatible client or agent (Claude Desktop/Code, Cursor, VS Code, Cline, Continue, and others), since the server speaks the standard MCP stdio protocol.

What it does

It uses a hybrid backend:

  • Reads → Tenrai (free, unofficial MAL API). Search, details, rankings, seasons, characters, recommendations and reviews. No credentials required.

  • Your personal list → official MyAnimeList API. Read, update and delete entries on your own anime/manga list. Requires a one-time login (see below).

Related MCP server: mal-mcp

What you need (and what it gets you)

Nothing is required to get started. You can skip straight to Install. Everything below is optional, and each step just adds more:

You set...

You get...

(nothing)

Search, details, rankings, seasons, characters, reviews, and more. Works immediately, no signup.

A MyAnimeList Client ID (2 minutes, free →)

Same as above, plus: 11 read tools (search, rankings, seasons, recommendations, details, statistics) keep working when Tenrai, the default read backend, has an outage. They retry against the official MyAnimeList API instead. Still no login step.

The Client ID above, plus running the login_mal tool once (same walkthrough →)

Everything above, plus your own MyAnimeList list: view it, add/update entries, mark things watched, remove entries.

Without a login, the personal-list tools reply with a clear message telling you how to get one. Everything else keeps working regardless.

Example queries

Once it's connected, just ask your agent in natural language.

No credentials needed (search, details, rankings, seasons, characters, …):

"Search for the anime Frieren and show its score, studio and synopsis."
"What are the top 10 anime of all time?"
"What's airing this season? Sort by popularity."
"Recommend anime similar to Steins;Gate."
"What are people saying in reviews of Chainsaw Man?"
"Show the main characters and Japanese voice actors of Cowboy Bebop."
"When does the next episode of One Piece air?"
"Give me the top manga in the Romance genre."
"What's on the upcoming season's schedule?"
"Pick a random highly-rated anime for me."

With your MyAnimeList account (after a one-time login_mal; see Connect your MyAnimeList account):

"Show my MAL profile and watching stats."
"What's on my anime list that I marked as watching?"
"Add Frieren to my plan-to-watch list."
"Set Cowboy Bebop to completed with a score of 9."
"Bump my episode count for One Piece to 1095."
"Remove Bleach from my manga list."

Tools

Tool

Backend

Auth

search_anime, search_manga

Tenrai

none

get_anime, get_manga

Tenrai

none

get_anime_characters, get_anime_recommendations, get_anime_reviews

Tenrai

none

get_manga_characters, get_manga_recommendations, get_manga_reviews

Tenrai

none

get_recent_anime_recommendations, get_recent_manga_recommendations

Tenrai

none

get_anime_episodes, get_anime_videos

Tenrai

none

get_anime_genres, get_manga_genres

Tenrai

none

search_characters, get_character

Tenrai

none

search_people, get_person, get_anime_staff

Tenrai

none

get_anime_statistics, get_manga_statistics

Tenrai

none

get_random_anime, get_random_manga, get_random_character, get_random_person

Tenrai

none

get_anime_news, get_manga_news, get_news

Tenrai

none

get_top_anime, get_top_manga

Tenrai

none

get_top_people, get_top_characters

Tenrai

none

get_seasonal_anime, get_upcoming_season, get_seasons_list, get_anime_schedule

Tenrai

none

get_producers, get_producer, get_magazines

Tenrai

none

get_interest_stacks, get_interest_stack, get_anime_interest_stacks, get_manga_interest_stacks

Tenrai

none

get_my_user_info, get_my_anime_list, get_my_manga_list

MAL

token

update_my_anime_status, update_my_manga_status

MAL

token

delete_my_anime_list_item, delete_my_manga_list_item

MAL

token

login_mal, submit_mal_redirect

MAL

login

token = needs a MyAnimeList login (run login_mal once). Prompts: recommend_similar, seasonal_overview, hidden_gems. recommend_similar's title is optional: omit it and it'll ask which anime you mean. Clients that support prompt-argument completion get live title suggestions as you type (from the third character, or the second for non-Latin titles).

Install

As an .mcpb bundle (one-click, e.g. Claude Desktop)

Download mal-mcp.mcpb (always the latest release) and open it with your MCP client. It prompts for an optional MyAnimeList Client ID. Set it and run the login_mal tool to enable the personal-list tools (see Connect your MyAnimeList account). Leave it blank to use just the credential-free read tools.

From source

git clone https://github.com/Grinv/mal-mcp
cd mal-mcp
npm ci
npm run build

This produces a self-contained dist/index.js. Point your client at it (see below).

Connect it to an MCP client

Add the server to your client's MCP config (Claude Desktop/Code, Cursor, VS Code, Cline, …). The simplest option is npx, which needs no clone and no build. It runs on your system Node, which must be 22.18 or newer (node -v); the .mcpb bundle above uses the client's built-in Node instead:

{
  "mcpServers": {
    "mal": {
      "command": "npx",
      "args": ["-y", "mal-mcp"],
      "env": {
        "MAL_CLIENT_ID": "..."
      }
    }
  }
}

Or with the Claude Code CLI:

claude mcp add mal -e MAL_CLIENT_ID=... -- npx -y mal-mcp

If you built from source instead, replace "command": "npx", "args": ["-y", "mal-mcp"] with "command": "node", "args": ["/absolute/path/to/mal-mcp/dist/index.js"].

The env block is optional. Omit it to use only the credential-free read tools (search, details, rankings, …); the personal-list tools will return a clear error until you log in. To enable them, set MAL_CLIENT_ID and run the login_mal tool once (a one-time browser authorization; the token is then stored and refreshed automatically). The server does not read a .env file, so pass config via this env block (or your shell environment). See docs/auth.md for the full login walkthrough and docs/clients.md for more clients.

Connect your MyAnimeList account (for the personal-list tools)

The search/browse tools work with no setup. To use the personal-list tools (get_my_*, update_my_*, delete_my_*), authorize your account once. It takes about two minutes. There is no client secret: mal-mcp uses the modern public-client flow (PKCE), so you only need a Client ID.

Step 1: Register a MyAnimeList app (one minute).

  1. Go to https://myanimelist.net/apiconfig and click Create ID.

  2. App Type: choose other. (Not web: that type forces a client secret this server doesn't use.)

  3. App Redirect URL: enter exactly

    http://localhost:8080/callback

    (If port 8080 is already used on your machine, pick another port here and set MAL_OAUTH_PORT to the same number. See Configuration.)

  4. Fill the remaining required fields with anything reasonable, accept the terms, and Submit.

  5. Open your new app and copy its Client ID.

Step 2: Give the Client ID to the server.

Add it to your MCP client config (or paste it into the Claude Desktop install form). Nothing else is needed here:

"env": { "MAL_CLIENT_ID": "paste-your-client-id-here" }

Restart the server/client so it picks up the value.

Step 3: Log in (one click).

In your assistant, run the login_mal tool (or just say "log in to MyAnimeList"). It replies with a link. Open the link, sign in to MAL, and click Allow.

  • Running locally (Claude Desktop, or Claude Code on your own machine): login finishes automatically the moment you click Allow. Confirm with "show my MAL profile" (get_my_user_info).

  • Running on a remote/SSH/headless host: after clicking Allow, your browser lands on a page that won't load. That's expected. Copy the full address from the browser's address bar (it contains ?code=…) and give it to the submit_mal_redirect tool to finish.

That's it. The token is saved locally (~/.config/mal-mcp/tokens.json, 0600) and refreshed automatically from now on, so you won't need to log in again.

Prefer no interactive step? You can instead pre-set MAL_REFRESH_TOKEN (with MAL_CLIENT_ID) or a standalone MAL_ACCESS_TOKEN. See docs/auth.md for how to obtain them by hand.

Configuration

All configuration is via environment variables, all optional. Without credentials the read tools still work. For the personal-list tools, set MAL_CLIENT_ID and run the login_mal tool once; the access token is then fetched and refreshed automatically. (mal-mcp is a public PKCE client, so there is no client secret.)

Variable

Purpose

MAL_CLIENT_ID

Your MyAnimeList Client ID. See Connect your MyAnimeList account for how to get one (it's free, ~2 minutes, no coding involved).

MAL_REFRESH_TOKEN

Advanced, optional. Skips the interactive login_mal step by pre-supplying a token directly. Most people won't need this. See docs/auth.md if you do.

MAL_ACCESS_TOKEN

Advanced, optional. A standalone token that works ~30 days without refreshing. See docs/auth.md.

Tuning (rarely needed)

These have sensible defaults; change them only if you need different timing, a different upstream base URL, or want to override where/how the server logs or stores its token.

Variable

Purpose

MAL_TOKEN_STORE

Override where the login token is saved on disk (default: your OS's config folder).

MAL_OAUTH_PORT

Only needed if port 8080 is already in use on your machine. See step 1 of the account walkthrough.

LOG_LEVEL

How much the server logs: debug | info | warn | error | silent (default info). Logs go to stderr only. There's no MCP-level log capability, so a client can't fetch or filter them via logging/setLevel; check the server process's stderr directly.

TENRAI_MIN_INTERVAL_MS

Min spacing between Tenrai calls (default 300). On top of this the client enforces Tenrai's published 4/s and 120/min public limits; set to 0 to disable all client-side throttling.

CACHE_TTL_MS

TTL for the in-memory read cache (default 300000 = 5 min).

HTTP_TIMEOUT_MS, HTTP_RETRIES

Per-request timeout (default 15000) and retry attempts for transient failures (default 2).

TENRAI_BASE_URL, MAL_BASE_URL, MAL_OAUTH_BASE_URL

Override upstream base URLs.

Provide these in your MCP client config's env block (the server does not read a .env file). See docs/auth.md for how to obtain the credentials, and docs/clients.md for client configuration snippets.

NSFW content

NSFW (adult) results are not filtered by default. The server returns whatever the upstream API provides. Most read tools accept two filter levels:

  • sfw: true: excludes adult/explicit-rated entries (R+ Mild Nudity and up).

  • sfw_strict: true: also excludes anything tagged with the Ecchi genre, even otherwise mainstream, safely-rated shows that sfw alone still lets through (e.g. No Game No Life, Kill la Kill).

On a list/search tool (search_anime, search_manga, get_seasonal_anime, get_upcoming_season, get_anime_schedule, get_top_anime, get_top_manga, get_random_anime, get_random_manga, get_recent_anime_recommendations, get_recent_manga_recommendations) this filters which entries come back. On a by-id lookup (get_anime, get_manga, get_anime_recommendations, get_manga_recommendations, get_character, get_person, get_anime_news, get_manga_news) the item you asked for is always returned regardless. It instead filters NSFW entries out of that item's own nested lists (e.g. an anime's relations, a person's own anime/manga credits), except on the two news tools, where it can empty the result entirely for an NSFW-rated anime/manga. get_top_people/get_top_characters have no such filter, since people/characters aren't independently content-rated the way anime/manga are.

search_anime and get_top_anime/get_seasonal_anime/get_upcoming_season also accept a rating filter for finer-grained control: target one or more specific MAL content ratings (e.g. pg13, r17) directly instead of a blanket adult-content cutoff.

Development

npm run build        # type-check + bundle to dist/
npm test             # node:test suite (mocked, offline)
npm run test:coverage
npm run lint
npm run format
npm run check:api    # live health-check of upstream endpoints
npm run inspector    # run under the MCP Inspector

Runtime requires Node ≥ 22.18. See AGENTS.md for contributor/agent guidance.

Updating

To be notified of new versions, click Watch → Releases on GitHub.

  • .mcpb bundle: download the new mal-mcp.mcpb from the releases page and reinstall it in your client (it replaces the old version).

  • From source: git pull && npm ci && npm run build.

  • npx (after npm publish): unpinned npx -y mal-mcp fetches the latest on the next run; if you pinned a version, bump it.

See the CHANGELOG for what changed in each release.

Attribution and terms

This is an unofficial project and is not affiliated with or endorsed by MyAnimeList. Read data is provided by Tenrai, a free, unofficial MAL API; please respect its rate limits. Personal-list operations use the official MyAnimeList API under your own account and token. Use is subject to the MyAnimeList Terms of Service.

Privacy Policy

mal-mcp runs locally on your machine and has no telemetry of its own. See PRIVACY.md for exactly what data it handles (including what the personal-list tools can read and change on your real MyAnimeList account), what it sends to Tenrai/MyAnimeList, and what (if anything) it stores on disk.

Security

See SECURITY.md for the read/write tool distinction, token storage, credential redaction, and how to report a vulnerability.

License

MIT © Grinv

Available Tools

54 tools
delete_my_anime_list_itemRemove anime from my listA
DestructiveIdempotent

Remove an anime entry from the authenticated user's list. This cannot be undone. Returns deleted: true whenever MAL accepts the request — including when the anime was never on the list to begin with, since MAL's own delete endpoint doesn't distinguish the two — so success alone isn't proof something existed; check get_my_anime_list first if you need to confirm. Requires a MyAnimeList login.

NameRequiredDescriptionDefault
anime_idYesMyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or from get_my_anime_list/get_my_manga_list for an entry already on your list.

Output Schema

NameRequiredDescription
deletedYes
anime_idYes

TDQS

A4.5/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond annotations: deletion is irreversible, the API returns success even when the item was never on the list, and success is not proof of prior existence. This is valuable, non-obvious behavior that agents need to interpret the result correctly.

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

Conciseness5/5

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

Every sentence earns its place: the main action, irreversibility, the surprising success-response behavior, the advice to confirm via get_my_anime_list, and the auth requirement. It is dense but not bloated, and the most important semantics are front-loaded.

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 single-parameter mutation tool with an output schema and meaningful annotations, the description fully covers purpose, auth, destructive behavior, idempotency semantics, and a verification path. There is no meaningful missing context that would prevent an agent from using the tool correctly.

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

Parameters3/5

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

The input schema already provides 100% coverage for anime_id, including its semantics, source, and naming caveat. The tool description itself adds no parameter-specific meaning, which is fine because the schema carries the full burden—exactly the baseline scenario.

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?

The description uses a specific verb ('Remove') and a clear resource ('anime entry from the authenticated user's list'), and the title/name distinguishes it from sibling delete_my_manga_list_item. It immediately answers what the tool does and for whom.

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?

The description clearly states the operation happens on the authenticated user's list, requires login, and advises checking get_my_anime_list when confirmation of prior existence is needed. It does not explicitly name delete_my_manga_list_item as the manga alternative, but the title and sibling context make that distinction obvious.

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

delete_my_manga_list_itemRemove manga from my listA
DestructiveIdempotent

Remove a manga entry from the authenticated user's list. This cannot be undone. Returns deleted: true whenever MAL accepts the request — including when the manga was never on the list to begin with, since MAL's own delete endpoint doesn't distinguish the two — so success alone isn't proof something existed; check get_my_manga_list first if you need to confirm. Requires a MyAnimeList login.

NameRequiredDescriptionDefault
manga_idYesMyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or from get_my_anime_list/get_my_manga_list for an entry already on your list.

Output Schema

NameRequiredDescription
deletedYes
manga_idYes

TDQS

A4.4/5.0
Behavior5/5

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

Even though annotations already declare destructiveHint and idempotentHint, the description goes beyond them with a specific, non-obvious behavioral fact: 'deleted: true whenever MAL accepts the request — including when the manga was never on the list to begin with.' It also warns that the action cannot be undone and clarifies that success does not prove prior existence, which is critical, non-obvious information for an agent at runtime.

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?

The action is front-loaded in the first sentence, and each subsequent clause earns its place by disclosing irreversibility, the idempotency edge case, a confirmation alternative, and the auth requirement. The middle sentence is dense with parentheticals, but nothing is wasted 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 single-parameter destructive write with a rich output schema and annotational context, the description covers purpose, irreversibility, edge-case return semantics, a verification path, and authentication requirements. Combined with annotations and schema, there's no meaningful gap an agent would need to guess at.

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

Parameters3/5

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

Schema coverage is 100%; the manga_id property is well documented in the schema with type, bounds, sourcing guidance, and a naming mismatch caveat. The description text itself adds no separate parameter semantics, so the baseline 3 holds since the structured schema is doing the heavy lifting.

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?

The description opens with a specific verb 'Remove' and an explicit resource ('manga entry from the authenticated user's list'). The resource scope cleanly distinguishes it from both the read-only get_* siblings and from its direct counterpart delete_my_anime_list_item, while the name and title reinforce that it targets manga, not anime.

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?

The description names the sibling get_my_manga_list as the correct alternative when confirmation is needed ('check get_my_manga_list first if you need to confirm'), and states the login prerequisite. It doesn't explicitly contrast with update_my_manga_status or delete_my_anime_list_item, but the scope is clear enough that this is a minor gap.

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

get_animeGet anime detailsA
Read-only

Get full details for one anime by mal_id: synopsis, score, genres, studios, streaming links, external links (official site, social media), alternate title synonyms, and related entries. moreinfo is a free-text field MAL editors sometimes add (e.g. suggested viewing order for a franchise) — usually absent. Only carries the single main trailer URL — use get_anime_videos for every promo/episode-preview/music video. Obtain the mal_id from search_anime first. sfw/sfw_strict don't affect this anime itself (its id was requested explicitly) — they filter NSFW entries out of its relations list. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which omits themes/demographics/producers/licensors/streaming/opening_themes/ending_themes/trailer/favorites/moreinfo/explicit_genres/external (no equivalent fields there) and ignores sfw/sfw_strict entirely.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
urlNo
rankNo
typeNo
yearNo
airedNo
scoreNo
titleNo
airingNo
genresNo
mal_idYes
ratingNo
seasonNo
sourceNo
statusNo
themesNo
membersNo
studiosNo
trailerNo
durationNo
episodesNo
externalNo
moreinfoNo
synopsisNo
broadcastNo
favoritesNo
image_urlNo
licensorsNo
producersNo
relationsNo
scored_byNo
streamingNo
backgroundNo
popularityNo
demographicsNo
ending_themesNo
title_englishNo
opening_themesNo
title_japaneseNo
title_synonymsNo
explicit_genresNo

TDQS

A4.8/5.0
Behavior5/5

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

Even though annotations declare readOnlyHint and openWorldHint, the description adds substantial behavioral context beyond those flags: the moreinfo field being usually absent, the trailer being only the single main URL, the sfw/sfw_strict filters applying only to the relations list and not the anime itself, and the transparent fallback to the official MAL API with a precise list of omitted fields. This level of detail exceeds what the annotations convey.

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?

The description is longer than average, but every sentence earns its place: one sentence defines the core return payload, then each subsequent sentence addresses a genuine edge case (moreinfo optionality, trailer limitation, id sourcing, sfw semantics, fallback degradation). The most important information is front-loaded, and the technical fallback detail is logically placed at the end.

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?

Given that an output schema exists, the description does not need to document return shapes, and it does not waste space doing so. It instead covers the operational aspects an agent needs: the fallback behavior when Tenrai is unavailable, which fields are lost in that fallback, the id acquisition path, and the subtle scoping of the sfw flags. Nothing an agent would need to correctly invoke this tool is missing.

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?

The schema already covers all three parameters 100%, so the baseline is 3. The description still adds meaning by clarifying that sfw/sfw_strict do not filter the requested anime itself but only its relations list, and by flagging the fallback API behavior for parameters like sfw. The id parameter is contextualized by the 'from search_anime' guidance, adding temporal semantics beyond the schema's numeric type.

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?

The description opens with a specific verb and resource — 'Get full details for one anime by mal_id' — and enumerates the concrete fields returned (synopsis, score, genres, studios, streaming links, external links, synonyms, related entries). It clearly distinguishes itself from siblings by telling the agent to use get_anime_videos for video content, and the 'get full details for one anime' framing sets it apart from search_anime, get_top_anime, and get_anime_schedule.

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

Usage Guidelines5/5

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

The description gives explicit routing guidance: 'Obtain the mal_id from search_anime first' tells the agent the prerequisite workflow, and 'use get_anime_videos for every promo/episode-preview/music video' names the alternative and the exact condition for choosing it. It also explains when the sfw parameters apply versus when they don't, leaving no ambiguity about when this tool is the right choice.

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

get_anime_charactersGet anime charactersA
Read-only

List the characters of an anime (by mal_id) with their roles and Japanese voice actors. Get the mal_id from search_anime.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.

Output Schema

NameRequiredDescription
charactersYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the 'List' verb aligns with that. The description adds useful scope around roles and voice actors, but does not disclose extra behavioral traits like pagination, missing-id handling, or malformed-data behavior. Since output schema exists, this is acceptable though minimal.

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

Conciseness5/5

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

Two short, purposeful sentences with no filler. The first sentence states the action and content, and the second gives actionable guidance for obtaining the required input. Every sentence earns its place.

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?

This is a simple one-parameter tool, and the description leaves no important gap: it identifies the target resource, the result's contents, and how to acquire the required mal_id. The output schema and annotations carry the remaining return-value and safety context.

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

Parameters3/5

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

The schema already fully documents the only parameter as 'MyAnimeList numeric ID.'. The description's 'by mal_id' reinforces this but does not add new constraints, units, examples, or meaning beyond what the schema provides. With 100% schema coverage, the baseline of 3 is appropriate.

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 ('List'), a specific resource ('characters of an anime'), and the key output contents ('roles and Japanese voice actors'). The qualifier 'by mal_id' and the pointer to 'search_anime' make it easy to distinguish from manga, people, or general-character tools.

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?

The description explicitly directs the agent to obtain the required id from 'search_anime', which is a concrete usage prerequisite. It does not name the manga equivalent as an alternative, but the anime-specific wording and id source provide enough selection context.

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

get_anime_episodesGet anime episodesA
Read-only

List an anime's episodes (by mal_id) with titles, air dates and filler/recap flags. Paginated (~100 per page); use page for long-running series. Get the mal_id from search_anime.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
pageNo1-based page number for pagination (1-20000).

Output Schema

NameRequiredDescription
pageYes
episodesYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds genuinely new behavioral context with the ~100-per-page pagination size and the presence of filler/recap flags in the results. It does not describe ordering or error behavior, which keeps it below a 5.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and result fields, followed by the pagination constraint and the prerequisite. No 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?

An output schema exists, so return values need no prose; with only two parameters and a full schema, the description covers everything an agent needs — what it lists, how pagination works, and where the required id comes from.

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; the description goes further by explaining that `page` exists specifically for long-running series and that `id` is a MyAnimeList ID obtained from search_anime, adding meaning beyond the schema's terse field docs.

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 ('List an anime's episodes') and enumerates the fields returned (titles, air dates, filler/recap flags). It is clearly distinguishable from get_anime (details) and from search_anime, which is named as the way to obtain the id.

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?

Explicitly routes the agent to search_anime for the mal_id and tells it to use `page` for long-running series. No explicit when-not guidance versus get_anime, but the usage context is unambiguous.

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

get_anime_genresGet anime genresA
Read-only

List anime genres/themes/demographics with their MAL IDs. Use this to discover the numeric IDs that the genres parameter of search_anime expects. sfw/sfw_strict drop the adult (and, for sfw_strict, Ecchi) genres from the list itself.

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
filterNoRestrict to one kind of tag. Omit to list all.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
genresYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds that sfw/sfw_strict drop genres from the list itself, which is a useful behavioral clarification about output rather than input filtering. It says nothing about result size, caching, or ordering, so the added context is modest.

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

Conciseness5/5

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

Three short sentences, zero waste, front-loaded with what is returned and immediately followed by the reason to call it. No redundancy with the schema beyond a brief needed clarification.

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

Completeness4/5

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

The output schema exists, so return values need not be described. Purpose, cross-reference to search_anime, and filter semantics are all present, making the definition sufficient for correct invocation. A minor gap: no hint that omitting `filter` returns all four tag kinds in one payload.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already carries a detailed explanation of the sfw vs sfw_strict distinction. The description's restatement of those flags adds only slight value (clarifying that whole genres disappear from the returned list), so the schema continues to do the heavy lifting.

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 ('List anime genres/themes/demographics with their MAL IDs') and names the taxonomy kinds it covers. This clearly distinguishes it from the sibling get_manga_genres and from search_anime without needing the schema opened.

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?

Explicitly routes the agent: use this to discover the numeric IDs that the `genres` parameter of search_anime expects. It covers the main case and the alternative, but gives no when-not-to-use condition (e.g., that a free-text search may be faster if the genre name is already known).

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

get_anime_interest_stacksGet interest stacks containing an animeA
Read-only

List the public MyAnimeList Interest Stacks that include a given anime (by mal_id) — useful for 'what do people group this with' and as a jumping-off point for recommendations rooted in human curation rather than vote counts. Get the mal_id from search_anime. Returns stack metadata only; pass a stack's own mal_id to get_interest_stack for its entries. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
limitNoMax results per page (1-100).
officialNoFilter by official MAL-editorial stacks. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
order_byNoField to order by. Defaults to created_at (newest stacks first).
spoilersNoFilter by stacks flagged as containing spoilers. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
challengesNoFilter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover read-only and open-world semantics, so the description's added value is the disclosure that it returns stack metadata only and that no official-API fallback exists, meaning Tenrai must be reachable. That availability caveat is genuinely useful, though it does not cover result volume or failure behavior.

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 verb and resource, then prerequisites, return scope, and availability caveat in a logical order. It is a bit dense at three clauses plus a caveat, but nearly every sentence carries actionable information.

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

Completeness4/5

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

With an output schema present and full parameter coverage, the description only needs to frame purpose, routing, and caveats, which it does. Only minor gaps remain, such as how large result sets are returned in practice.

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

Parameters3/5

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

Schema description coverage is 100%, so all ten parameters (sfw vs sfw_strict, official/spoilers/challenges tri-state enums, order_by/sort interaction) are already documented in the schema. The description adds only the origin of the required id; baseline 3 applies.

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 (List) and resource (public MyAnimeList Interest Stacks) plus the binding scope (that include a given anime by mal_id). It is clearly distinguishable from get_interest_stack (which returns entries of one stack) and get_manga_interest_stacks (the manga counterpart), both of which are named or implied in the routing sentence.

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

Usage Guidelines5/5

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

Gives an explicit use case ('what do people group this with', human-curated recommendations vs vote counts), a prerequisite ('Get the mal_id from search_anime'), and a handoff rule ('pass a stack's own mal_id to get_interest_stack'). An agent knows when to call this and what to do next.

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

get_anime_newsGet anime newsA
Read-only

List recent news articles about an anime (by mal_id): headline, date, author and excerpt. Useful for 'what's new / any announcements' questions. Get the mal_id from search_anime. Use get_news instead for a site-wide feed not tied to one anime. sfw/sfw_strict filter out articles for an NSFW/adult-adjacent anime — verified live this can cut the result down sharply (not necessarily to zero) rather than being a no-op.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover read-only and open-world, so the description adds non-obvious empirical behavior: sfw/sfw_strict filtering 'can cut the result down sharply (not necessarily to zero) rather than being a no-op.' That is genuine context beyond the schema. It's slightly redundant with the sfw/sfw_strict schema text, keeping it off a 5.

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 what it returns, then usage, then the sibling alternative, then the sfw caveat. Each sentence carries information, though the sfw sentence is long and partly retreads schema text.

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?

Output schema exists, so return values needn't be explained, yet the description still previews the fields. Combined with the mal_id sourcing hint, sibling routing, and filter caveat, an agent has everything needed to invoke this correctly.

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. The description still adds value by framing the id as a MAL id sourced from search_anime and by characterizing the real-world effect of the sfw flags, which the schema states only as a rule, not as an outcome.

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+resource+scope: 'List recent news articles about an anime (by mal_id)' and enumerates returned fields (headline, date, author, excerpt). It is clearly separable from get_news and get_manga_news without opening any schema.

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

Usage Guidelines5/5

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

Gives the question shape it answers ('what's new / any announcements'), names the prerequisite path ('Get the mal_id from search_anime'), and explicitly routes to the alternative get_news for site-wide feeds. When-to-use and when-not-to-use are both covered.

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

get_anime_recommendationsGet anime recommendationsA
Read-only

Get community recommendations for anime similar to the given mal_id, ordered by votes and capped at the top 25 (no pagination). Get the mal_id from search_anime. Use get_top_anime instead for a global popularity/score ranking not tied to one title, or get_recent_anime_recommendations for a site-wide feed of recommendation pairs not tied to this title either. sfw/sfw_strict filter NSFW entries out of the recommendation list itself. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API's own recommendations field (same output shape, but at most 10 entries, ordering may differ from Tenrai's, and sfw/sfw_strict are ignored entirely).

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
recommendationsYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, but the description adds substantial operational detail: ordered by votes, capped at 25 with no pagination, and a transparent fallback that changes result count, ordering, and ignores sfw/sfw_strict. That is rich behavioral context beyond annotations.

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

Conciseness5/5

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

The description is a single dense paragraph but front-loads the main purpose, then alternatives, then filter behavior, then fallback. Every sentence earns its place with no redundant or vague 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?

With an output schema present, the description needn't explain return values. It covers the key operational caveats (cap, no pagination, ordering, fallback limitations) and points to the correct source for the required id. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents id, sfw, and sfw_strict thoroughly. The description briefly reiterates that sfw/sfw_strict filter NSFW entries, adding slight context ('of the recommendation list itself'), but does not add syntax or format guidance beyond what the schema provides. Baseline 3 is appropriate.

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 community recommendations for anime similar to the given mal_id') along with scope, ordering, and cap. Explicitly distinguishes from siblings get_top_anime and get_recent_anime_recommendations, so an agent can route correctly without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance: 'Get the mal_id from search_anime' and names the two alternatives with the conditions that select them. Also describes the fallback path (Tenrai unavailable) so the agent knows what to expect in that case.

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

get_anime_reviewsGet anime reviewsA
Read-only

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.

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

NameRequiredDescription
pageYes
reviewsYes

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.

get_anime_scheduleGet broadcast scheduleA
Read-only

Get the anime broadcast schedule (air times in JST), optionally for a single weekday (or the unknown/other buckets Tenrai uses for shows with no fixed weekly slot). broadcast is only present for currently-airing shows. Defaults to 25 results if limit is omitted; use page for further results.

NameRequiredDescriptionDefault
dayNoWeekday to filter by, or `unknown`/`other` for shows with no fixed weekly slot. Omit for the whole week.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
kidsNoIf true, exclude entries tagged as children's/kids content. Defaults to false.
pageNo1-based page number for pagination (1-20000).
limitNoMax results per page (1-100).
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
unapprovedNoEntries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnly/openWorld, and the description adds genuinely useful behavior: `broadcast` is only populated for currently-airing shows, and the `unknown`/`other` buckets exist for slot-less entries. It does not cover rate limits or result-shape caveats beyond that, so not a 5.

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?

Three compact sentences, front-loaded with the core purpose and then the filter and pagination notes. Every clause carries information, though the parenthetical about the unknown/other buckets overlaps with the schema's own wording.

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?

An output schema exists, so return values need not be explained, and all seven optional parameters are documented in the schema. The description covers the remaining ambiguity an agent would face: the JST time basis, when `broadcast` is absent, and pagination defaults.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains day, sfw, kids, page, limit, unapproved and the sfw/sfw_strict distinction in detail. The description restates the weekday/unknown/other semantics and the 25-result default without adding syntax or behavior the schema lacks, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Get the anime broadcast schedule') and adds a meaningful qualifier (air times in JST, optional weekday filter) that separates it from the seasonal/upcoming tools. It never names a sibling such as get_seasonal_anime or get_anime_episodes, so the differentiation is left implicit.

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

Usage Guidelines3/5

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

The description tells the agent how to use the filters ('optionally for a single weekday') and the paging defaults, but says nothing about when this tool is preferable to get_seasonal_anime, get_upcoming_season, or get_anime_episodes. Usage is implied by the resource rather than stated.

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

get_anime_staffGet anime staffA
Read-only

List the production staff of an anime (by mal_id) — director, composer, etc. — with their roles. Complements get_anime_characters (which covers voice actors). Get the mal_id from search_anime.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.

Output Schema

NameRequiredDescription
staffYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, covering the safety profile. The description adds context about listing roles but does not disclose additional behavioral traits like pagination or performance. With annotations present, the description adds minimal extra value.

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

Conciseness5/5

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

Two sentences with no wasted words. Information is front-loaded: action, scope, and role types are immediately clear. Every sentence serves a purpose.

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

Completeness4/5

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

Given the low complexity (1 parameter, no nested objects) and presence of an output schema, the description is sufficient. It explains the tool's purpose and relationship to a sibling. Minor gap: it doesn't describe the return structure, but output schema covers that.

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% with a single required id parameter. The description adds meaning by specifying that the id is a MyAnimeList numeric ID (mal_id) and that it can be obtained from search_anime, which goes beyond the schema's description.

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?

The description clearly states it lists production staff of an anime by mal_id, specifying roles like director and composer. It explicitly distinguishes itself from the sibling tool get_anime_characters, which covers voice actors, making the purpose unambiguous.

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?

The description provides clear usage context by indicating that the mal_id should come from search_anime and that this tool complements get_anime_characters. However, it does not explicitly state when not to use this tool or list alternative tools beyond the mentioned sibling.

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

get_anime_statisticsGet anime statisticsA
Read-only

Get watch-status counts (watching/completed/…) and the score distribution for an anime by mal_id. Get the mal_id from search_anime. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which omits the score distribution (scores) entirely — no equivalent field there.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.

Output Schema

NameRequiredDescription
totalNo
scoresNo
droppedNo
on_holdNo
readingNo
watchingNo
completedNo
plan_to_readNo
plan_to_watchNo

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses a critical behavioral trait: transparent retry via official API when Tenrai is unavailable, and that in that case the scores field is entirely omitted. This adds value beyond the annotations (readOnlyHint, openWorldHint) by explaining a non-obvious data loss scenario.

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

Conciseness5/5

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

The description is concise with two sentences. The first sentence states purpose and output, the second provides fallback behavior. No unnecessary words, front-loaded with key information.

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?

Given the tool's simplicity (1 param, output schema present, annotations covering safety), the description is complete. It covers purpose, input source, fallback behavior, and output variation. No gaps remain.

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% with a clear description for the single parameter 'id'. The description adds value by instructing the user to obtain the mal_id from search_anime, which provides context for parameter acquisition. This exceeds the baseline of 3 for high coverage.

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?

The description clearly states the verb 'Get' and the resource 'watch-status counts and score distribution for an anime by mal_id'. It is specific and distinguishes from sibling tools like 'get_anime' which fetches basic info, and 'search_anime' which is used to obtain the mal_id.

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?

The description tells the user to 'Get the mal_id from search_anime', providing context on how to obtain the required input. It also explains the fallback behavior when Tenrai is unavailable, including the omission of scores, which guides usage expectations. However, it does not explicitly state when not to use this tool or list alternatives.

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

get_anime_videosGet anime videosA
Read-only

List an anime's promotional videos (PVs/trailers), episode preview clips, and music videos (openings/endings), each with a title, watch URL, thumbnail, and view/like counts where available. This is richer than get_anime's single trailer field — use this instead when the caller wants every promo, not just the main one. Get the mal_id from search_anime.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.

Output Schema

NameRequiredDescription
promoYes
episodesYes
music_videosYes

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, and the description does not contradict this. Beyond that, the description discloses the scope of results (multiple video categories), the per-item attributes returned, and the 'where available' caveat for count data. It does not discuss rate limits or authentication, but those are less critical for a read-only, single-ID lookup with a full output schema.

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

Conciseness5/5

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

Three sentences with no filler. The first sentence front-loads the core action and scope, the second differentiates from a sibling, and the third gives a necessary prerequisite. Every sentence earns its place.

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?

With one trivial parameter, a full input schema, an output schema, and read-only annotations, the description is complete for an agent to select and invoke the tool correctly. It even provides the upstream workflow for obtaining the required ID.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents id as a MyAnimeList numeric ID with bounds. The description adds the practical instruction to fetch that ID from search_anime, which is useful, but it does not need to restate parameter details already covered by the schema. Baseline 3 is appropriate.

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?

The description names a specific verb ('List'), a specific resource ('an anime's promotional videos'), and enumerates concrete content types: PVs/trailers, episode preview clips, and music videos. It also explicitly contrasts itself with get_anime's single trailer field, so an agent can distinguish this tool from its closest sibling without opening either schema.

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

Usage Guidelines5/5

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

The description states when to prefer this tool: when the caller wants every promo rather than just the main one. It also directs the agent to search_anime to obtain the required mal_id, which is a direct prerequisite for invoking the tool correctly.

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

get_characterGet character detailsA
Read-only

Get full details for one character by mal_id: bio, the anime/manga they appear in, and their voice actors. Obtain the mal_id from search_characters or get_anime_characters. sfw/sfw_strict filter NSFW/adult-adjacent titles out of the character's own anime/manga appearance lists (verified live) rather than affecting the character itself.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
urlNo
nameNo
aboutNo
animeNo
mangaNo
mal_idYes
favoritesNo
image_urlNo
nicknamesNo
name_kanjiNo
voice_actorsNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations (readOnlyHint, openWorldHint) indicate safety and dynamic data. The description goes beyond by detailing the sfw/sfw_strict parameters' effect on appearance lists, noting the live filtering behavior and the distinction between sfw (allows Ecchi) and sfw_strict (excludes Ecchi). No contradictions.

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

Conciseness5/5

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

The description is front-loaded with the primary purpose, then efficiently covers parameter details in two additional sentences. Every sentence earns its place—no redundancy or 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?

With an output schema present, the description need not detail return values. It covers purpose, ID source, and parameter behavior thoroughly. For a straightforward lookup tool, this is complete and leaves no gaps.

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 covers all parameters (100%), giving baseline 3. The description adds crucial context: sfw/sfw_strict filter the character's appearance lists, not the character itself. This additional explanation aids correct parameter understanding beyond the schema.

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?

The description clearly states the tool retrieves full details for one character by mal_id, including bio, appearances, and voice actors. It also tells how to obtain the mal_id, distinguishing it from search_characters (which lists characters) and get_anime_characters (which lists characters for an anime). The verb 'Get' and resource 'character' are specific, making purpose unmistakable.

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?

The description explicitly instructs to obtain the mal_id from search_characters or get_anime_characters, providing clear guidance on prerequisite actions. It does not explicitly state when not to use, but for a simple lookup tool, this is sufficient and avoids confusion with siblings.

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

get_interest_stackGet one interest stackA
Read-only

Get one MyAnimeList Interest Stack by mal_id, with its entries in the curator's own order — each carrying that curator's score (author_score) and note. Obtain the stack's mal_id from get_interest_stacks, get_anime_interest_stacks or get_manga_interest_stacks. Every entry's own mal_id chains into get_anime or get_manga (the stack's stack_type says which). sfw/sfw_strict filter NSFW entries out of the entry list rather than hiding the stack itself. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID of the interest stack.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
urlNo
titleNo
mal_idYes
entriesNo
author_urlNo
created_atNo
is_spoilerNo
stack_typeNo
descriptionNo
entry_countNo
is_officialNo
is_challengeNo
restack_countNo
author_usernameNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate this is read-only, and the description adds valuable behavioral nuance: sfw and sfw_strict filter entries rather than hiding the stack itself, entry order is curator-defined, and the tool has no official-API fallback. This goes well beyond what the annotations alone communicate.

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

Conciseness5/5

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

The description is concise and front-loaded, with the primary action stated first and supporting usage details following efficiently. Every sentence adds meaningful context, from entry ordering to chaining behavior to the absence of an API fallback.

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?

The description is complete for a read-only retrieval tool with a rich output schema. It tells the agent how to identify the stack, how to interpret recorded entry data, how sfw filtering behaves, and what dependency exists on Tenrai. Nothing essential is missing.

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 useful semantic detail: the id is sourced from sibling stack-list tools, and sfw/sfw_strict operate on the entry list rather than hiding the stack. This reinforces and clarifies what the schema definitions already provide.

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?

The description states exactly what the tool does: fetch one MyAnimeList Interest Stack by mal_id, including entries in the curator's order with author_score and note. It also clearly distinguishes this from the sibling list-fetching tools by explaining how mal_id is obtained from them.

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?

The description provides concrete guidance on how to obtain the mal_id from related interest-stack list tools and how each entry's mal_id can be chained into get_anime or get_manga. It does not explicitly enumerate when not to use this tool, but the usage context is clear and practical.

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

get_interest_stacksBrowse interest stacksA
Read-only

Browse or search MyAnimeList Interest Stacks: themed anime/manga lists curated by real users, each entry carrying the curator's own score and note. Use this for taste- or mood-shaped requests ('something melancholy', 'cozy slice-of-life') where a ranking or a genre filter is the wrong instrument — get_top_anime answers 'what is best', this answers 'what goes together'. Returns stack metadata only; pass a stack's mal_id to get_interest_stack for its actual entries. For stacks containing one specific title, use get_anime_interest_stacks/get_manga_interest_stacks instead. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
qNoFree-text search over stack titles and descriptions. Omit to browse all.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
limitNoMax results per page (1-100).
officialNoFilter by official MAL-editorial stacks. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
order_byNoField to order by. Defaults to created_at (newest stacks first).
spoilersNoFilter by stacks flagged as containing spoilers. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
challengesNoFilter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
stack_typeNoRestrict to anime stacks or manga stacks. Omit for both.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover read-only and open-world nature, and the description adds the non-obvious operational facts: it returns stack metadata only (not entries), and it has no official-API fallback so Tenrai must be reachable. That availability constraint is exactly the kind of behavior an agent cannot infer from structured fields and would otherwise discover only by failing.

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

Conciseness5/5

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

Purpose and the routing contrast to get_top_anime land in the first two sentences; the metadata-only caveat, per-title alternatives, and availability dependency follow in dependency order. The illustrative mood examples are compact and directly serve tool selection rather than padding.

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 an 11-parameter browse tool with an output schema, the description covers what an agent still needs: what family of tool this belongs to, the return-shape boundary (metadata vs entries), the two-step path to actual entries, and the availability prerequisite. Nothing required for a correct call is missing or left to inference.

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

Parameters3/5

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

With 11 parameters at 100% schema description coverage, the schema already documents search, pagination, sorting, and every filter enum in detail. The description only implies the browse-vs-search distinction ('Browse or search') and adds no syntax or constraint detail beyond the schema, so the baseline 3 applies.

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 pair (browse/search) and a specific resource (MyAnimeList Interest Stacks), then defines what the resource actually is: user-curated themed anime/manga lists with per-entry curator scores and notes. This is clearly separable from get_top_anime, search_anime, and get_interest_stack without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit trigger class ('taste- or mood-shaped requests' such as 'something melancholy' or 'cozy slice-of-life') plus the negative case where a ranking or genre filter is the wrong instrument. It also names three alternatives with the conditions selecting them: get_top_anime for 'what is best', get_interest_stack for a stack's entries, and get_anime_interest_stacks/get_manga_interest_stacks for one specific title.

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

get_magazinesGet manga magazinesA
Read-only

List or search manga serialization magazines/publishers (e.g. Weekly Shonen Jump) with their MAL IDs and manga counts. Use q to search by name, or look up an ID here for search_manga's magazines filter.

NameRequiredDescriptionDefault
qNoFilter by name.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
limitNoMax results per page (1-100).
letterNoRestrict results to entries whose title starts with this single letter.
order_byNoField to order by.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-data scope are covered. The description adds useful behavioral detail by saying results include MAL IDs and manga counts and by explaining the relationship to search_manga's magazines filter.

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

Conciseness5/5

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

Two compact sentences front-load the tool's function and then give the key usage instruction. There is no redundant or filler text.

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?

The description is complete for a read-only lookup/list tool: it explains what is returned, how to search, and how the result feeds another tool. Rich schema coverage and an output schema mean pagination and return structure need not be repeated.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters, including pagination, sorting, and filtering behavior. The description only elaborates on `q`, but with full schema coverage that is sufficient to meet the baseline.

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?

The description states a specific verb and resource: list or search manga serialization magazines/publishers. It also names a concrete example, clarifies that results include MAL IDs and manga counts, and connects the tool to search_manga's magazines filter, so an agent can distinguish it from siblings.

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?

It gives clear usage context: use `q` to search by name, or look up an ID for use with search_manga's `magazines` filter. It does not explicitly state when not to use this tool, but the intended usage is clear and tied to a related sibling workflow.

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

get_mangaGet manga detailsA
Read-only

Get full details for one manga by mal_id: synopsis, score, genres, authors, serialization, external links (official site, social media), alternate title synonyms, and related entries. Obtain the mal_id from search_manga first. sfw/sfw_strict don't affect this manga itself (its id was requested explicitly) — they filter NSFW entries out of its relations list. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which omits themes/demographics/favorites/moreinfo/explicit_genres/external (no equivalent fields there) and ignores sfw/sfw_strict entirely.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
urlNo
rankNo
typeNo
scoreNo
titleNo
genresNo
mal_idYes
statusNo
themesNo
authorsNo
membersNo
volumesNo
chaptersNo
externalNo
moreinfoNo
synopsisNo
favoritesNo
image_urlNo
publishedNo
relationsNo
scored_byNo
backgroundNo
popularityNo
publishingNo
demographicsNo
title_englishNo
serializationsNo
title_japaneseNo
title_synonymsNo
explicit_genresNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, it transparently discloses that sfw/sfw_strict only filter the related entries list, not the requested manga. It also reveals fallback behavior to the official MAL API under specific conditions, listing exactly which fields are omitted and that sfw flags are ignored there.

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

Conciseness5/5

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

Three sentences, with the primary purpose and return scope front-loaded. The longer third sentence is justified because it contains unique health fallback behavior that could not be inferred only from the schema.

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?

With a complete output schema, 100% parameter documentation, and detailed fallback behavior, an agent has enough to call this tool correctly. The only missing syntactic instructions (such as how to return fields) are covered by structured schemas.

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?

The schema already documents all three parameters at 100% coverage, so the baseline is decent. The description adds meaningful enhancement by explaining how sfw/sfw_strict affect only the relations list, and how the fallback path ignores them.

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?

The description uses a specific verb and resource ('get full details for one manga by mal_id') and itemizes the returned data: synopsis, score, genres, serialization, external links, and related entries. This clearly distinguishes the tool from search or character/recommendation siblings.

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?

It explicitly instructs the agent to obtain the mal_id from search_manga first, which is a critical workflow prerequisite. It lacks an explicit 'when not to use' statement, but the prerequisite and the detailed scope make the intended usage clear.

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

get_manga_charactersGet manga charactersA
Read-only

List the characters of a manga (by mal_id) with their roles. Get the mal_id from search_manga.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.

Output Schema

NameRequiredDescription
charactersYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare this as a read-only operation. The description adds useful detail about including roles and using mal_id, but it does not disclose deeper behavioral traits such as pagination, return size, or sorting. The description is consistent with the annotations.

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

Conciseness5/5

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

Two short sentences. The main purpose is front-loaded, and the ID-source instruction is exactly the kind of practical information that earns its place. No wasted words.

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 single-parameter, read-only tool with an output schema, the description is complete. It specifies what the tool returns, what input is needed, and how to find that input. There is no major missing information.

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%, and the schema already explains that 'id' is a MyAnimeList numeric ID. The description adds value by clarifying that the ID is the manga's mal_id and pointing the agent to search_manga as the source for obtaining it.

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

Purpose4/5

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

The description clearly states the action ('List the characters of a manga'), the resource ('manga'), and the kind of detail returned ('with their roles'). It does not explicitly compare against the sibling get_anime_characters, but the resource 'manga' differentiates the tool well enough.

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?

The description explicitly tells the agent how to obtain the required ID ('Get the mal_id from search_manga'), which is clear and actionable. It does not explicitly discuss when not to use the tool or alternative tools, so it stops short of a 5.

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

get_manga_genresGet manga genresA
Read-only

List manga genres/themes/demographics with their MAL IDs. Use this to discover the numeric IDs that the genres parameter of search_manga expects. sfw/sfw_strict drop the adult (and, for sfw_strict, Ecchi) genres from the list itself.

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
filterNoRestrict to one kind of tag. Omit to list all.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
genresYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly and openWorld, so the safety profile is covered. The description goes further by disclosing that sfw/sfw_strict remove genres from the returned list itself and that sfw_strict additionally drops Ecchi — an effect on output content, not just on filtering, which is real added context.

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

Conciseness5/5

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

Three short sentences: purpose, downstream use, and filter side-effect — ordered by importance with zero filler. Nothing needs trimming and nothing is buried.

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

Completeness4/5

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

With an output schema available and full parameter documentation, the description needn't explain return shapes. It covers purpose, routing, and filter consequences; the only minor omission is any mention of the `filter` parameter's role, which the schema handles well.

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

Parameters3/5

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

Schema description coverage is 100%, including the sfw/sfw_strict distinction and the filter enum, so the schema does the heavy lifting. The description's restatement of the sfw behavior is a useful summary but adds no syntax or format detail beyond the schema, so baseline 3 applies.

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 (list manga genres/themes/demographics) plus what the output carries (MAL IDs). The 'manga' qualifier cleanly separates it from the sibling get_anime_genres without either schema being opened.

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?

Explicitly routes the agent: use this to obtain numeric IDs that search_manga's `genres` parameter expects, naming the consuming sibling. It stops short of stating when not to use it (e.g. versus get_anime_genres), but the manga scoping makes the alternative obvious.

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

get_manga_interest_stacksGet interest stacks containing a mangaA
Read-only

List the public MyAnimeList Interest Stacks that include a given manga (by mal_id). The manga counterpart of get_anime_interest_stacks. Get the mal_id from search_manga. Returns stack metadata only; pass a stack's own mal_id to get_interest_stack for its entries. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
limitNoMax results per page (1-100).
officialNoFilter by official MAL-editorial stacks. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
order_byNoField to order by. Defaults to created_at (newest stacks first).
spoilersNoFilter by stacks flagged as containing spoilers. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
challengesNoFilter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description rightly focuses on what they can't express: it returns stack metadata only (not entries) and has no official-API fallback, meaning it hard-fails if Tenrai is unreachable. That dependency/failure-mode disclosure is valuable; pagination and rate behavior are left to the schema.

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

Conciseness5/5

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

Four short sentences, front-loaded with the purpose, then sibling comparison, then return-scope, then operational caveat. Nothing is repeated from the schema and every sentence carries distinct information.

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

Completeness4/5

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

With an output schema present, return values needn't be explained, and the description correctly limits itself to clarifying that only stack metadata comes back. It covers discovery path, follow-up tool, and the no-fallback constraint; the only gap is not hinting at the filtering/ordering options, which the schema handles fully.

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

Parameters3/5

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

Schema coverage is 100% and the 10 filter/pagination parameters (sfw, sfw_strict, official, spoilers, challenges, sort/order_by) are documented in detail there. The description adds only that the id is a manga mal_id, which is mildly useful but not meaningfully beyond the schema — baseline 3 is appropriate.

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 ('List the public MyAnimeList Interest Stacks that include a given manga') and immediately scopes the result to public stacks for one manga id. It explicitly distinguishes itself from get_anime_interest_stacks and get_interest_stack, so an agent can route without opening schemas.

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 concrete workflow guidance: get the mal_id from search_manga, and pass a stack's own mal_id to get_interest_stack for entries. No explicit 'when not to use' or alternative-listing condition, but the sibling relationships make the boundaries clear.

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

get_manga_newsGet manga newsA
Read-only

List recent news articles about a manga (by mal_id): headline, date, author and excerpt. Useful for 'what's new / any announcements' questions. Get the mal_id from search_manga. Use get_news instead for a site-wide feed not tied to one manga. sfw/sfw_strict filter out articles for an NSFW/adult-adjacent manga — verified live this can cut the result down sharply (not necessarily to zero) rather than being a no-op.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds non-obvious behavioral context: that sfw/sfw_strict filtering can sharply reduce results rather than being a no-op, which was 'verified live'. Pagination behavior is left to the schema, so not quite a 5.

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 verb, resource, and return fields in the first sentence, then routing guidance and the filtering caveat. Dense and nearly waste-free, though the sfw nuance sentence is lengthy.

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?

With a full output schema, 100% parameter coverage, and clear sibling routing, the description supplies everything an agent needs to call this correctly, including the id source and the filter caveat.

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% with rich per-parameter descriptions, so the baseline is 3. The description goes beyond by characterizing the real-world effect of sfw/sfw_strict filtering (sharp reduction, not necessarily zero), adding meaning the schema doesn't convey.

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 ('List recent news articles about a manga') plus the exact fields returned (headline, date, author, excerpt). It explicitly distinguishes itself from the get_news sibling for site-wide feeds, so an agent can pick it without opening the schema.

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

Usage Guidelines5/5

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

Says it's for 'what's new / any announcements' questions, directs the agent to obtain the mal_id from search_manga, and names the alternative (get_news) with the condition that selects it. When-to-use, prerequisite sourcing, and exclusion are all explicit.

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

get_manga_recommendationsGet manga recommendationsA
Read-only

Get community recommendations for manga similar to the given mal_id, ordered by votes and capped at the top 25 (no pagination). Get the mal_id from search_manga. Use get_top_manga instead for a global popularity/score ranking not tied to one title, or get_recent_manga_recommendations for a site-wide feed of recommendation pairs not tied to this title either. sfw/sfw_strict filter NSFW entries out of the recommendation list itself. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API's own recommendations field (same output shape, but at most 10 entries, ordering may differ from Tenrai's, and sfw/sfw_strict are ignored entirely).

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
recommendationsYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare read-only and open-world behavior, while the description adds the 25-entry cap, no pagination, vote ordering, NSFW filtering of the recommendation list, and a detailed fallback path with changed entry count, possible ordering differences, and ignored sfw flags. This is substantial context beyond the annotations.

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

Conciseness5/5

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

Front-loads the core purpose and cap, then efficiently covers id sourcing, sibling alternatives, filtering, and fallback behavior. Every sentence carries operational information without 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 read-only lookup with annotations and an output schema, the description covers selection guidance, parameter sourcing, filtering semantics, result cap, and degraded-mode behavior. Nothing material is missing.

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% and the sfw fields are already well documented, so baseline is 3. The description adds where to get mal_id, clarifies that filtering applies to the recommendation list itself, and notes that fallback ignores sfw/sfw_strict.

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, including scope, vote ordering, and the top-25 cap. It explicitly distinguishes itself from get_top_manga and get_recent_manga_recommendations, so an agent can select it confidently among siblings.

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

Usage Guidelines5/5

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

Explicitly tells the agent to obtain mal_id from search_manga and names two alternatives with the conditions that select them. It also clarifies sfw filtering behavior and when the official API fallback applies.

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

get_manga_reviewsGet manga reviewsA
Read-only

Get user reviews for one manga (by mal_id): review text (truncated to 1200 characters), score, spoiler/preliminary flags, chapters read at review time (chapters_read, not episodes_watched — that field is anime-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_manga.

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

NameRequiredDescription
pageYes
reviewsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description carries most of the burden and does well: it discloses the 1200-character truncation of review text, that `limit` caps the already-filtered page rather than triggering new fetches, and that Tenrai lists roughly 20 per page. It says nothing about auth needs, rate limits, or error behavior, so it is strong but not exhaustive.

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 identifier, then the pagination/cap mechanics, then the id-sourcing pointer. Dense with parenthetical asides, but each one (truncation length, chapters_read caveat, 20-per-page) is load-bearing rather than 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?

With an output schema handling return shape and annotations covering safety, the description fills the remaining gaps: identifier source, pagination model, filter-before-cap ordering, and truncation. An agent has everything needed to call this correctly on the first try.

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 a 3 would be the floor, but the description adds real meaning the schema does not: filters and sort are applied before `limit` truncates the result, and `page` is tied to a ~20-per-page listing model. That ordering detail is exactly the kind of clarification a schema cannot express.

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 manga') and scopes it by mal_id. It also distinguishes itself from the anime counterpart by explicitly noting `chapters_read` versus `episodes_watched` being anime-only, so an agent can separate it from get_anime_reviews without opening a schema.

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?

Tells the agent where to source the identifier ('Get the mal_id from search_manga') and clarifies the limit-versus-page relationship, which is the main misuse risk here. It stops short of naming get_anime_reviews as the alternative for anime, leaving that routing to inference from the chapters_read remark.

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

get_manga_statisticsGet manga statisticsA
Read-only

Get read-status counts (reading/completed/…) and the score distribution for a manga by mal_id. Get the mal_id from search_manga. Unlike get_anime_statistics, no official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.

Output Schema

NameRequiredDescription
totalNo
scoresNo
droppedNo
on_holdNo
readingNo
watchingNo
completedNo
plan_to_readNo
plan_to_watchNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, indicating a safe, immutable operation. The description adds critical behavioral context: 'no official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.' This provides information beyond what annotations capture.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with the tool's purpose, and every part earns its place—no filler. It is efficient and easy to parse.

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?

Given one parameter with full schema coverage and an output schema present, the description adequately covers what the tool returns, how to obtain the input, and a key behavioral distinction from a sibling tool. Nothing essential is missing.

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?

With 100% schema description coverage, the baseline is 3. The description adds value by explaining that the parameter is a mal_id and instructing the agent to get it from search_manga, which aids correct parameter selection beyond the schema's simple description.

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?

The description clearly states the tool gets read-status counts and score distribution for a manga by mal_id. It uses a specific verb and resource, and distinguishes itself from get_anime_statistics by mentioning the absence of an official-API fallback.

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?

The description explicitly tells the agent to obtain the mal_id from search_manga, providing clear usage context. It also contrasts with get_anime_statistics regarding the fallback, but does not enumerate alternative tools or conditions for when not to use this tool.

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

get_my_anime_listGet my anime listA
Read-only

Get the authenticated user's own anime list, with each entry's status, score and progress. Requires a MyAnimeList login.

NameRequiredDescriptionDefault
sortNoSort order. list_score/list_updated_at return highest/most-recent first; anime_title returns A-Z.
limitNoMax results (1-1000).
offsetNoOffset for pagination.
statusNoList status bucket.

Output Schema

NameRequiredDescription
itemsYes
has_next_pageYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds the authentication requirement ('Requires a MyAnimeList login'), which is operationally critical and not expressed in the annotations or schema. It also discloses the shape of each entry, which helps the agent decide it is the personal list rather than catalog data. That said, it says nothing about empty-list or pagination behavior.

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

Conciseness5/5

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

Two sentences, no waste, with the core purpose stated first and the auth precondition second. Every clause earns its place.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and filtering and pagination are fully specified in the schema. The description covers purpose and auth. It is slightly thin on how the list is scoped or paginated across a large collection, but it is sufficient for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and all four parameters (sort, limit, offset, status) are documented in the schema, including enum semantics and sort ordering. The description adds no parameter-level guidance, so the baseline score of 3 applies.

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

Purpose4/5

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

Specific verb plus resource ('Get the authenticated user's own anime list') with the scope qualifier 'authenticated user's own', which separates it from the public catalog siblings like get_anime and search_anime. It also enumerates the returned fields (status, score, progress). It does not name get_my_manga_list as the manga counterpart, so sibling differentiation is implicit rather than explicit.

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

Usage Guidelines3/5

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

'Requires a MyAnimeList login' gives a useful precondition, which implies the tool is only for the logged-in user's private data. But there is no explicit statement of when to use it versus the read siblings or versus the mutation siblings update_my_anime_status and delete_my_anime_list_item. So usage must be inferred from context.

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

get_my_manga_listGet my manga listA
Read-only

Get the authenticated user's own manga list, with status, score and progress. Requires a MyAnimeList login.

NameRequiredDescriptionDefault
sortNoSort order. list_score/list_updated_at return highest/most-recent first; manga_title returns A-Z.
limitNoMax results (1-1000).
offsetNoOffset for pagination.
statusNoList status bucket.

Output Schema

NameRequiredDescription
itemsYes
has_next_pageYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-dependency profile is covered. The description adds one genuinely useful behavioral fact beyond annotations: a MyAnimeList login is required. It says nothing about pagination behavior, empty-list handling, or result caps, so the value added is modest.

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

Conciseness5/5

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

Two short sentences with zero waste: the core action comes first, followed by the prerequisite. Nothing is repeated from the schema or annotations.

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

Completeness4/5

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

With 0 required params, full schema coverage, an output schema, and read-only annotations, the description only needs to establish identity and the auth precondition, which it does. A note on pagination/limit interaction with large lists would make it complete, but no essential information is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both enums (sort, status) are documented inline, so the schema carries the parameter burden. The description's mention of 'status, score and progress' refers to returned fields rather than adding meaning about the parameters; it neither clarifies nor misleads.

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

Purpose4/5

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

States a specific verb and resource ('Get the authenticated user's own manga list') and scopes it to the current user, which separates it from get_manga / search_manga. It does not explicitly name the sibling alternative it competes with (e.g., get_my_anime_list, get_manga), but the 'own/authenticated' qualifier makes the distinction inferable.

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

Usage Guidelines3/5

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

Usage is implied by 'the authenticated user's own manga list' and the login prerequisite, so an agent can tell this is for personal list data rather than catalog lookup. However, there is no explicit when-to-use/when-not guidance and no named alternative (e.g., 'use search_manga for public catalog data').

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

get_my_user_infoGet my MAL profileA
Read-only

Get the logged-in user's MyAnimeList profile and anime watch-status statistics. Requires a MyAnimeList login. Anime-only — the official API has no manga statistics field at all, and there is no tool for a user's manga read stats.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idYes
nameYes
locationNo
joined_atNo
anime_statisticsNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, which covers the safe-read profile. The description adds genuinely new behavioral context beyond them: authentication is required and the data domain is restricted to anime because the upstream API exposes no manga statistics field.

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

Conciseness5/5

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

Three short sentences, front-loaded with what is returned, then the auth prerequisite, then the scope caveat. Nothing is redundant and every sentence carries information an agent needs.

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?

An output schema exists, so return-value detail is unnecessary, and the tool takes no arguments. Given annotations already cover safety and openness, the description supplies exactly the missing pieces: auth requirement and the anime-only limitation.

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?

Zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. 'Logged-in user' usefully confirms the identity is implicit (derived from session) rather than a caller-supplied argument.

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?

Specific verb+resource: returns the logged-in user's MAL profile plus anime watch-status statistics. It is clearly distinguished from siblings get_my_anime_list (list entries) and get_anime_statistics (site-wide stats), and the anime-only scope is stated up front.

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?

Supplies the key prerequisite ('Requires a MyAnimeList login') and a negative rule that saves wasted calls: there is no manga-stats counterpart, so the agent should not go hunting for one. It stops short of explicitly naming get_my_manga_list or login_mal as the fallback/routing options.

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

get_newsGet anime/manga newsA
Read-only

List recent MyAnimeList news articles site-wide (headline, date, author, excerpt) — not tied to one anime or manga. Use q to search by keyword or tag to filter by topic tag. Use get_anime_news/get_manga_news instead for news about one specific anime/manga by mal_id. sfw/sfw_strict drop articles about adult content.

NameRequiredDescriptionDefault
qNoSearch query, e.g. a keyword or title. Verified live to search beyond just the headline (a real, unfamiliar-sounding title can still match) — don't assume a result's title visibly contains the term.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
tagNoFilter by topic tag.
pageNo1-based page number for pagination (1-20000).
limitNoMax results per page (1-100).
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context — that results are site-wide rather than entity-scoped, and that sfw/sfw_strict drop adult-content articles — but the sfw semantics largely duplicate the schema text and nothing is said about pagination limits or result-set size.

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

Conciseness5/5

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

Three tight sentences: scope first, then filtering, then sibling routing, then the sfw caveat. No filler, and the most disambiguating information (site-wide vs entity-scoped) is front-loaded.

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

Completeness4/5

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

With an output schema present, the description needn't explain return fields, and it correctly avoids that. It covers scope, routing and filtering, but leaves pagination behavior (page/limit defaults) entirely to the schema, a minor gap for a paginated list endpoint.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented in detail (including the sfw vs sfw_strict nuance). The description's mention of q and tag restates what the schema says rather than adding new semantics; baseline 3 is appropriate when the schema does the heavy lifting.

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 ("List recent MyAnimeList news articles") plus the fields returned and the site-wide scope. It explicitly contrasts with get_anime_news/get_manga_news, so an agent can distinguish it from siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit routing: use q for keyword search, tag for topic filtering, and the sfw/sfw_strict pair for content filtering. It names the two sibling tools to use instead when the request is scoped to one anime or manga by mal_id, which is exactly the when-not guidance an agent needs.

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

get_personGet person detailsA
Read-only

Get full details for one person by mal_id: bio, their anime/manga staff-credit lists, and their voiced roles. Staff credits are capped at the first 200 (only an extreme outlier hits that — a prolific sound director can have 500+; a well-known director sits under 100); when the cap bites, the response says so via credits_truncated plus total_anime_credits/total_manga_credits, and full_credits: true returns every entry. voice_roles is separately capped at the first 50, in whatever order the upstream API returns them (not necessarily their most notable roles). Obtain the mal_id from search_people, or from get_character's voice_actors (which include each actor's mal_id — get_anime_characters' voice_actors are names only, with no id). sfw/sfw_strict filter NSFW/adult-adjacent titles out of the person's own anime/manga credit lists (verified live) rather than affecting the person themselves.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
full_creditsNoIf true, return every staff credit instead of the first 200. Only needed for the handful of people whose response reports `credits_truncated`. Defaults to false.

Output Schema

NameRequiredDescription
urlNo
nameNo
aboutNo
animeNo
mangaNo
mal_idYes
birthdayNo
favoritesNo
image_urlNo
given_nameNo
family_nameNo
voice_rolesNo
alternate_namesNo
credits_truncatedNo
total_anime_creditsNo
total_manga_creditsNo

TDQS

A4.6/5.0
Behavior5/5

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

The description reveals important non-obvious behaviors beyond the readOnlyHint: staff credits are capped at 200 with truncation flags, voice roles capped at 50 in arbitrary order, sfw filters apply only to the credit lists, and full_credits returns everything. This is exactly the kind of edge-case behavior an agent needs to know.

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?

The description packs a lot of useful nuance into a compact paragraph, but it is dense and somewhat sprawling rather than well-structured. The first sentence is a clear purpose statement, and the rest earns its place, though it could be tightened by using bullet points or shorter sentences.

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?

Given the rich output schema and high schema coverage, the description adequately covers the essential context: how to source the id, what the limits are, what filtering does, and how to get full results. There's no glaring gap for an agent to call this tool correctly.

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

Parameters3/5

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

The schema already covers all parameters with detailed descriptions, including edge-case notes for sfw vs sfw_strict, so the description adds little per-parameter meaning. It does add value by explaining the interaction of full_credits with the credits_truncated flag, but most parameter meaning is already in the schema.

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?

The description clearly identifies the resource (person by mal_id) and enumerates the distinct data returned: bio, staff credits, and voiced roles. It explicitly names the sibling search_people and get_character, making it easy for an agent to distinguish this tool from related lookups.

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

Usage Guidelines5/5

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

Exactly when to use is stated: to fetch a single person's full details by mal_id, and the description explains how to obtain the mal_id from search_people or get_character. It also distinguishes get_character's voice_actors (with id) from get_anime_characters' (no id), giving clear alternatives and routing.

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

get_producerGet producer/studio detailsA
Read-only

Get full details for one anime producer/studio by mal_id: about text and external links (official site, social media) alongside the fields get_producers already returns. Obtain the mal_id from get_producers.

NameRequiredDescriptionDefault
idYesMyAnimeList numeric ID.

Output Schema

NameRequiredDescription
urlNo
nameNo
aboutNo
countNo
mal_idYes
externalNo
favoritesNo
image_urlNo
establishedNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuine payload context beyond that: what this returns over the list tool (about text, official site and social media links), which tells the agent why to pay the extra call. It does not mention behavior for invalid or unknown IDs.

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

Conciseness5/5

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

Two sentences, both load-bearing: the first states what is returned and how it differs from the list tool, the second states the id prerequisite. Nothing is padded or repeated from the title.

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

Completeness4/5

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

With an output schema present, return values need no prose, and the description covers purpose, delta fields, and id provenance. The only gap for a lookup tool is error behavior on a nonexistent id, which is minor but absent.

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% and the single id parameter is already documented. The description adds meaning the schema cannot: that the value is a MyAnimeList producer/studio id and where to source it (get_producers), which reduces wrong-id errors.

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?

The description names a specific verb and resource ('Get full details for one anime producer/studio') and explicitly scopes it against the sibling list tool by noting it returns 'the fields get_producers already returns' plus extras. An agent can distinguish this detail endpoint from get_producers without opening either schema.

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?

It gives a clear precondition and call sequence: 'Obtain the mal_id from get_producers.' That routes the agent to the correct discovery tool first. It stops short of stating when-not to use it (e.g., for bulk listing), so it lands just under the explicit-alternatives bar.

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

get_producersGet producers/studiosA
Read-only

List or search anime producers and studios with their MAL IDs and counts. Use q to search by name, then get_producer for one studio's full profile (about text, external links).

NameRequiredDescriptionDefault
qNoFilter by name.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
limitNoMax results per page (1-100).
letterNoRestrict results to entries whose title starts with this single letter.
order_byNoField to order by.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare this is a read-only, open-world operation, so the safety profile is covered. The description adds useful context that results are summary records with IDs and counts and that full profile data requires a follow-up call, but it does not discuss pagination limits, sort interactions, or open-world coverage caveats.

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

Conciseness5/5

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

Two tightly packed sentences front-load the purpose and end with the alternative detail tool. Every sentence carries routing or scope information with no filler.

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

Completeness4/5

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

With a full schema, an output schema, and read-only/open-world annotations, the description supplies the remaining decision-critical context: what the list returns at a summary level and when to switch to get_producer. Minor omission of pagination behavior is covered by the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented, including the `sort`/`order_by` dependency and pagination limits. The description only calls out `q`, which repeats schema information rather than adding new syntax or filtering semantics.

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 specific verb and resource ('List or search anime producers and studios') and adds the key payload detail ('MAL IDs and counts'). It explicitly contrasts this summary-list tool with get_producer for full profiles, so the agent can distinguish it from its closest sibling without opening either schema.

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 clear routing: use `q` to search by name and use get_producer when a single studio's full profile is needed. It provides a positive alternative for the detail case but does not explicitly state exclusions or when not to use this tool.

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

get_random_animeGet a random animeA
Read-only

Return one random anime (core details: no relations/streaming/opening_themes/ending_themes/external — call get_anime with the returned mal_id for those). Good for discovery / suggestions. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
urlNo
rankNo
typeNo
yearNo
airedNo
scoreNo
titleNo
airingNo
genresNo
mal_idYes
ratingNo
seasonNo
sourceNo
statusNo
themesNo
membersNo
studiosNo
trailerNo
durationNo
episodesNo
externalNo
moreinfoNo
synopsisNo
broadcastNo
favoritesNo
image_urlNo
licensorsNo
producersNo
relationsNo
scored_byNo
streamingNo
backgroundNo
popularityNo
demographicsNo
ending_themesNo
title_englishNo
opening_themesNo
title_japaneseNo
title_synonymsNo
explicit_genresNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover read-only and open-world hints, but the description adds genuinely new behavioral context: the reduced field set and, importantly, that no official-API fallback exists so Tenrai reachability is required. This dependency/failure-mode disclosure is exactly the kind of value annotations cannot convey.

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?

The output scope is front-loaded, then the follow-up pointer, then the reliability caveat — each clause carries distinct information. The exclusion list is dense but earns its place; only minor trimming would improve it.

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?

An output schema exists so return shape needn't be explained, and the description covers the two things an agent could not infer: the partial-field caveat with a routing action, and the lack of a fallback. Nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the two params (sfw, sfw_strict) are thoroughly documented in the schema, including their distinction. The description adds nothing further about parameters, so the baseline 3 applies.

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?

The description opens with a specific verb+resource ('Return one random anime') and immediately scopes the output by listing excluded fields (relations/streaming/opening_themes/ending_themes/external). It differentiates itself from the get_anime sibling by routing callers there for those fields, so an agent can distinguish the two without opening schemas.

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?

'Good for discovery / suggestions' names the intended scenario, and the parenthetical explicitly says to call get_anime with the returned mal_id for missing fields, giving a concrete follow-up path. It stops short of stating when NOT to use it (e.g., when a specific title is already known), so it doesn't reach a full 5.

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

get_random_characterGet a random characterA
Read-only

Return one random character (core details: no anime/manga/voice_actors — call get_character with the returned mal_id for those). Good for discovery / trivia. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
urlNo
nameNo
aboutNo
animeNo
mangaNo
mal_idYes
favoritesNo
image_urlNo
nicknamesNo
name_kanjiNo
voice_actorsNo

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses two non-obvious behaviors: the response is deliberately trimmed of anime/manga/voice_actors fields, and there is no official-API fallback so Tenrai itself must be reachable. That availability caveat is exactly the kind of context annotations cannot express.

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

Conciseness5/5

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

Three tight sentences, each earning its place: what you get, how to get the rest, when it's useful, and the failure caveat. The payload scope is front-loaded before the alternative routing.

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?

With an output schema present, the description doesn't need to enumerate return fields, yet it still flags which fields are absent. Combined with the fallback warning, an agent has everything needed to call it and to handle failure correctly.

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?

The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It stays silent on parameters, which is correct here.

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 precise verb+resource ('Return one random character') and immediately delineates the payload's scope ('core details: no anime/manga/voice_actors'), which separates it from get_character and search_characters. An agent can pick this tool without opening the schema.

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 an explicit use case ('discovery / trivia') and routes the agent to the correct alternative for full data ('call get_character with the returned mal_id'). It lacks an explicit exclusion statement (e.g. when not to use it), so it falls just short of a 5.

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

get_random_mangaGet a random mangaA
Read-only

Return one random manga (core details: no relations/external — call get_manga with the returned mal_id for those). Good for discovery / suggestions. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
urlNo
rankNo
typeNo
scoreNo
titleNo
genresNo
mal_idYes
statusNo
themesNo
authorsNo
membersNo
volumesNo
chaptersNo
externalNo
moreinfoNo
synopsisNo
favoritesNo
image_urlNo
publishedNo
relationsNo
scored_byNo
backgroundNo
popularityNo
publishingNo
demographicsNo
title_englishNo
serializationsNo
title_japaneseNo
title_synonymsNo
explicit_genresNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds genuinely new behavioral facts: the response is a partial object requiring a second call for full details, and there is no official-API fallback, so the tool fails when Tenrai is unreachable. That availability dependency is exactly the kind of context annotations cannot convey.

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

Conciseness5/5

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

Three short sentences, front-loaded with what is returned, then the follow-up path, then the availability constraint. No sentence is redundant and nothing is buried.

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

Completeness4/5

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

An output schema exists, so return values need not be explained; the description covers the key operational caveats (partial payload, reachability requirement). It leaves the filter parameters entirely to the schema, which is acceptable given full coverage, but it could note the source pool the random pick is drawn from.

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

Parameters3/5

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

Schema description coverage is 100% and the sfw vs sfw_strict distinction is fully explained in the schema, including defaults and the exact rating/genre thresholds. The description adds nothing about the two filter parameters, so the baseline 3 applies.

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 ('Return one random manga') plus a scope qualifier (core details only, no relations/external). It also names the sibling to use for the missing data (get_manga), so an agent can distinguish it from get_manga, search_manga, and get_random_anime without opening a schema.

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 an explicit use case ('Good for discovery / suggestions') and a concrete follow-up path: call get_manga with the returned mal_id for relations/external. It does not spell out a when-not condition (e.g. when a curated list or top list is preferable), so it stops short of full routing guidance.

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

get_random_personGet a random personA
Read-only

Return one random person — voice actor, director, author (core details: no anime/manga/voice_roles — call get_person with the returned mal_id for those). Good for discovery / trivia. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
urlNo
nameNo
aboutNo
animeNo
mangaNo
mal_idYes
birthdayNo
favoritesNo
image_urlNo
given_nameNo
family_nameNo
voice_rolesNo
alternate_namesNo
credits_truncatedNo
total_anime_creditsNo
total_manga_creditsNo

TDQS

A4.9/5.0
Behavior5/5

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

Beyond readOnlyHint/openWorldHint, it discloses that the returned record omits anime/manga/voice_roles and that no official-API fallback exists, so Tenrai must be reachable. Those are meaningful operational constraints that annotations do not carry.

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

Conciseness5/5

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

Three tight sentences: purpose and scope first, usage second, availability caveat last. Parenthetical detail is dense but purposeful, and there is no 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 no-parameter random lookup with an output schema and read-only/open-world annotations, the description supplies the needed purpose, scope limits, alternative route, and availability caveat. Nothing essential is missing.

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?

This is a zero-parameter tool, so there is nothing for the description to disambiguate and the baseline is 4. The description correctly avoids inventing input semantics and uses its space for output scope and alternatives.

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 (return one random person) and enumerates the person types it covers. It explicitly differentiates from get_person by naming the fields it omits and the follow-up call to use for them.

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

Usage Guidelines5/5

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

Gives an explicit use case ('Good for discovery / trivia') and an explicit alternative condition: if anime/manga/voice_roles are needed, call get_person with the returned mal_id. That is clear when-to-use and when-to-switch guidance.

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

get_recent_anime_recommendationsGet recent anime recommendationsA
Read-only

Get a site-wide feed of recently-submitted anime recommendation pairs (e.g. 'if you liked X, try Y') with the submitting user's own commentary — not tied to any one title. Use get_anime_recommendations instead for recommendations similar to a specific mal_id. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
limitNoMax results per page (1-100).
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, openWorldHint), and the description adds a real availability constraint — no fallback data source, so failure means failure. It doesn't say anything about feed recency window, ordering, or pagination depth beyond the schema, so it's strong but not fully revealing.

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

Conciseness5/5

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

Three sentences, each carrying distinct load: what it returns, which sibling to use instead, and the availability caveat. Scope is established in the first clause with no preamble.

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

Completeness4/5

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

An output schema exists and the schema fully documents the four optional params, so remaining burden is light. The description covers identity, disambiguation, and the one operational gotcha; only feed freshness/ordering is unstated, a minor gap for a browse tool.

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

Parameters3/5

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

Schema description coverage is 100%, and the sfw/sfw_strict distinctions are documented in detail in the schema itself. The description adds no parameter-level meaning (e.g. how sfw interacts with the feed, or default page size), so the baseline 3 applies.

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 a site-wide feed of recently-submitted anime recommendation pairs'), defines the shape of the items (X→Y pairs with user commentary), and explicitly disclaims a scope ('not tied to any one title'). That contrast alone separates it from get_anime_recommendations, a sibling with a nearly identical name.

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

Usage Guidelines5/5

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

Names the alternative ('Use get_anime_recommendations instead for recommendations similar to a specific mal_id') and gives the exact condition that selects it. It also tells the agent when this tool is unusable (Tenrai must be reachable, no official-API fallback), which is a genuine selection constraint.

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

get_recent_manga_recommendationsGet recent manga recommendationsA
Read-only

Get a site-wide feed of recently-submitted manga recommendation pairs (e.g. 'if you liked X, try Y') with the submitting user's own commentary — not tied to any one title. Use get_manga_recommendations instead for recommendations similar to a specific mal_id. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
limitNoMax results per page (1-100).
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavioral context beyond that: the feed includes submitting users' commentary, it is not title-scoped, and it has no official-API fallback so it depends on Tenrai availability. It stops short of describing pagination or ordering behavior, but that is largely schema-handled.

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

Conciseness5/5

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

Three sentences, front-loaded with the core purpose, followed by the sibling alternative and the operational caveat. No repetition or filler, and the most decision-relevant information appears first.

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?

The description covers purpose, scope, sibling differentiation, and the lack of an official-API fallback. With an output schema present and full parameter documentation in the input schema, nothing essential is missing for an agent to select and invoke this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema itself carefully documents sfw, sfw_strict, page, and limit, including the subtle distinction between sfw and sfw_strict. The description adds no parameter-level detail, so the baseline 3 is appropriate when the schema carries the full burden.

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?

The description names a specific verb and resource ('Get a site-wide feed of recently-submitted manga recommendation pairs'), clarifies the content ('with the submitting user's own commentary'), and explicitly scopes it as 'not tied to any one title'. This cleanly separates it from get_manga_recommendations, which is title-specific.

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

Usage Guidelines5/5

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

It explicitly routes the agent: use this for a site-wide feed, but use get_manga_recommendations for recommendations similar to a specific mal_id. It also states a critical condition — no official-API fallback exists, so Tenrai must be reachable — which is exactly the kind of when/when-not guidance an agent needs.

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

get_seasonal_animeGet seasonal animeA
Read-only

List anime from a given season — supply both year and season together, or omit both for the current season; supplying only one is treated as omitting both. For next season's lineup use get_upcoming_season instead. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API — filter/rating/unapproved/continuing/kids are silently dropped (no equivalent there), order_by/sort keep only the default members-descending order (anything else comes back unsorted), themes/demographics/broadcast come back empty, and sfw_strict degrades to the same filtering as sfw there (no Ecchi-genre distinction available).

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
kidsNoIf true, exclude entries tagged as children's/kids content. Defaults to false.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
yearNoFour-digit year, e.g. 2024.
limitNoMax results per page (1-100).
filterNoRestrict to one or more media types.
ratingNoRestrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.
seasonNoSeason name.
order_byNoField to order by. Defaults to members.
continuingNoIf true, also include TV series continuing from a previous season. Defaults to false.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
unapprovedNoEntries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say readOnly and openWorld; the description adds the substantive behavioral fact that a fallback to the official MAL API silently degrades specific parameters, and enumerates which ones. This is disclosure an agent cannot get from structured fields and would materially change how it interprets results.

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 core rule and the alternative tool, with the fallback caveats last. The second sentence is a long stacked clause list, but every item is a distinct degradation an agent needs; minor density cost only.

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?

A 13-parameter tool with an output schema, fully documented properties, plus description coverage of the default season behavior, the sibling boundary, and the degraded-API mode. Nothing an agent needs to call it correctly is missing, and return values are rightly left to the output schema.

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 goes beyond the schema by documenting cross-parameter coupling (year+season) and per-parameter fallback degradation not visible in any property description. It stops short of explaining pagination interaction or the empty-value fallbacks in more detail, so not a 5.

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 ("List anime from a given season") with the exact scoping inputs, and names the sibling it is not (get_upcoming_season). An agent can separate this from search_anime and get_upcoming_season without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit invocation rules (pass year and season together, or omit both for the current season; a single value is treated as omitting both) and names the alternative tool plus the condition that selects it. Nothing about when to choose this tool is left to inference.

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

get_seasons_listList available seasonsA
Read-only

List the years and seasons that have anime data, so you can pick valid arguments for get_seasonal_anime.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
seasonsYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, covering safety. Description adds that it lists existing data, which is consistent but adds no new behavioral traits beyond what annotations provide.

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

Conciseness5/5

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

Single sentence that is front-loaded and conveys the core purpose and usage hint efficiently, with no extraneous content.

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?

Given zero parameters, an output schema, and annotations covering safety, the description provides everything needed: purpose, output type, and relation to another tool. No gaps.

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?

Tool has no parameters, so the description isn't required to explain parameters. Baseline 4 applies as schema coverage is 100% and no enrichment is needed.

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?

Description specifies 'list the years and seasons that have anime data', clearly stating the tool's purpose and output, and distinguishes itself from siblings by linking to get_seasonal_anime.

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?

The description explicitly states the tool's purpose is to provide valid arguments for get_seasonal_anime, guiding when to use it. No explicit when-not or alternatives, but the context is well-defined.

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

get_top_animeGet top animeA
Read-only

Get anime ranked by all-time score/popularity, not tied to any season. Use filter for special rankings (airing, upcoming, bypopularity, favorite); for a specific season's lineup use get_seasonal_anime or get_upcoming_season instead. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which takes one ranking instead of type + filter: filter wins over type; a type with no official ranking (ona, music, cm, pv, tv_special) or more than one type is dropped, and with nothing usable left the all-time ranking is returned; rating is ignored entirely, themes/demographics/broadcast come back empty, and sfw_strict degrades to the same filtering as sfw (the official API can't separate adult-rated from Ecchi-tagged-but-safely-rated).

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
typeNoRestrict to one or more media types.
limitNoMax results per page (1-100).
filterNoSpecial ranking filter.
ratingNoRestrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover read-only/open-world safety, yet the description discloses a non-obvious fallback path (Tenrai unavailable + MAL_CLIENT_ID set → official API retry) and its degradation rules. It spells out exactly what gets dropped, ignored, or returned empty, which an agent could never infer from annotations or schema.

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?

The core purpose and alternative routing are front-loaded in two tight sentences. The fallback paragraph is a single semicolon-chained run-on that is information-dense but harder to parse than a structured list; every clause does carry meaning, so it earns its space, just not ideally formatted.

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?

With an output schema, annotations, and full schema descriptions already present, the description fills the remaining gap: cross-parameter precedence and fallback degradation. An agent has everything needed to call it correctly in both the primary and fallback modes.

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 real interaction semantics beyond the schema: `filter` wins over `type`, multi-type or unsupported types are dropped, `rating` is ignored in fallback, and `sfw_strict` degrades to `sfw`. Only the primary path's parameters (page/limit) get no extra treatment, which is fine given the schema.

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 anime ranked by all-time score/popularity') plus the key scope constraint ('not tied to any season'), which immediately separates it from the seasonal siblings. An agent can identify what this returns without opening the schema.

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

Usage Guidelines5/5

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

Explicitly routes: use `filter` for special rankings, and use get_seasonal_anime or get_upcoming_season for a season's lineup. Both when-to-use and named alternatives are present, leaving nothing to inference.

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

get_top_charactersGet top charactersA
Read-only

Get the most popular/favorited characters, ranked overall. Use search_characters instead to look up a specific character by name.

NameRequiredDescriptionDefault
pageNo1-based page number for pagination (1-20000).
limitNoMax results per page (1-100).

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and reach are covered. The description only adds 'ranked overall' beyond that; it says nothing about how deep the ranking goes, whether pagination bounds are meaningful, or that results are a global popularity list. Adequate given the annotation coverage, but not rich.

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

Conciseness5/5

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

Two sentences, zero waste: the first states purpose and scope, the second routes the agent to the alternative. Front-loaded and appropriately sized for a simple ranked-list tool.

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

Completeness4/5

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

With an output schema present, return values need no explanation, and both parameters are fully described in the schema. The description covers purpose, ranking basis, and the primary alternative; only the precise popularity metric and list depth are left implicit, which is a minor gap for a read-only browse tool.

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

Parameters3/5

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

Schema description coverage is 100% – both page (1-20000) and limit (1-100) are fully documented with bounds in the schema. The description adds no parameter detail beyond implying that the list is paginated. Baseline 3 is appropriate when the schema does all the work.

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

Purpose4/5

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

States a specific verb and resource ('Get the most popular/favorited characters') and adds the key scoping detail 'ranked overall', which distinguishes it from per-anime character lists like get_anime_characters. The dual 'popular/favorited' phrasing leaves the exact ranking criterion slightly ambiguous, but the intent is unmistakable.

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?

Explicitly names the alternative (search_characters) and the condition that selects it ('look up a specific character by name'). It gives no exclusion for the closest siblings get_top_people or get_random_character, but the browse-vs-lookup split is made clear.

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

get_top_mangaGet top mangaA
Read-only

Get manga ranked by all-time score/popularity, not tied to any release window. Use filter for special rankings (publishing, upcoming, bypopularity, favorite). If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which takes one ranking instead of type + filter: filter publishing/upcoming has no official ranking and is dropped, bypopularity/favorite win over type, a single type maps to its closest official ranking (novel and lightnovel share one), more than one type is dropped, and with nothing usable left the all-time ranking is returned; themes/demographics come back empty, and sfw_strict degrades to the same filtering as sfw (the official API can't separate adult-rated from Ecchi-tagged-but-safely-rated).

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
typeNoRestrict to one or more publication types.
limitNoMax results per page (1-100).
filterNoSpecial ranking filter.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.6/5.0
Behavior5/5

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

The annotations only declare read-only and open-world behavior, while the description adds substantial operational context: fallback retry via the official API, the `MAL_CLIENT_ID` dependency, ranking remapping/dropping rules, empty `themes`/`demographics`, and `sfw_strict` degradation. This is rich behavioral disclosure beyond the structured 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?

The main purpose and filter usage are front-loaded, and the fallback detail is relevant rather than filler. The second sentence is dense and semicolon-heavy, but it remains purposeful given the complexity of the fallback behavior.

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?

Given the tool's fallback complexity, the description covers purpose, usage, ranking transformations, degradation behavior, and edge cases. Since an output schema exists, return-value details do not need to be repeated in the description.

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 description coverage is 100%, so all six parameters are already documented. The description still adds cross-parameter semantics for the official-API fallback, such as `filter` mappings, `bypopularity`/`favorite` overriding `type`, multiple `type` values being dropped, and `sfw_strict` behaving like `sfw`.

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?

The description states a specific verb and resource (get manga) and defines the ranking basis as all-time score/popularity, explicitly not tied to a release window. That clearly distinguishes it from seasonal and top-anime siblings.

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?

It explicitly says to use `filter` for special rankings and describes fallback conditions when Tenrai is unavailable. However, it does not name a sibling alternative such as `search_manga` for non-ranking searches, so alternative-tool guidance is not fully explicit.

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

get_top_peopleGet top peopleA
Read-only

Get the most popular/favorited people (voice actors, staff, authors), ranked overall. Use search_people instead to look up a specific person by name.

NameRequiredDescriptionDefault
pageNo1-based page number for pagination (1-20000).
limitNoMax results per page (1-100).

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and side-effect profile are covered. The description adds ranking/ordering semantics ('ranked overall', favorited-based) but says nothing about rate limits, pagination behavior beyond the schema, or result shape. With annotations carrying the safety burden, a 3 is appropriate.

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

Conciseness5/5

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

Two sentences, zero waste, with the purpose stated first and the sibling disambiguation second. Nothing extraneous and nothing buried.

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

Completeness4/5

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

An output schema exists so return values needn't be explained, and both params are fully specified in the schema. The only minor gap is a lack of guidance on default result count when no params are supplied, but for a simple ranked-list tool the definition is otherwise complete.

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

Parameters3/5

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

Schema description coverage is 100%; both parameters (page 1-20000, limit 1-100) are fully documented with ranges in the schema. The description adds nothing about pagination or default page size, so the baseline 3 applies when the schema does all the work.

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 the most popular/favorited people') with concrete examples (voice actors, staff, authors) and defines what 'top' means (popularity/favorites, ranked overall). It explicitly distinguishes itself from search_people, so an agent can separate it from siblings without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names the alternative and the condition that selects it: 'Use search_people instead to look up a specific person by name.' This is the exact routing decision an agent needs when choosing between browsing top lists and looking up a known person.

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

get_upcoming_seasonGet upcoming season animeA
Read-only

List anime scheduled for the upcoming season. Use get_seasonal_anime for the current or a specific past season. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API — filter/rating/unapproved/continuing/kids are silently dropped (no equivalent there), order_by/sort keep only the default members-descending order (anything else comes back unsorted), themes/demographics/broadcast come back empty, and sfw_strict degrades to the same filtering as sfw there (no Ecchi-genre distinction available).

NameRequiredDescriptionDefault
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
kidsNoIf true, exclude entries tagged as children's/kids content. Defaults to false.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
limitNoMax results per page (1-100).
filterNoRestrict to one or more media types.
ratingNoRestrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.
order_byNoField to order by. Defaults to members.
continuingNoIf true, also include TV series continuing from a previous season. Defaults to false.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
unapprovedNoEntries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description goes well beyond by disclosing the automatic fallback to the official API. It lists exactly which parameters are dropped, which return unsorted, which come back empty, and how sfw_strict degrades — genuinely useful behavioral detail. It stops short of stating latency, rate limits, or whether the fallback is visible in the response.

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?

The purpose and the sibling routing are front-loaded, which is exactly right. The trailing fallback sentence is a dense run-on, but each clause carries distinct operational information rather than filler, so the length is mostly justified.

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?

With 11 optional parameters and an output schema, the description does not need to explain return values, and it covers the two things that matter most: when to prefer the sibling, and how behavior changes on fallback. An agent has everything needed to call this correctly.

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 semantics the schema cannot: the fallback-specific fate of filter, rating, unapproved, continuing, kids, order_by/sort, and the sfw_strict degradation. Minor deduction because it references themes/demographics/broadcast, which are not parameters in this schema, which could confuse an agent about what it can actually pass.

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?

The first sentence states a specific verb and resource with a clear scope: anime scheduled for the upcoming season. It also explicitly names the sibling it is not (get_seasonal_anime for current/past seasons), so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

It gives an explicit when-to-use-other rule: use get_seasonal_anime for the current or a specific past season, leaving this tool for the upcoming one. The fallback conditions (Tenrai unavailable + MAL_CLIENT_ID set) further tell the agent what to expect in each situation.

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

login_malLog in to MyAnimeListA

Authorize the personal-list tools with your MyAnimeList account (one-time). Prerequisite: register a MAL API app of type 'other' at https://myanimelist.net/apiconfig with Redirect URI set to this server's localhost callback, and set MAL_CLIENT_ID in the server env. Calling this returns an authorization URL: open it, log in, and click Allow. If your browser is on the same machine as the server and the callback port is free, login completes automatically; otherwise (a remote/headless host, or the port is busy) copy the URL you land on and pass it to submit_mal_redirect.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
auto_captureYes
instructionsYes
redirect_uriYes
authorize_urlYes

TDQS

A4.9/5.0
Behavior5/5

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

The description thoroughly explains the authentication process, including opening a browser, copying URLs, and conditions for automatic vs manual completion. Annotations indicate mutation (readOnlyHint false) and side effects (openWorldHint true), which align with the description.

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?

The description is informative and well-structured, but slightly verbose. It could be split into shorter sentences, but no unnecessary information is present.

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?

The description covers prerequisites, the authentication flow, potential issues, and fallback to submit_mal_redirect. It is complete given the tool's complexity and lack of parameters.

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

Parameters5/5

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

The input schema has no properties, so the description compensates by explaining the tool's behavior and workflow. No additional parameter details are needed.

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?

The description clearly states that the tool authorizes personal-list tools with a MyAnimeList account. It uses specific verbs ('Authorize', 'one-time') and distinguishes from sibling tools like submit_mal_redirect by explaining the authentication flow.

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

Usage Guidelines5/5

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

The description explicitly states this is a prerequisite for personal-list tools and provides step-by-step instructions. It also guides when to use submit_mal_redirect as an alternative when automatic callback fails (e.g., remote host or busy port).

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

search_animeSearch animeA
Read-only

Search MyAnimeList anime by keyword; returns compact summaries (with the mal_id that other anime tools require) plus pagination info. If Tenrai is unavailable and MAL_CLIENT_ID is set and q has at least 3 characters (the official search rejects anything shorter, so a filter-only or 1-2 character search has no fallback), transparently retries via the official API, which ignores every filter except q/sfw/limit/page (type/status/genres/genres_exclude/rating/score/min_score/max_score/letter/producers/start_date/end_date/unapproved/order_by/sort are silently dropped), always returns empty themes/demographics/broadcast (no official-API equivalent for any of these), and — for a query with no real title match — comes back with a page of unrelated anime instead of an empty result (a quirk of the official search endpoint itself, not a mal-mcp bug; don't treat a nonsense-query result as a real match during a fallback).

NameRequiredDescriptionDefault
qNoSearch query, e.g. an anime title. Omit to browse by the other filters alone (e.g. genres + order_by). Cannot be combined with `letter`.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
typeNoRestrict to one or more media types.
limitNoMax results per page (1-100).
scoreNoRestrict to entries with exactly this average score (rarely useful — prefer min_score/max_score for a range).
genresNoComma-separated MAL genre IDs to include (max 25), e.g. '1,4'. Look up IDs with get_anime_genres.
letterNoRestrict results to entries whose title starts with this single letter.
ratingNoRestrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.
statusNoFilter by airing status.
end_dateNoOnly include entries whose end date is on or before this date: YYYY-MM-DD, or YYYY-MM / YYYY for the end of that month/year. Entries with no end date are excluded.
order_byNoField to order by.
max_scoreNoMaximum average MAL score (inclusive), 1-10.
min_scoreNoMinimum average MAL score (inclusive), 0-10.
producersNoComma-separated MAL producer/studio IDs to restrict to (max 25). Look up IDs with get_producers.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
start_dateNoOnly include entries whose start date is on or after this date: YYYY-MM-DD, or YYYY-MM / YYYY for the start of that month/year.
unapprovedNoEntries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries.
genres_excludeNoComma-separated MAL genre IDs to exclude (max 25), e.g. '1,4'. Look up IDs with get_anime_genres.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.4/5.0
Behavior5/5

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

Despite readOnly/openWorld annotations, the description discloses substantial behavior beyond them: the transparent retry to the official API, exactly which filters get silently dropped there, which fields always come back empty, and the known false-positive quirk on nonsense queries. This is exactly the kind of non-obvious behavior an agent cannot infer from annotations or schema.

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

Conciseness3/5

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

The core purpose is front-loaded in the first clause, but the fallback caveat is delivered as one enormous parenthetical crammed with filter lists, which hurts scanability. The content is valuable, but the packing could be broken into cleaner sentences.

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

Completeness4/5

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

For a 20-parameter search tool with an output schema and full schema descriptions, the description covers the main non-obvious risk areas (fallback degradation, short-query failure, false matches). Return values are handled by the output schema, so remaining gaps are minor.

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 real value by explaining that only `q`/`sfw`/`limit`/`page` survive the official fallback and all other filters are dropped. That is a semantic constraint not visible in the schema.

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 (search MyAnimeList anime by keyword) and even describes the return shape (compact summaries carrying the mal_id other tools require). It also clarifies that omitting `q` turns it into a filter-browse, which separates it from the fixed-scope siblings like get_top_anime or get_seasonal_anime.

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 actionable conditional rules: the fallback only triggers if Tenrai is down, MAL_CLIENT_ID is set, and `q` has ≥3 characters; a filter-only or short query has no fallback. It also warns not to treat a nonsense-query result as a real match. It does not explicitly name alternative siblings, but usage conditions are otherwise well covered.

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

search_charactersSearch charactersA
Read-only

Search MyAnimeList characters by name. Returns compact summaries and the mal_id needed by get_character. Use get_anime_characters instead if you already have an anime's mal_id and want its full cast.

NameRequiredDescriptionDefault
qYesCharacter name.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
limitNoMax results per page (1-100).
letterNoRestrict results to entries whose title starts with this single letter.
order_byNoField to order by.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint) and open-world scope, so the bar is lower. The description still adds useful behavioral context: results are compact summaries that carry the mal_id needed downstream by get_character, which tells the agent this is a discovery step rather than a full-detail fetch.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action, then return shape, then the routing rule. No filler or restatement of the title.

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?

An output schema exists, so return values needn't be spelled out, yet the description still flags that results are compact and include mal_id. With full schema coverage and annotations, nothing an agent needs to select or invoke this tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters (q, page, limit, sort, letter, order_by) are documented in the schema, including the sort/order_by dependency. The description adds no parameter guidance beyond that, so baseline 3 applies.

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?

Specific verb+resource ("Search MyAnimeList characters by name") plus an explicit statement of what it returns (compact summaries and the mal_id). It also distinguishes itself from a similarly named sibling (get_anime_characters) without needing the schema.

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

Usage Guidelines5/5

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

Names the alternative explicitly and gives the exact condition that selects it: use get_anime_characters when you already have an anime's mal_id and want its full cast. It also implies the inverse – use this tool when starting from a name.

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

search_mangaSearch mangaA
Read-only

Search MyAnimeList manga by keyword (also light novels, manhwa/manhua); returns compact summaries with the mal_id that other manga tools require. If Tenrai is unavailable and MAL_CLIENT_ID is set and q has at least 3 characters (the official search rejects anything shorter, so a filter-only or 1-2 character search has no fallback), transparently retries via the official API, which ignores every filter except q/sfw/limit/page (type/status/genres/genres_exclude/score/min_score/max_score/letter/magazines/start_date/end_date/unapproved/order_by/sort are silently dropped), always returns empty themes/demographics (no official-API equivalent), and — for a query with no real title match — comes back with a page of unrelated manga instead of an empty result (a quirk of the official search endpoint itself, not a mal-mcp bug; don't treat a nonsense-query result as a real match during a fallback).

NameRequiredDescriptionDefault
qNoSearch query, e.g. a manga title. Omit to browse by the other filters alone (e.g. genres + order_by). Cannot be combined with `letter`.
sfwNoIf true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
typeNoRestrict to one or more publication types.
limitNoMax results per page (1-100).
scoreNoRestrict to entries with exactly this average score (rarely useful — prefer min_score/max_score for a range).
genresNoComma-separated MAL genre IDs to include (max 25), e.g. '1,4'. Look up IDs with get_manga_genres.
letterNoRestrict results to entries whose title starts with this single letter.
statusNoFilter by publication status.
end_dateNoOnly include entries whose end date is on or before this date: YYYY-MM-DD, or YYYY-MM / YYYY for the end of that month/year. Entries with no end date are excluded.
order_byNoField to order by.
magazinesNoComma-separated MAL magazine IDs to restrict to (max 25). Look up IDs with get_magazines.
max_scoreNoMaximum average MAL score (inclusive), 1-10.
min_scoreNoMinimum average MAL score (inclusive), 0-10.
sfw_strictNoIf true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
start_dateNoOnly include entries whose start date is on or after this date: YYYY-MM-DD, or YYYY-MM / YYYY for the start of that month/year.
unapprovedNoEntries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries.
genres_excludeNoComma-separated MAL genre IDs to exclude (max 25), e.g. '1,4'. Look up IDs with get_manga_genres.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, it discloses the fallback to the official API, the required MAL_CLIENT_ID, the minimum q length, which filters are silently dropped, missing themes/demographics, and the unrelated-result quirk. These are highly relevant behavioral caveats that an agent could not infer from structured fields alone.

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?

The purpose is front-loaded in the first clause, and the fallback caveats are relevant. However, the second sentence is very dense with nested parentheticals, making it less skimmable than ideal for an otherwise well-structured definition.

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?

Given the output schema and annotations already present, the description covers the critical gaps: fallback behavior, auth requirements, filter support limitations, and result quirks. An agent has enough context to invoke and interpret this tool correctly.

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 schema already documents all 19 parameters thoroughly. The description adds meaningful fallback-specific semantics: official API fallback only honors q/sfw/limit/page, and q must have at least 3 characters for fallback to work.

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?

It states a specific verb and resource ('Search MyAnimeList manga by keyword') and extends scope to light novels/manhwa/manhua. It also names the key return value (mal_id) that other manga tools require, which cleanly distinguishes it from generic or non-search siblings.

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?

The description gives clear context: use keyword search to obtain mal_id values for other manga tools. It also explains fallback conditions when Tenrai is unavailable, but it does not explicitly name sibling alternatives such as get_manga for direct ID lookup or search_anime for anime.

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

search_peopleSearch peopleA
Read-only

Search MyAnimeList people (voice actors, directors, authors) by name. Returns the mal_id needed by get_person.

NameRequiredDescriptionDefault
qYesPerson name.
pageNo1-based page number for pagination (1-20000).
sortNoSort direction. Only takes effect together with `order_by`; ignored on its own.
limitNoMax results per page (1-100).
letterNoRestrict results to entries whose title starts with this single letter.
order_byNoField to order by.

Output Schema

NameRequiredDescription
pageYes
resultsYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and the external-data nature are covered. The description adds the useful note that results carry mal_id, but says nothing about result volume, pagination behavior, or empty-result cases. Adequate but thin given how little annotations leave unsaid.

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

Conciseness5/5

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

Two short sentences, purpose first, chaining advice second; no filler or restated title text. Every clause carries information.

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

Completeness4/5

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

With an output schema present and full in-schema parameter docs, the description needn't explain return values. It covers purpose and the get_person handoff; the main remaining gap is behavior on empty or ambiguous name matches, which is minor for a search tool.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter (q, page, sort, limit, letter, order_by) is documented in-schema, including enums and the sort/order_by dependency. The description adds no parameter meaning, so the baseline 3 applies.

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 (Search) and resource (MyAnimeList people/voice actors, directors, authors) with a name-based scope. This cleanly separates it from search_anime, search_manga, and search_characters even without opening a schema.

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?

The line "Returns the mal_id needed by get_person" gives an explicit downstream workflow, telling the agent this is the lookup step before a detail fetch. It lacks exclusions, though – nothing says when to prefer get_top_people or get_random_person instead.

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

submit_mal_redirectFinish MyAnimeList loginA

Complete a login started with login_mal by submitting the URL your browser was redirected to after clicking Allow (the one containing ?code=...). Use this when login didn't complete automatically — e.g. the server runs on a remote/headless host. A bare code string is also accepted.

NameRequiredDescriptionDefault
redirect_urlYesThe full redirected URL (contains ?code=...), or just the code value.

Output Schema

NameRequiredDescription
userNo
messageYes
logged_inYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false and openWorldHint=true, so the agent knows it's a mutation with external side effects. The description adds context that it's an OAuth callback, but does not elaborate on specific side effects, failure modes, or required permissions. This is adequate but not exemplary given the annotations.

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

Conciseness5/5

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

The description is two sentences: first states what the tool does, second provides usage guidance and input format note. Every sentence is functional with no wasted words, making it efficiently front-loaded.

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 simple OAuth callback tool with one required parameter and a known output schema, the description covers purpose, usage context, and input format. It does not need to explain return values as an output schema exists, making it complete for the complexity level.

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

Parameters3/5

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

Schema description coverage is 100%, and the tool description merely rephrases the schema's parameter description ('by submitting the URL... or a bare code string'). No additional meaning is provided beyond what the schema already offers, so baseline 3 is appropriate.

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?

The description clearly states that the tool completes a login initiated by login_mal by submitting the redirect URL. It uses specific verb+resource ('complete login'), and distinguishes from the sibling tool login_mal, which starts the login.

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

Usage Guidelines5/5

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

The description explicitly says 'Use this when login didn't complete automatically — e.g. the server runs on a remote/headless host.' This provides clear context for when to use the tool versus alternatives, and implies it should not be used when login completes automatically.

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

update_my_anime_statusUpdate my anime statusA
Idempotent

Add or update an anime on the authenticated user's list (status, score, watched episodes, dates). Creates the entry if absent; fields you omit are left unchanged on an existing entry. Provide at least one field besides anime_id. Requires a MyAnimeList login.

NameRequiredDescriptionDefault
tagsNoComma-separated free-text tags.
scoreNoScore 0-10 (0 clears the score).
statusNoList status bucket.
anime_idYesMyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or from get_my_anime_list/get_my_manga_list for an entry already on your list.
commentsNoFree-text comments.
priorityNoList priority: 0 = low, 1 = medium, 2 = high.
start_dateNoDate as YYYY-MM-DD.
finish_dateNoDate as YYYY-MM-DD.
is_rewatchingNoWhether currently rewatching.
rewatch_valueNoRewatch/reread value: 0 = none … 5 = very high.
num_times_rewatchedNoTimes rewatched.
num_watched_episodesNoEpisodes watched. Note: get_my_anime_list returns this same value as `num_episodes_watched` — the field name is intentionally different here.

Output Schema

NameRequiredDescription
scoreNo
statusNo

TDQS

A4.5/5.0
Behavior5/5

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

The description adds meaningful behavior beyond the annotations: it explains the idempotent upsert contract ('Creates the entry if absent; fields you omit are left unchanged on an existing entry'), the precondition that at least one field besides anime_id must be provided, and the authentication requirement. This is consistent with idempotentHint=true and readOnlyHint=false.

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

Conciseness5/5

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

The description is three sentences with the main action front-loaded in the first sentence. It includes only high-value details: upsert semantics, partial update behavior, required field validation, and login. No word is wasted.

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 12-parameter mutation tool with rich schema descriptions and an output schema, the description covers the essential behavioral contract: scoping to the user's list, upsert behavior, partial updates, and authentication. Nothing needed for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and every parameter has a detailed inline description, including enum values, ranges, date formats, and naming notes. The description only summarizes the broad field categories (status, score, watched episodes, dates) without adding meaning beyond what the schema already provides.

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?

The description says 'Add or update an anime on the authenticated user's list' and details the update fields (status, score, watched episodes, dates), making the action and resource explicit. It also clarifies the upsert nature, which distinguishes it from read-only anime endpoints and from manga-specific writes.

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?

It provides clear context: this is a write operation scoped to the authenticated user's anime list, with an explicit login requirement. It does not explicitly name alternatives such as update_my_manga_status or delete_my_anime_list_item, but the anime-vs-manga and write-vs-read distinctions are strongly implied by the wording and title.

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

update_my_manga_statusUpdate my manga statusA
Idempotent

Add or update a manga on the authenticated user's list (status, score, chapters/volumes read, dates). Creates the entry if absent; fields you omit are left unchanged on an existing entry. Provide at least one field besides manga_id. Requires a MyAnimeList login.

NameRequiredDescriptionDefault
tagsNoComma-separated free-text tags.
scoreNoScore 0-10 (0 clears the score).
statusNoList status bucket.
commentsNoFree-text comments.
manga_idYesMyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or from get_my_anime_list/get_my_manga_list for an entry already on your list.
priorityNoList priority: 0 = low, 1 = medium, 2 = high.
start_dateNoDate as YYYY-MM-DD.
finish_dateNoDate as YYYY-MM-DD.
is_rereadingNoWhether currently rereading.
reread_valueNoRewatch/reread value: 0 = none … 5 = very high.
num_times_rereadNoTimes reread.
num_volumes_readNoVolumes read.
num_chapters_readNoChapters read.

Output Schema

NameRequiredDescription
scoreNo
statusNo

TDQS

A4.7/5.0
Behavior5/5

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

The description adds meaningful behavioral detail beyond the annotations: it creates the entry if absent, leaves omitted fields unchanged on existing entries, and requires at least one update field. It also discloses the login requirement. This complements the annotations — readOnlyHint=false, idempotentHint=true — rather than repeating or contradicting them.

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

Conciseness5/5

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

Three dense, efficient sentences with no filler. The primary action is front-loaded, then the key behaviors are listed, and the final sentence supplies the minimum-input constraint. Every sentence earns its place.

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 13-parameter write tool, the description covers the essential context: what the tool does, when it creates vs updates, the minimum field requirement, and authentication needs. The schema carries the detailed parameter documentation and an output schema is present, so nothing critical is missing.

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?

The input schema has 100% description coverage, so the baseline is 3. The description adds global parameter semantics that the schema does not capture: 'fields you omit are left unchanged' and 'provide at least one field besides manga_id.' This is meaningful guidance beyond the schema, especially for a 13-parameter tool.

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?

The description clearly states a specific action and resource: 'Add or update a manga on the authenticated user's list'. The scope is evident — this is a list-mutation tool for manga, not an anime or read-only tool — and it is easy to distinguish from siblings like update_my_anime_status and delete_my_manga_list_item.

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?

The description gives clear context: it applies to the authenticated user's manga list, requires a MyAnimeList login, and requires at least one field besides manga_id. It does not explicitly name alternative tools or state when not to use it, so it falls short of a full 5, but the usage context is well established.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 30 tool updatesv0.11.0
    • Changedget_anime_episodes3 fields changed
      • 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
      • changedOutput schema / properties / episodes / items / properties / aired / 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)))$"
    • Changedget_anime_genres2 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
    • Changedget_anime_interest_stacks8 fields changed
      • changedInput schema / properties / challenges / description
        Previous value: -"Filter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • changedInput schema / properties / official / description
        Previous value: -"Filter by official MAL-editorial stacks. 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by official MAL-editorial stacks. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
      • 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 / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
      • changedInput schema / properties / spoilers / description
        Previous value: -"Filter by stacks flagged as containing spoilers. 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by stacks flagged as containing spoilers. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
    • Changedget_anime_news3 fields changed
      • 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
      • changedOutput schema / properties / results / 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)))$"
    • Changedget_anime_reviews9 fields changed
      • 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"
        +]
    • Changedget_anime_schedule7 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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 / unapproved / description
        Previous value: -"If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false."New value: +"Entries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries."
      • addedInput schema / properties / unapproved / enum
        Added value: +[
        +  "true",
        +  "false",
        +  "only"
        +]
      • changedInput schema / properties / unapproved / type
        Previous value: -"boolean"New value: +"string"
    • Changedget_interest_stacks9 fields changed
      • changedInput schema / properties / challenges / description
        Previous value: -"Filter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • changedInput schema / properties / official / description
        Previous value: -"Filter by official MAL-editorial stacks. 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by official MAL-editorial stacks. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
      • 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
      • addedInput schema / properties / q / maxLength
        Added value: +300
      • changedInput schema / properties / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
      • changedInput schema / properties / spoilers / description
        Previous value: -"Filter by stacks flagged as containing spoilers. 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by stacks flagged as containing spoilers. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
    • Changedget_magazines5 fields changed
      • 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
      • addedInput schema / properties / q / maxLength
        Added value: +300
      • addedInput schema / properties / q / minLength
        Added value: +1
      • changedInput schema / properties / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
    • Changedget_manga_genres2 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
    • Changedget_manga_interest_stacks8 fields changed
      • changedInput schema / properties / challenges / description
        Previous value: -"Filter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by challenge stacks (watch-along style lists). 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • changedInput schema / properties / official / description
        Previous value: -"Filter by official MAL-editorial stacks. 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by official MAL-editorial stacks. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
      • 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 / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
      • changedInput schema / properties / spoilers / description
        Previous value: -"Filter by stacks flagged as containing spoilers. 'true' includes them alongside the rest (default), 'false' excludes them, 'only' returns exclusively those."New value: +"Filter by stacks flagged as containing spoilers. 'true' includes them alongside the rest, 'false' (default) excludes them, 'only' returns exclusively those."
    • Changedget_manga_news3 fields changed
      • 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
      • changedOutput schema / properties / results / 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)))$"
    • Changedget_manga_reviews9 fields changed
      • 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"
        +]
    • Changedget_my_anime_list2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-100)."New value: +"Max results (1-1000)."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000
    • Changedget_my_manga_list2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-100)."New value: +"Max results (1-1000)."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000
    • Changedget_my_user_info2 fields changed
      • removedOutput schema / properties / location / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / location / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedget_news10 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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
      • addedInput schema / properties / q / maxLength
        Added value: +300
      • addedInput schema / properties / q / minLength
        Added value: +1
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / tag / maxLength
        Added value: +300
      • changedOutput schema / properties / results / 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)))$"
    • Changedget_producer1 field changed
      • changedOutput schema / properties / established / 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)))$"
    • Changedget_producers8 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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
      • addedInput schema / properties / q / maxLength
        Added value: +300
      • addedInput schema / properties / q / minLength
        Added value: +1
      • changedInput schema / properties / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
      • changedOutput schema / properties / results / items / properties / established / 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)))$"
    • Changedget_recent_anime_recommendations3 fields changed
      • 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
      • changedOutput schema / properties / results / 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)))$"
    • Changedget_recent_manga_recommendations3 fields changed
      • 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
      • changedOutput schema / properties / results / 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)))$"
    • Changedget_seasonal_anime8 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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 / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
      • changedInput schema / properties / unapproved / description
        Previous value: -"If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false."New value: +"Entries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries."
      • addedInput schema / properties / unapproved / enum
        Added value: +[
        +  "true",
        +  "false",
        +  "only"
        +]
      • changedInput schema / properties / unapproved / type
        Previous value: -"boolean"New value: +"string"
    • Changedget_top_anime4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog."New value: +"1-based page number for pagination (1-20000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +20000
    • Changedget_top_characters4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog."New value: +"1-based page number for pagination (1-20000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +20000
    • Changedget_top_manga4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog."New value: +"1-based page number for pagination (1-20000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +20000
    • Changedget_top_people4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog."New value: +"1-based page number for pagination (1-20000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +20000
    • Changedget_upcoming_season8 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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 / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
      • changedInput schema / properties / unapproved / description
        Previous value: -"If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false."New value: +"Entries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries."
      • addedInput schema / properties / unapproved / enum
        Added value: +[
        +  "true",
        +  "false",
        +  "only"
        +]
      • changedInput schema / properties / unapproved / type
        Previous value: -"boolean"New value: +"string"
    • Changedsearch_anime15 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"Only include entries whose end date is on or before this date (YYYY-MM-DD)."New value: +"Only include entries whose end date is on or before this date: YYYY-MM-DD, or YYYY-MM / YYYY for the end of that month/year. Entries with no end date are excluded."
      • changedInput schema / properties / end_date / pattern
        Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}(-\\d{2}(-\\d{2})?)?$"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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 / q / description
        Previous value: -"Search query, e.g. an anime title."New value: +"Search query, e.g. an anime title. Omit to browse by the other filters alone (e.g. genres + order_by). Cannot be combined with `letter`."
      • addedInput schema / properties / q / maxLength
        Added value: +300
      • changedInput schema / properties / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
      • changedInput schema / properties / start_date / description
        Previous value: -"Only include entries whose start date is on or after this date (YYYY-MM-DD)."New value: +"Only include entries whose start date is on or after this date: YYYY-MM-DD, or YYYY-MM / YYYY for the start of that month/year."
      • changedInput schema / properties / start_date / pattern
        Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}(-\\d{2}(-\\d{2})?)?$"
      • changedInput schema / properties / unapproved / description
        Previous value: -"If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false."New value: +"Entries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries."
      • addedInput schema / properties / unapproved / enum
        Added value: +[
        +  "true",
        +  "false",
        +  "only"
        +]
      • changedInput schema / properties / unapproved / type
        Previous value: -"boolean"New value: +"string"
      • removedInput schema / required
        Removed value: -[
        -  "q"
        -]
    • Changedsearch_characters6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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
      • addedInput schema / properties / q / maxLength
        Added value: +300
      • changedInput schema / properties / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
    • Changedsearch_manga15 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"Only include entries whose end date is on or before this date (YYYY-MM-DD)."New value: +"Only include entries whose end date is on or before this date: YYYY-MM-DD, or YYYY-MM / YYYY for the end of that month/year. Entries with no end date are excluded."
      • changedInput schema / properties / end_date / pattern
        Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}(-\\d{2}(-\\d{2})?)?$"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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 / q / description
        Previous value: -"Search query, e.g. a manga title."New value: +"Search query, e.g. a manga title. Omit to browse by the other filters alone (e.g. genres + order_by). Cannot be combined with `letter`."
      • addedInput schema / properties / q / maxLength
        Added value: +300
      • changedInput schema / properties / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
      • changedInput schema / properties / start_date / description
        Previous value: -"Only include entries whose start date is on or after this date (YYYY-MM-DD)."New value: +"Only include entries whose start date is on or after this date: YYYY-MM-DD, or YYYY-MM / YYYY for the start of that month/year."
      • changedInput schema / properties / start_date / pattern
        Previous value: -"^\\d{4}-\\d{2}-\\d{2}$"New value: +"^\\d{4}(-\\d{2}(-\\d{2})?)?$"
      • changedInput schema / properties / unapproved / description
        Previous value: -"If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false."New value: +"Entries not yet approved by MAL's moderators: 'true' also includes them, 'false' (default) excludes them, 'only' returns exclusively unapproved entries."
      • addedInput schema / properties / unapproved / enum
        Added value: +[
        +  "true",
        +  "false",
        +  "only"
        +]
      • changedInput schema / properties / unapproved / type
        Previous value: -"boolean"New value: +"string"
      • removedInput schema / required
        Removed value: -[
        -  "q"
        -]
    • Changedsearch_people6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (1-50)."New value: +"Max results per page (1-100)."
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +100
      • 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
      • addedInput schema / properties / q / maxLength
        Added value: +300
      • changedInput schema / properties / sort / description
        Previous value: -"Sort direction."New value: +"Sort direction. Only takes effect together with `order_by`; ignored on its own."
  2. 21 tool updatesv0.10.0
    • Changeddelete_my_anime_list_item1 field changed
      • changedInput schema / properties / anime_id / description
        Previous value: -"MyAnimeList numeric ID."New value: +"MyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or from get_my_anime_list/get_my_manga_list for an entry already on your list."
    • Changeddelete_my_manga_list_item1 field changed
      • changedInput schema / properties / manga_id / description
        Previous value: -"MyAnimeList numeric ID."New value: +"MyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or from get_my_anime_list/get_my_manga_list for an entry already on your list."
    • Changedget_anime4 fields changed
      • addedOutput schema / properties / relations / items / properties / entries / items / additionalProperties
        Added value: +false
      • addedOutput schema / properties / relations / items / properties / entries / items / properties
        Added value: +{
        +  "mal_id": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "media_type": {
        +    "type": "string"
        +  },
        +  "name": {
        +    "type": "string"
        +  },
        +  "type": {
        +    "type": "string"
        +  },
        +  "url": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / relations / items / properties / entries / items / required
        Added value: +[
        +  "mal_id"
        +]
      • changedOutput schema / properties / relations / items / properties / entries / items / type
        Previous value: -"string"New value: +"object"
    • Changedget_anime_characters1 field changed
      • addedOutput schema / properties / characters / items / properties / favorites
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedget_anime_episodes4 fields changed
      • addedOutput schema / properties / episodes / items / properties / duration
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / episodes / items / properties / image_url
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / episodes / items / properties / replies
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / episodes / items / properties / synopsis
        Added value: +{
        +  "type": "string"
        +}
    • Addedget_anime_interest_stacks
    • Changedget_anime_videos6 fields changed
      • addedOutput schema / properties / music_videos / items / properties / comment_count
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / music_videos / items / properties / duration
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / music_videos / items / properties / published_at
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / promo / items / properties / comment_count
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / promo / items / properties / duration
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / promo / items / properties / published_at
        Added value: +{
        +  "type": "string"
        +}
    • Addedget_interest_stack
    • Addedget_interest_stacks
    • Changedget_manga5 fields changed
      • addedOutput schema / properties / moreinfo
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / relations / items / properties / entries / items / additionalProperties
        Added value: +false
      • addedOutput schema / properties / relations / items / properties / entries / items / properties
        Added value: +{
        +  "mal_id": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "media_type": {
        +    "type": "string"
        +  },
        +  "name": {
        +    "type": "string"
        +  },
        +  "type": {
        +    "type": "string"
        +  },
        +  "url": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / relations / items / properties / entries / items / required
        Added value: +[
        +  "mal_id"
        +]
      • changedOutput schema / properties / relations / items / properties / entries / items / type
        Previous value: -"string"New value: +"object"
    • Changedget_manga_characters1 field changed
      • addedOutput schema / properties / characters / items / properties / favorites
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Addedget_manga_interest_stacks
    • Changedget_my_manga_list1 field changed
      • changedInput schema / properties / sort / description
        Previous value: -"Sort order."New value: +"Sort order. list_score/list_updated_at return highest/most-recent first; manga_title returns A-Z."
    • Changedget_person4 fields changed
      • addedInput schema / properties / full_credits
        Added value: +{
        +  "description": "If true, return every staff credit instead of the first 200. Only needed for the handful of people whose response reports `credits_truncated`. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / credits_truncated
        Added value: +{
        +  "const": true,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / total_anime_credits
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / total_manga_credits
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedget_random_anime4 fields changed
      • addedOutput schema / properties / relations / items / properties / entries / items / additionalProperties
        Added value: +false
      • addedOutput schema / properties / relations / items / properties / entries / items / properties
        Added value: +{
        +  "mal_id": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "media_type": {
        +    "type": "string"
        +  },
        +  "name": {
        +    "type": "string"
        +  },
        +  "type": {
        +    "type": "string"
        +  },
        +  "url": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / relations / items / properties / entries / items / required
        Added value: +[
        +  "mal_id"
        +]
      • changedOutput schema / properties / relations / items / properties / entries / items / type
        Previous value: -"string"New value: +"object"
    • Changedget_random_manga5 fields changed
      • addedOutput schema / properties / moreinfo
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / relations / items / properties / entries / items / additionalProperties
        Added value: +false
      • addedOutput schema / properties / relations / items / properties / entries / items / properties
        Added value: +{
        +  "mal_id": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "media_type": {
        +    "type": "string"
        +  },
        +  "name": {
        +    "type": "string"
        +  },
        +  "type": {
        +    "type": "string"
        +  },
        +  "url": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / relations / items / properties / entries / items / required
        Added value: +[
        +  "mal_id"
        +]
      • changedOutput schema / properties / relations / items / properties / entries / items / type
        Previous value: -"string"New value: +"object"
    • Changedget_random_person3 fields changed
      • addedOutput schema / properties / credits_truncated
        Added value: +{
        +  "const": true,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / total_anime_credits
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / total_manga_credits
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedget_top_people3 fields changed
      • addedOutput schema / properties / results / items / properties / credits_truncated
        Added value: +{
        +  "const": true,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / results / items / properties / total_anime_credits
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results / items / properties / total_manga_credits
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedsearch_people3 fields changed
      • addedOutput schema / properties / results / items / properties / credits_truncated
        Added value: +{
        +  "const": true,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / results / items / properties / total_anime_credits
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results / items / properties / total_manga_credits
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedupdate_my_anime_status1 field changed
      • changedInput schema / properties / anime_id / description
        Previous value: -"MyAnimeList numeric ID."New value: +"MyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or from get_my_anime_list/get_my_manga_list for an entry already on your list."
    • Changedupdate_my_manga_status3 fields changed
      • addedInput schema / properties / finish_date
        Added value: +{
        +  "description": "Date as YYYY-MM-DD.",
        +  "format": "date",
        +  "pattern": "^(?:(?:\\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])))$",
        +  "type": "string"
        +}
      • changedInput schema / properties / manga_id / description
        Previous value: -"MyAnimeList numeric ID."New value: +"MyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or from get_my_anime_list/get_my_manga_list for an entry already on your list."
      • addedInput schema / properties / start_date
        Added value: +{
        +  "description": "Date as YYYY-MM-DD.",
        +  "format": "date",
        +  "pattern": "^(?:(?:\\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])))$",
        +  "type": "string"
        +}
  3. 50 tool updatesv0.9.0
    • Changeddelete_my_anime_list_item3 fields changed
      • addedOutput schema / properties / anime_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / anime_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / anime_id / type
        Previous value: -"number"New value: +"integer"
    • Changeddelete_my_manga_list_item3 fields changed
      • addedOutput schema / properties / manga_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / manga_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / manga_id / type
        Previous value: -"number"New value: +"integer"
    • Changedget_anime30 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / episodes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / episodes / minimum
        Added value: +0
      • changedOutput schema / properties / episodes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / explicit_genres
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / external
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "name": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / moreinfo
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / scored_by / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / scored_by / minimum
        Added value: +0
      • changedOutput schema / properties / scored_by / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / title_synonyms
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / year / maximum
        Added value: +2100
      • addedOutput schema / properties / year / minimum
        Added value: +1900
      • changedOutput schema / properties / year / type
        Previous value: -"number"New value: +"integer"
    • Changedget_anime_characters4 fields changed
      • addedOutput schema / properties / characters / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / characters / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / characters / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / characters / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_anime_episodes16 fields changed
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • addedOutput schema / properties / episodes / items / properties / aired / format
        Added value: +"date-time"
      • addedOutput schema / properties / episodes / items / properties / aired / 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 / episodes / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / episodes / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / episodes / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
    • Changedget_anime_genres7 fields changed
      • addedOutput schema / properties / genres / items / properties / count / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / genres / items / properties / count / minimum
        Added value: +0
      • changedOutput schema / properties / genres / items / properties / count / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / genres / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / genres / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / genres / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / genres / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_anime_news21 fields changed
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / comments / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / comments / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / comments / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / date / format
        Added value: +"date-time"
      • addedOutput schema / properties / results / 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 / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
    • Changedget_anime_recommendations9 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / recommendations / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / recommendations / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / recommendations / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / recommendations / items / properties / votes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / recommendations / items / properties / votes / minimum
        Added value: +0
      • changedOutput schema / properties / recommendations / items / properties / votes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / recommendations / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_anime_reviews17 fields changed
      • 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"
    • Changedget_anime_schedule36 fields changed
      • changedInput schema / properties / day / description
        Previous value: -"Weekday to filter by. Omit for the whole week."New value: +"Weekday to filter by, or `unknown`/`other` for shows with no fixed weekly slot. Omit for the whole week."
      • changedInput schema / properties / day / enum
        Previous value: -[
        -  "monday",
        -  "tuesday",
        -  "wednesday",
        -  "thursday",
        -  "friday",
        -  "saturday",
        -  "sunday"
        -]New value: +[
        +  "monday",
        +  "tuesday",
        +  "wednesday",
        +  "thursday",
        +  "friday",
        +  "saturday",
        +  "sunday",
        +  "unknown",
        +  "other"
        +]
      • addedInput schema / properties / kids
        Added value: +{
        +  "description": "If true, exclude entries tagged as children's/kids content. Defaults to false.",
        +  "type": "boolean"
        +}
      • 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 / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / unapproved
        Added value: +{
        +  "description": "If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / episodes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / episodes / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / episodes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / year / maximum
        Added value: +2100
      • addedOutput schema / properties / results / items / properties / year / minimum
        Added value: +1900
      • changedOutput schema / properties / results / items / properties / year / type
        Previous value: -"number"New value: +"integer"
    • Changedget_anime_staff4 fields changed
      • addedOutput schema / properties / staff / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / staff / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / staff / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / staff / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_anime_statistics30 fields changed
      • addedOutput schema / properties / completed / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / completed / minimum
        Added value: +0
      • changedOutput schema / properties / completed / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / dropped / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / dropped / minimum
        Added value: +0
      • changedOutput schema / properties / dropped / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / on_hold / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / on_hold / minimum
        Added value: +0
      • changedOutput schema / properties / on_hold / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / plan_to_read / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / plan_to_read / minimum
        Added value: +0
      • changedOutput schema / properties / plan_to_read / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / plan_to_watch / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / plan_to_watch / minimum
        Added value: +0
      • changedOutput schema / properties / plan_to_watch / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / reading / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / reading / minimum
        Added value: +0
      • changedOutput schema / properties / reading / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / scores / items / properties / score / maximum
        Added value: +10
      • addedOutput schema / properties / scores / items / properties / score / minimum
        Added value: +1
      • changedOutput schema / properties / scores / items / properties / score / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / scores / items / properties / votes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / scores / items / properties / votes / minimum
        Added value: +0
      • changedOutput schema / properties / scores / items / properties / votes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / watching / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / watching / minimum
        Added value: +0
      • changedOutput schema / properties / watching / type
        Previous value: -"number"New value: +"integer"
    • Addedget_anime_videos
    • Changedget_character21 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / anime / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / anime / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / anime / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / anime / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / manga / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / manga / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / manga / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / manga / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / voice_actors / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / voice_actors / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / voice_actors / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / voice_actors / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / required
        Added value: +[
        +  "mal_id"
        +]
    • Addedget_magazines
    • Changedget_manga29 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / chapters / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / chapters / minimum
        Added value: +0
      • changedOutput schema / properties / chapters / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / explicit_genres
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / external
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "name": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / scored_by / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / scored_by / minimum
        Added value: +0
      • changedOutput schema / properties / scored_by / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / title_synonyms
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / volumes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / volumes / minimum
        Added value: +0
      • changedOutput schema / properties / volumes / type
        Previous value: -"number"New value: +"integer"
    • Changedget_manga_characters4 fields changed
      • addedOutput schema / properties / characters / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / characters / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / characters / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / characters / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_manga_genres7 fields changed
      • addedOutput schema / properties / genres / items / properties / count / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / genres / items / properties / count / minimum
        Added value: +0
      • changedOutput schema / properties / genres / items / properties / count / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / genres / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / genres / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / genres / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / genres / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Addedget_manga_news
    • Changedget_manga_recommendations9 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / recommendations / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / recommendations / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / recommendations / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / recommendations / items / properties / votes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / recommendations / items / properties / votes / minimum
        Added value: +0
      • changedOutput schema / properties / recommendations / items / properties / votes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / recommendations / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_manga_reviews17 fields changed
      • 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"
    • Changedget_manga_statistics30 fields changed
      • addedOutput schema / properties / completed / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / completed / minimum
        Added value: +0
      • changedOutput schema / properties / completed / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / dropped / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / dropped / minimum
        Added value: +0
      • changedOutput schema / properties / dropped / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / on_hold / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / on_hold / minimum
        Added value: +0
      • changedOutput schema / properties / on_hold / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / plan_to_read / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / plan_to_read / minimum
        Added value: +0
      • changedOutput schema / properties / plan_to_read / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / plan_to_watch / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / plan_to_watch / minimum
        Added value: +0
      • changedOutput schema / properties / plan_to_watch / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / reading / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / reading / minimum
        Added value: +0
      • changedOutput schema / properties / reading / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / scores / items / properties / score / maximum
        Added value: +10
      • addedOutput schema / properties / scores / items / properties / score / minimum
        Added value: +1
      • changedOutput schema / properties / scores / items / properties / score / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / scores / items / properties / votes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / scores / items / properties / votes / minimum
        Added value: +0
      • changedOutput schema / properties / scores / items / properties / votes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / watching / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / watching / minimum
        Added value: +0
      • changedOutput schema / properties / watching / type
        Previous value: -"number"New value: +"integer"
    • Changedget_my_anime_list4 fields changed
      • addedOutput schema / properties / items / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / items / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / items / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / items / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_my_manga_list4 fields changed
      • addedOutput schema / properties / items / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / items / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / items / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / items / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_my_user_info3 fields changed
      • addedOutput schema / properties / id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / id / type
        Previous value: -"number"New value: +"integer"
    • Addedget_news
    • Changedget_person17 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / anime / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / anime / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / anime / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / anime / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / manga / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / manga / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / manga / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / manga / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / required
        Added value: +[
        +  "mal_id"
        +]
    • Addedget_producer
    • Changedget_producers27 fields changed
      • addedInput schema / properties / letter
        Added value: +{
        +  "description": "Restrict results to entries whose title starts with this single letter.",
        +  "maxLength": 1,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • 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
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "desc",
        -  "asc"
        -]New value: +[
        +  "asc",
        +  "desc"
        +]
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / count / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / count / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / count / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / established / format
        Added value: +"date-time"
      • addedOutput schema / properties / results / items / properties / established / 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 / results / items / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_random_anime30 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / episodes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / episodes / minimum
        Added value: +0
      • changedOutput schema / properties / episodes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / explicit_genres
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / external
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "name": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / moreinfo
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / scored_by / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / scored_by / minimum
        Added value: +0
      • changedOutput schema / properties / scored_by / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / title_synonyms
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / year / maximum
        Added value: +2100
      • addedOutput schema / properties / year / minimum
        Added value: +1900
      • changedOutput schema / properties / year / type
        Previous value: -"number"New value: +"integer"
    • Changedget_random_character19 fields changed
      • addedOutput schema / properties / anime / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / anime / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / anime / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / anime / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / manga / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / manga / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / manga / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / manga / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / voice_actors / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / voice_actors / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / voice_actors / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / voice_actors / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_random_manga29 fields changed
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / chapters / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / chapters / minimum
        Added value: +0
      • changedOutput schema / properties / chapters / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / explicit_genres
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / external
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "name": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / scored_by / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / scored_by / minimum
        Added value: +0
      • changedOutput schema / properties / scored_by / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / title_synonyms
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / volumes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / volumes / minimum
        Added value: +0
      • changedOutput schema / properties / volumes / type
        Previous value: -"number"New value: +"integer"
    • Changedget_random_person15 fields changed
      • addedOutput schema / properties / anime / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / anime / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / anime / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / anime / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / manga / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / manga / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / manga / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / manga / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / required
        Added value: +[
        +  "mal_id"
        +]
    • Addedget_recent_anime_recommendations
    • Addedget_recent_manga_recommendations
    • Changedget_seasonal_anime40 fields changed
      • addedInput schema / properties / continuing
        Added value: +{
        +  "description": "If true, also include TV series continuing from a previous season. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / filter
        Added value: +{
        +  "description": "Restrict to one or more media types.",
        +  "items": {
        +    "description": "A media type.",
        +    "enum": [
        +      "tv",
        +      "movie",
        +      "ova",
        +      "special",
        +      "ona",
        +      "music",
        +      "cm",
        +      "pv",
        +      "tv_special"
        +    ],
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / kids
        Added value: +{
        +  "description": "If true, exclude entries tagged as children's/kids content. Defaults to false.",
        +  "type": "boolean"
        +}
      • 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 / order_by
        Added value: +{
        +  "description": "Field to order by. Defaults to members.",
        +  "enum": [
        +    "score",
        +    "members",
        +    "start_date"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • addedInput schema / properties / rating
        Added value: +{
        +  "description": "Restrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.",
        +  "items": {
        +    "description": "A MAL content rating: g (All Ages), pg (Children), pg13 (Teens 13+), r17 (17+ violence/profanity), r (R+ Mild Nudity), rx (Rx Hentai).",
        +    "enum": [
        +      "g",
        +      "pg",
        +      "pg13",
        +      "r17",
        +      "r",
        +      "rx"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / sfw / description
        Previous value: -"If true, exclude adult (NSFW) entries. Defaults to false (no filtering)."New value: +"If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those."
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "description": "Sort direction.",
        +  "enum": [
        +    "asc",
        +    "desc"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / unapproved
        Added value: +{
        +  "description": "If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / episodes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / episodes / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / episodes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / year / maximum
        Added value: +2100
      • addedOutput schema / properties / results / items / properties / year / minimum
        Added value: +1900
      • changedOutput schema / properties / results / items / properties / year / type
        Previous value: -"number"New value: +"integer"
    • Changedget_seasons_list4 fields changed
      • addedOutput schema / properties / seasons / items / properties / year / maximum
        Added value: +2100
      • addedOutput schema / properties / seasons / items / properties / year / minimum
        Added value: +1900
      • changedOutput schema / properties / seasons / items / properties / year / type
        Previous value: -"number"New value: +"integer"
      • changedOutput schema / properties / seasons / items / required
        Previous value: -[
        -  "seasons"
        -]New value: +[
        +  "year",
        +  "seasons"
        +]
    • Changedget_top_anime38 fields changed
      • 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
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog."
      • addedInput schema / properties / rating
        Added value: +{
        +  "description": "Restrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.",
        +  "items": {
        +    "description": "A MAL content rating: g (All Ages), pg (Children), pg13 (Teens 13+), r17 (17+ violence/profanity), r (R+ Mild Nudity), rx (Rx Hentai).",
        +    "enum": [
        +      "g",
        +      "pg",
        +      "pg13",
        +      "r17",
        +      "r",
        +      "rx"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"Restrict to a media type."New value: +"Restrict to one or more media types."
      • removedInput schema / properties / type / enum
        Removed value: -[
        -  "tv",
        -  "movie",
        -  "ova",
        -  "special",
        -  "ona",
        -  "music"
        -]
      • addedInput schema / properties / type / items
        Added value: +{
        +  "description": "A media type.",
        +  "enum": [
        +    "tv",
        +    "movie",
        +    "ova",
        +    "special",
        +    "ona",
        +    "music",
        +    "cm",
        +    "pv",
        +    "tv_special"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / type / minItems
        Added value: +1
      • changedInput schema / properties / type / type
        Previous value: -"string"New value: +"array"
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / episodes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / episodes / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / episodes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / year / maximum
        Added value: +2100
      • addedOutput schema / properties / results / items / properties / year / minimum
        Added value: +1900
      • changedOutput schema / properties / results / items / properties / year / type
        Previous value: -"number"New value: +"integer"
    • Changedget_top_characters31 fields changed
      • 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
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog."
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / anime / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / manga / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / properties / voice_actors / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / voice_actors / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / voice_actors / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / voice_actors / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_top_manga37 fields changed
      • 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
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog."
      • addedInput schema / properties / sfw
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"Filter by publication type."New value: +"Restrict to one or more publication types."
      • removedInput schema / properties / type / enum
        Removed value: -[
        -  "manga",
        -  "novel",
        -  "lightnovel",
        -  "oneshot",
        -  "doujin",
        -  "manhwa",
        -  "manhua"
        -]
      • addedInput schema / properties / type / items
        Added value: +{
        +  "description": "A publication type.",
        +  "enum": [
        +    "manga",
        +    "novel",
        +    "lightnovel",
        +    "oneshot",
        +    "doujin",
        +    "manhwa",
        +    "manhua"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / type / minItems
        Added value: +1
      • changedInput schema / properties / type / type
        Previous value: -"string"New value: +"array"
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / chapters / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / chapters / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / chapters / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / volumes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / volumes / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / volumes / type
        Previous value: -"number"New value: +"integer"
    • Changedget_top_people27 fields changed
      • 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
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog."
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / anime / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / manga / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedget_upcoming_season40 fields changed
      • addedInput schema / properties / continuing
        Added value: +{
        +  "description": "If true, also include TV series continuing from a previous season. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / filter
        Added value: +{
        +  "description": "Restrict to one or more media types.",
        +  "items": {
        +    "description": "A media type.",
        +    "enum": [
        +      "tv",
        +      "movie",
        +      "ova",
        +      "special",
        +      "ona",
        +      "music",
        +      "cm",
        +      "pv",
        +      "tv_special"
        +    ],
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / kids
        Added value: +{
        +  "description": "If true, exclude entries tagged as children's/kids content. Defaults to false.",
        +  "type": "boolean"
        +}
      • 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 / order_by
        Added value: +{
        +  "description": "Field to order by. Defaults to members.",
        +  "enum": [
        +    "score",
        +    "members",
        +    "start_date"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • addedInput schema / properties / rating
        Added value: +{
        +  "description": "Restrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.",
        +  "items": {
        +    "description": "A MAL content rating: g (All Ages), pg (Children), pg13 (Teens 13+), r17 (17+ violence/profanity), r (R+ Mild Nudity), rx (Rx Hentai).",
        +    "enum": [
        +      "g",
        +      "pg",
        +      "pg13",
        +      "r17",
        +      "r",
        +      "rx"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / sfw / description
        Previous value: -"If true, exclude adult (NSFW) entries. Defaults to false (no filtering)."New value: +"If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those."
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "description": "Sort direction.",
        +  "enum": [
        +    "asc",
        +    "desc"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / unapproved
        Added value: +{
        +  "description": "If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / episodes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / episodes / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / episodes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / year / maximum
        Added value: +2100
      • addedOutput schema / properties / results / items / properties / year / minimum
        Added value: +1900
      • changedOutput schema / properties / results / items / properties / year / type
        Previous value: -"number"New value: +"integer"
    • Removedget_user_favorites
    • Removedget_user_profile
    • Changedsearch_anime51 fields changed
      • addedInput schema / properties / end_date
        Added value: +{
        +  "description": "Only include entries whose end date is on or before this date (YYYY-MM-DD).",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / genres / description
        Previous value: -"Comma-separated Jikan genre IDs, e.g. '1,4'. Look up the IDs with get_anime_genres."New value: +"Comma-separated MAL genre IDs to include (max 25), e.g. '1,4'. Look up IDs with get_anime_genres."
      • addedInput schema / properties / genres_exclude
        Added value: +{
        +  "description": "Comma-separated MAL genre IDs to exclude (max 25), e.g. '1,4'. Look up IDs with get_anime_genres.",
        +  "pattern": "^\\d+(,\\d+)*$",
        +  "type": "string"
        +}
      • addedInput schema / properties / letter
        Added value: +{
        +  "description": "Restrict results to entries whose title starts with this single letter.",
        +  "maxLength": 1,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • 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 / max_score
        Added value: +{
        +  "description": "Maximum average MAL score (inclusive), 1-10.",
        +  "maximum": 10,
        +  "minimum": 1,
        +  "type": "number"
        +}
      • addedInput schema / properties / min_score
        Added value: +{
        +  "description": "Minimum average MAL score (inclusive), 0-10.",
        +  "maximum": 10,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / order_by / enum
        Previous value: -[
        -  "title",
        -  "start_date",
        -  "score",
        -  "rank",
        -  "popularity",
        -  "members",
        -  "favorites",
        -  "episodes"
        -]New value: +[
        +  "mal_id",
        +  "title",
        +  "start_date",
        +  "end_date",
        +  "episodes",
        +  "score",
        +  "scored_by",
        +  "rank",
        +  "popularity",
        +  "members",
        +  "favorites"
        +]
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • addedInput schema / properties / producers
        Added value: +{
        +  "description": "Comma-separated MAL producer/studio IDs to restrict to (max 25). Look up IDs with get_producers.",
        +  "pattern": "^\\d+(,\\d+)*$",
        +  "type": "string"
        +}
      • addedInput schema / properties / rating
        Added value: +{
        +  "description": "Restrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.",
        +  "items": {
        +    "description": "A MAL content rating: g (All Ages), pg (Children), pg13 (Teens 13+), r17 (17+ violence/profanity), r (R+ Mild Nudity), rx (Rx Hentai).",
        +    "enum": [
        +      "g",
        +      "pg",
        +      "pg13",
        +      "r17",
        +      "r",
        +      "rx"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / score
        Added value: +{
        +  "description": "Restrict to entries with exactly this average score (rarely useful — prefer min_score/max_score for a range).",
        +  "maximum": 9.99,
        +  "minimum": 1,
        +  "type": "number"
        +}
      • changedInput schema / properties / sfw / description
        Previous value: -"If true, exclude adult (NSFW) entries. Defaults to false (no filtering)."New value: +"If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those."
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "desc",
        -  "asc"
        -]New value: +[
        +  "asc",
        +  "desc"
        +]
      • addedInput schema / properties / start_date
        Added value: +{
        +  "description": "Only include entries whose start date is on or after this date (YYYY-MM-DD).",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"Filter by media type."New value: +"Restrict to one or more media types."
      • removedInput schema / properties / type / enum
        Removed value: -[
        -  "tv",
        -  "movie",
        -  "ova",
        -  "special",
        -  "ona",
        -  "music",
        -  "cm",
        -  "pv",
        -  "tv_special"
        -]
      • addedInput schema / properties / type / items
        Added value: +{
        +  "description": "A media type.",
        +  "enum": [
        +    "tv",
        +    "movie",
        +    "ova",
        +    "special",
        +    "ona",
        +    "music",
        +    "cm",
        +    "pv",
        +    "tv_special"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / type / minItems
        Added value: +1
      • changedInput schema / properties / type / type
        Previous value: -"string"New value: +"array"
      • addedInput schema / properties / unapproved
        Added value: +{
        +  "description": "If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / episodes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / episodes / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / episodes / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / year / maximum
        Added value: +2100
      • addedOutput schema / properties / results / items / properties / year / minimum
        Added value: +1900
      • changedOutput schema / properties / results / items / properties / year / type
        Previous value: -"number"New value: +"integer"
    • Changedsearch_characters34 fields changed
      • addedInput schema / properties / letter
        Added value: +{
        +  "description": "Restrict results to entries whose title starts with this single letter.",
        +  "maxLength": 1,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • 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
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "desc",
        -  "asc"
        -]New value: +[
        +  "asc",
        +  "desc"
        +]
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / anime / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / manga / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / properties / voice_actors / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / voice_actors / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / voice_actors / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / voice_actors / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedsearch_manga50 fields changed
      • addedInput schema / properties / end_date
        Added value: +{
        +  "description": "Only include entries whose end date is on or before this date (YYYY-MM-DD).",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / genres / description
        Previous value: -"Comma-separated Jikan genre IDs, e.g. '1,4'. Look up the IDs with get_manga_genres."New value: +"Comma-separated MAL genre IDs to include (max 25), e.g. '1,4'. Look up IDs with get_manga_genres."
      • addedInput schema / properties / genres_exclude
        Added value: +{
        +  "description": "Comma-separated MAL genre IDs to exclude (max 25), e.g. '1,4'. Look up IDs with get_manga_genres.",
        +  "pattern": "^\\d+(,\\d+)*$",
        +  "type": "string"
        +}
      • addedInput schema / properties / letter
        Added value: +{
        +  "description": "Restrict results to entries whose title starts with this single letter.",
        +  "maxLength": 1,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • 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 / magazines
        Added value: +{
        +  "description": "Comma-separated MAL magazine IDs to restrict to (max 25). Look up IDs with get_magazines.",
        +  "pattern": "^\\d+(,\\d+)*$",
        +  "type": "string"
        +}
      • addedInput schema / properties / max_score
        Added value: +{
        +  "description": "Maximum average MAL score (inclusive), 1-10.",
        +  "maximum": 10,
        +  "minimum": 1,
        +  "type": "number"
        +}
      • addedInput schema / properties / min_score
        Added value: +{
        +  "description": "Minimum average MAL score (inclusive), 0-10.",
        +  "maximum": 10,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / order_by / enum
        Previous value: -[
        -  "title",
        -  "start_date",
        -  "score",
        -  "rank",
        -  "popularity",
        -  "members",
        -  "favorites",
        -  "chapters",
        -  "volumes"
        -]New value: +[
        +  "mal_id",
        +  "title",
        +  "start_date",
        +  "end_date",
        +  "chapters",
        +  "volumes",
        +  "score",
        +  "scored_by",
        +  "rank",
        +  "popularity",
        +  "members",
        +  "favorites"
        +]
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • addedInput schema / properties / score
        Added value: +{
        +  "description": "Restrict to entries with exactly this average score (rarely useful — prefer min_score/max_score for a range).",
        +  "maximum": 9.99,
        +  "minimum": 1,
        +  "type": "number"
        +}
      • changedInput schema / properties / sfw / description
        Previous value: -"If true, exclude adult (NSFW) entries. Defaults to false (no filtering)."New value: +"If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fanservice) through — use `sfw_strict` to also exclude those."
      • addedInput schema / properties / sfw_strict
        Added value: +{
        +  "description": "If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "desc",
        -  "asc"
        -]New value: +[
        +  "asc",
        +  "desc"
        +]
      • addedInput schema / properties / start_date
        Added value: +{
        +  "description": "Only include entries whose start date is on or after this date (YYYY-MM-DD).",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"Filter by publication type."New value: +"Restrict to one or more publication types."
      • removedInput schema / properties / type / enum
        Removed value: -[
        -  "manga",
        -  "novel",
        -  "lightnovel",
        -  "oneshot",
        -  "doujin",
        -  "manhwa",
        -  "manhua"
        -]
      • addedInput schema / properties / type / items
        Added value: +{
        +  "description": "A publication type.",
        +  "enum": [
        +    "manga",
        +    "novel",
        +    "lightnovel",
        +    "oneshot",
        +    "doujin",
        +    "manhwa",
        +    "manhua"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / type / minItems
        Added value: +1
      • changedInput schema / properties / type / type
        Previous value: -"string"New value: +"array"
      • addedInput schema / properties / unapproved
        Added value: +{
        +  "description": "If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / chapters / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / chapters / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / chapters / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / members / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / members / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / members / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / popularity / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / popularity / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / popularity / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / rank / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / rank / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / rank / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / volumes / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / volumes / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / volumes / type
        Previous value: -"number"New value: +"integer"
    • Changedsearch_people30 fields changed
      • addedInput schema / properties / letter
        Added value: +{
        +  "description": "Restrict results to entries whose title starts with this single letter.",
        +  "maxLength": 1,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • 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
      • changedInput schema / properties / page / description
        Previous value: -"1-based page number for pagination."New value: +"1-based page number for pagination (1-1000)."
      • changedInput schema / properties / page / maximum
        Previous value: -9007199254740991New value: +1000
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "desc",
        -  "asc"
        -]New value: +[
        +  "asc",
        +  "desc"
        +]
      • addedOutput schema / properties / page / properties / current_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / current_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / current_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / last_visible_page / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / page / properties / last_visible_page / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / page / properties / last_visible_page / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / page / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / page / properties / total / minimum
        Added value: +0
      • changedOutput schema / properties / page / properties / total / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / anime / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / anime / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / properties / favorites / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / favorites / minimum
        Added value: +0
      • changedOutput schema / properties / results / items / properties / favorites / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / exclusiveMinimum
        Added value: +0
      • addedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / results / items / properties / manga / items / properties / mal_id / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / results / items / properties / manga / items / required
        Added value: +[
        +  "mal_id"
        +]
      • addedOutput schema / properties / results / items / required
        Added value: +[
        +  "mal_id"
        +]
    • Changedupdate_my_anime_status3 fields changed
      • addedOutput schema / properties / score / maximum
        Added value: +10
      • addedOutput schema / properties / score / minimum
        Added value: +0
      • changedOutput schema / properties / score / type
        Previous value: -"number"New value: +"integer"
    • Changedupdate_my_manga_status3 fields changed
      • addedOutput schema / properties / score / maximum
        Added value: +10
      • addedOutput schema / properties / score / minimum
        Added value: +0
      • changedOutput schema / properties / score / type
        Previous value: -"number"New value: +"integer"
  4. 45 tool updatesv0.8.0
    • Changeddelete_my_anime_list_item1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_my_manga_list_item1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_anime1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_anime_characters1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_anime_episodes1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_anime_genres1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedget_anime_news
    • Changedget_anime_recommendations1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedget_anime_reviews
    • Changedget_anime_schedule3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / default
        Added value: +25
      • addedOutput schema / properties / results / items / properties / broadcast
        Added value: +{
        +  "type": "string"
        +}
    • Addedget_anime_staff
    • Changedget_anime_statistics1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedget_character
    • Changedget_manga1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_manga_characters1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_manga_genres1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_manga_recommendations1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_manga_reviews2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / default
        Added value: +5
    • Addedget_manga_statistics
    • Changedget_my_anime_list2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / sort / description
        Previous value: -"Sort order."New value: +"Sort order. list_score/list_updated_at return highest/most-recent first; anime_title returns A-Z."
    • Addedget_my_manga_list
    • Changedget_my_user_info1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_person1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_producers1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_random_anime1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_random_character1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_random_manga1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedget_random_person
    • Addedget_seasonal_anime
    • Addedget_seasons_list
    • Changedget_top_anime2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / results / items / properties / broadcast
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_top_characters1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedget_top_manga
    • Addedget_top_people
    • Addedget_upcoming_season
    • Addedget_user_favorites
    • Addedget_user_profile
    • Addedlogin_mal
    • Changedsearch_anime4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / genres / description
        Previous value: -"Comma-separated Jikan genre IDs, e.g. '1,4'."New value: +"Comma-separated Jikan genre IDs, e.g. '1,4'. Look up the IDs with get_anime_genres."
      • addedInput schema / properties / genres / pattern
        Added value: +"^\\d+(,\\d+)*$"
      • addedOutput schema / properties / results / items / properties / broadcast
        Added value: +{
        +  "type": "string"
        +}
    • Changedsearch_characters1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedsearch_manga3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / genres / description
        Previous value: -"Comma-separated Jikan genre IDs, e.g. '1,4'."New value: +"Comma-separated Jikan genre IDs, e.g. '1,4'. Look up the IDs with get_manga_genres."
      • addedInput schema / properties / genres / pattern
        Added value: +"^\\d+(,\\d+)*$"
    • Addedsearch_people
    • Changedsubmit_mal_redirect1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedupdate_my_anime_status
    • Changedupdate_my_manga_status1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  5. 45 tool updatesv0.7.1
    • Changeddelete_my_anime_list_item2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "anime_id": {
        +      "type": "number"
        +    },
        +    "deleted": {
        +      "const": true,
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "deleted",
        +    "anime_id"
        +  ],
        +  "type": "object"
        +}
    • Changeddelete_my_manga_list_item2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "deleted": {
        +      "const": true,
        +      "type": "boolean"
        +    },
        +    "manga_id": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "deleted",
        +    "manga_id"
        +  ],
        +  "type": "object"
        +}
    • Changedget_anime2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "aired": {
        +      "type": "string"
        +    },
        +    "airing": {
        +      "type": "boolean"
        +    },
        +    "background": {
        +      "type": "string"
        +    },
        +    "broadcast": {
        +      "type": "string"
        +    },
        +    "demographics": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "duration": {
        +      "type": "string"
        +    },
        +    "ending_themes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "episodes": {
        +      "type": "number"
        +    },
        +    "favorites": {
        +      "type": "number"
        +    },
        +    "genres": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "image_url": {
        +      "type": "string"
        +    },
        +    "licensors": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "mal_id": {
        +      "type": "number"
        +    },
        +    "members": {
        +      "type": "number"
        +    },
        +    "opening_themes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "popularity": {
        +      "type": "number"
        +    },
        +    "producers": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "rank": {
        +      "type": "number"
        +    },
        +    "rating": {
        +      "type": "string"
        +    },
        +    "relations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entries": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "relation": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "score": {
        +      "type": "number"
        +    },
        +    "scored_by": {
        +      "type": "number"
        +    },
        +    "season": {
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "streaming": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "studios": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "synopsis": {
        +      "type": "string"
        +    },
        +    "themes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "title_english": {
        +      "type": "string"
        +    },
        +    "title_japanese": {
        +      "type": "string"
        +    },
        +    "trailer": {
        +      "type": "string"
        +    },
        +    "type": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "year": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "mal_id"
        +  ],
        +  "type": "object"
        +}
    • Changedget_anime_characters2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "characters": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "role": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "voice_actors": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "characters"
        +  ],
        +  "type": "object"
        +}
    • Changedget_anime_episodes2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "episodes": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "aired": {
        +            "type": "string"
        +          },
        +          "filler": {
        +            "type": "boolean"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "recap": {
        +            "type": "boolean"
        +          },
        +          "score": {
        +            "type": "number"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "title_japanese": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "current_page": {
        +          "type": "number"
        +        },
        +        "has_next_page": {
        +          "type": "boolean"
        +        },
        +        "last_visible_page": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "episodes",
        +    "page"
        +  ],
        +  "type": "object"
        +}
    • Changedget_anime_genres2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "genres": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "genres"
        +  ],
        +  "type": "object"
        +}
    • Removedget_anime_news
    • Changedget_anime_recommendations2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "recommendations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "votes": {
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "recommendations"
        +  ],
        +  "type": "object"
        +}
    • Removedget_anime_reviews
    • Changedget_anime_schedule2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "current_page": {
        +          "type": "number"
        +        },
        +        "has_next_page": {
        +          "type": "boolean"
        +        },
        +        "last_visible_page": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "aired": {
        +            "type": "string"
        +          },
        +          "airing": {
        +            "type": "boolean"
        +          },
        +          "demographics": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "episodes": {
        +            "type": "number"
        +          },
        +          "genres": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "image_url": {
        +            "type": "string"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "members": {
        +            "type": "number"
        +          },
        +          "popularity": {
        +            "type": "number"
        +          },
        +          "rank": {
        +            "type": "number"
        +          },
        +          "rating": {
        +            "type": "string"
        +          },
        +          "score": {
        +            "type": "number"
        +          },
        +          "season": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "studios": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "synopsis": {
        +            "type": "string"
        +          },
        +          "themes": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "title_english": {
        +            "type": "string"
        +          },
        +          "type": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "year": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "mal_id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "page"
        +  ],
        +  "type": "object"
        +}
    • Removedget_anime_staff
    • Changedget_anime_statistics2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "completed": {
        +      "type": "number"
        +    },
        +    "dropped": {
        +      "type": "number"
        +    },
        +    "on_hold": {
        +      "type": "number"
        +    },
        +    "plan_to_read": {
        +      "type": "number"
        +    },
        +    "plan_to_watch": {
        +      "type": "number"
        +    },
        +    "reading": {
        +      "type": "number"
        +    },
        +    "scores": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "percentage": {
        +            "type": "number"
        +          },
        +          "score": {
        +            "type": "number"
        +          },
        +          "votes": {
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "watching": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
    • Removedget_character
    • Changedget_manga2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "authors": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "background": {
        +      "type": "string"
        +    },
        +    "chapters": {
        +      "type": "number"
        +    },
        +    "demographics": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "favorites": {
        +      "type": "number"
        +    },
        +    "genres": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "image_url": {
        +      "type": "string"
        +    },
        +    "mal_id": {
        +      "type": "number"
        +    },
        +    "members": {
        +      "type": "number"
        +    },
        +    "popularity": {
        +      "type": "number"
        +    },
        +    "published": {
        +      "type": "string"
        +    },
        +    "publishing": {
        +      "type": "boolean"
        +    },
        +    "rank": {
        +      "type": "number"
        +    },
        +    "relations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entries": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "relation": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "score": {
        +      "type": "number"
        +    },
        +    "scored_by": {
        +      "type": "number"
        +    },
        +    "serializations": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "synopsis": {
        +      "type": "string"
        +    },
        +    "themes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "title_english": {
        +      "type": "string"
        +    },
        +    "title_japanese": {
        +      "type": "string"
        +    },
        +    "type": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "volumes": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "mal_id"
        +  ],
        +  "type": "object"
        +}
    • Changedget_manga_characters2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "characters": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "role": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "voice_actors": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "characters"
        +  ],
        +  "type": "object"
        +}
    • Changedget_manga_genres2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "genres": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "genres"
        +  ],
        +  "type": "object"
        +}
    • Changedget_manga_recommendations2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "recommendations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "votes": {
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "recommendations"
        +  ],
        +  "type": "object"
        +}
    • Changedget_manga_reviews2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "reviews": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "type": "string"
        +          },
        +          "review": {
        +            "type": "string"
        +          },
        +          "score": {
        +            "type": "number"
        +          },
        +          "tags": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "user": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tags"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "reviews"
        +  ],
        +  "type": "object"
        +}
    • Removedget_manga_statistics
    • Changedget_my_anime_list2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "has_next_page": {
        +      "type": "boolean"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "list_status": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "items",
        +    "has_next_page"
        +  ],
        +  "type": "object"
        +}
    • Removedget_my_manga_list
    • Changedget_my_user_info2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "properties": {
        +    "anime_statistics": {
        +      "additionalProperties": {},
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "id": {
        +      "type": "number"
        +    },
        +    "joined_at": {
        +      "type": "string"
        +    },
        +    "location": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "name": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name"
        +  ],
        +  "type": "object"
        +}
    • Changedget_person2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "about": {
        +      "type": "string"
        +    },
        +    "alternate_names": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "anime": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "position": {
        +            "type": "string"
        +          },
        +          "role": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "birthday": {
        +      "type": "string"
        +    },
        +    "family_name": {
        +      "type": "string"
        +    },
        +    "favorites": {
        +      "type": "number"
        +    },
        +    "given_name": {
        +      "type": "string"
        +    },
        +    "image_url": {
        +      "type": "string"
        +    },
        +    "mal_id": {
        +      "type": "number"
        +    },
        +    "manga": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "position": {
        +            "type": "string"
        +          },
        +          "role": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "voice_roles": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "anime": {
        +            "type": "string"
        +          },
        +          "character": {
        +            "type": "string"
        +          },
        +          "role": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_producers2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "current_page": {
        +          "type": "number"
        +        },
        +        "has_next_page": {
        +          "type": "boolean"
        +        },
        +        "last_visible_page": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "established": {
        +            "type": "string"
        +          },
        +          "favorites": {
        +            "type": "number"
        +          },
        +          "image_url": {
        +            "type": "string"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "page"
        +  ],
        +  "type": "object"
        +}
    • Changedget_random_anime2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "aired": {
        +      "type": "string"
        +    },
        +    "airing": {
        +      "type": "boolean"
        +    },
        +    "background": {
        +      "type": "string"
        +    },
        +    "broadcast": {
        +      "type": "string"
        +    },
        +    "demographics": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "duration": {
        +      "type": "string"
        +    },
        +    "ending_themes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "episodes": {
        +      "type": "number"
        +    },
        +    "favorites": {
        +      "type": "number"
        +    },
        +    "genres": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "image_url": {
        +      "type": "string"
        +    },
        +    "licensors": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "mal_id": {
        +      "type": "number"
        +    },
        +    "members": {
        +      "type": "number"
        +    },
        +    "opening_themes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "popularity": {
        +      "type": "number"
        +    },
        +    "producers": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "rank": {
        +      "type": "number"
        +    },
        +    "rating": {
        +      "type": "string"
        +    },
        +    "relations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entries": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "relation": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "score": {
        +      "type": "number"
        +    },
        +    "scored_by": {
        +      "type": "number"
        +    },
        +    "season": {
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "streaming": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "studios": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "synopsis": {
        +      "type": "string"
        +    },
        +    "themes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "title_english": {
        +      "type": "string"
        +    },
        +    "title_japanese": {
        +      "type": "string"
        +    },
        +    "trailer": {
        +      "type": "string"
        +    },
        +    "type": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "year": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "mal_id"
        +  ],
        +  "type": "object"
        +}
    • Changedget_random_character2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "about": {
        +      "type": "string"
        +    },
        +    "anime": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "position": {
        +            "type": "string"
        +          },
        +          "role": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "favorites": {
        +      "type": "number"
        +    },
        +    "image_url": {
        +      "type": "string"
        +    },
        +    "mal_id": {
        +      "type": "number"
        +    },
        +    "manga": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "position": {
        +            "type": "string"
        +          },
        +          "role": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "name_kanji": {
        +      "type": "string"
        +    },
        +    "nicknames": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "voice_actors": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "language": {
        +            "type": "string"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_random_manga2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "authors": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "background": {
        +      "type": "string"
        +    },
        +    "chapters": {
        +      "type": "number"
        +    },
        +    "demographics": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "favorites": {
        +      "type": "number"
        +    },
        +    "genres": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "image_url": {
        +      "type": "string"
        +    },
        +    "mal_id": {
        +      "type": "number"
        +    },
        +    "members": {
        +      "type": "number"
        +    },
        +    "popularity": {
        +      "type": "number"
        +    },
        +    "published": {
        +      "type": "string"
        +    },
        +    "publishing": {
        +      "type": "boolean"
        +    },
        +    "rank": {
        +      "type": "number"
        +    },
        +    "relations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entries": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "relation": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "score": {
        +      "type": "number"
        +    },
        +    "scored_by": {
        +      "type": "number"
        +    },
        +    "serializations": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "synopsis": {
        +      "type": "string"
        +    },
        +    "themes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "title_english": {
        +      "type": "string"
        +    },
        +    "title_japanese": {
        +      "type": "string"
        +    },
        +    "type": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    },
        +    "volumes": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "mal_id"
        +  ],
        +  "type": "object"
        +}
    • Removedget_random_person
    • Removedget_seasonal_anime
    • Removedget_seasons_list
    • Changedget_top_anime2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "current_page": {
        +          "type": "number"
        +        },
        +        "has_next_page": {
        +          "type": "boolean"
        +        },
        +        "last_visible_page": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "aired": {
        +            "type": "string"
        +          },
        +          "airing": {
        +            "type": "boolean"
        +          },
        +          "demographics": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "episodes": {
        +            "type": "number"
        +          },
        +          "genres": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "image_url": {
        +            "type": "string"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "members": {
        +            "type": "number"
        +          },
        +          "popularity": {
        +            "type": "number"
        +          },
        +          "rank": {
        +            "type": "number"
        +          },
        +          "rating": {
        +            "type": "string"
        +          },
        +          "score": {
        +            "type": "number"
        +          },
        +          "season": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "studios": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "synopsis": {
        +            "type": "string"
        +          },
        +          "themes": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "title_english": {
        +            "type": "string"
        +          },
        +          "type": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "year": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "mal_id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "page"
        +  ],
        +  "type": "object"
        +}
    • Changedget_top_characters2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "current_page": {
        +          "type": "number"
        +        },
        +        "has_next_page": {
        +          "type": "boolean"
        +        },
        +        "last_visible_page": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "about": {
        +            "type": "string"
        +          },
        +          "anime": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "mal_id": {
        +                  "type": "number"
        +                },
        +                "position": {
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                },
        +                "title": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "favorites": {
        +            "type": "number"
        +          },
        +          "image_url": {
        +            "type": "string"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "manga": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "mal_id": {
        +                  "type": "number"
        +                },
        +                "position": {
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                },
        +                "title": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "name_kanji": {
        +            "type": "string"
        +          },
        +          "nicknames": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "voice_actors": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "language": {
        +                  "type": "string"
        +                },
        +                "mal_id": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "page"
        +  ],
        +  "type": "object"
        +}
    • Removedget_top_manga
    • Removedget_top_people
    • Removedget_upcoming_season
    • Removedget_user_favorites
    • Removedget_user_profile
    • Removedlogin_mal
    • Changedsearch_anime2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "current_page": {
        +          "type": "number"
        +        },
        +        "has_next_page": {
        +          "type": "boolean"
        +        },
        +        "last_visible_page": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "aired": {
        +            "type": "string"
        +          },
        +          "airing": {
        +            "type": "boolean"
        +          },
        +          "demographics": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "episodes": {
        +            "type": "number"
        +          },
        +          "genres": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "image_url": {
        +            "type": "string"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "members": {
        +            "type": "number"
        +          },
        +          "popularity": {
        +            "type": "number"
        +          },
        +          "rank": {
        +            "type": "number"
        +          },
        +          "rating": {
        +            "type": "string"
        +          },
        +          "score": {
        +            "type": "number"
        +          },
        +          "season": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "studios": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "synopsis": {
        +            "type": "string"
        +          },
        +          "themes": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "title_english": {
        +            "type": "string"
        +          },
        +          "type": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "year": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "mal_id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "page"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_characters2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "current_page": {
        +          "type": "number"
        +        },
        +        "has_next_page": {
        +          "type": "boolean"
        +        },
        +        "last_visible_page": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "about": {
        +            "type": "string"
        +          },
        +          "anime": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "mal_id": {
        +                  "type": "number"
        +                },
        +                "position": {
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                },
        +                "title": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "favorites": {
        +            "type": "number"
        +          },
        +          "image_url": {
        +            "type": "string"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "manga": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "mal_id": {
        +                  "type": "number"
        +                },
        +                "position": {
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                },
        +                "title": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "name_kanji": {
        +            "type": "string"
        +          },
        +          "nicknames": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "voice_actors": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "language": {
        +                  "type": "string"
        +                },
        +                "mal_id": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "page"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_manga3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / genres / description
        Previous value: -"Comma-separated Jikan genre IDs."New value: +"Comma-separated Jikan genre IDs, e.g. '1,4'."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "page": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "current_page": {
        +          "type": "number"
        +        },
        +        "has_next_page": {
        +          "type": "boolean"
        +        },
        +        "last_visible_page": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "authors": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "chapters": {
        +            "type": "number"
        +          },
        +          "demographics": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "genres": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "image_url": {
        +            "type": "string"
        +          },
        +          "mal_id": {
        +            "type": "number"
        +          },
        +          "members": {
        +            "type": "number"
        +          },
        +          "popularity": {
        +            "type": "number"
        +          },
        +          "published": {
        +            "type": "string"
        +          },
        +          "rank": {
        +            "type": "number"
        +          },
        +          "score": {
        +            "type": "number"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "synopsis": {
        +            "type": "string"
        +          },
        +          "themes": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "title_english": {
        +            "type": "string"
        +          },
        +          "type": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "volumes": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "mal_id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "page"
        +  ],
        +  "type": "object"
        +}
    • Removedsearch_people
    • Changedsubmit_mal_redirect2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "logged_in": {
        +      "const": true,
        +      "type": "boolean"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "user": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "logged_in",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Removedupdate_my_anime_status
    • Changedupdate_my_manga_status2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "properties": {
        +    "score": {
        +      "type": "number"
        +    },
        +    "status": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  6. 2 tool updatesv0.3.0
    • Addedlogin_mal
    • Addedsubmit_mal_redirect
  7. 25 tool updatesv0.2.0
    • Addedget_anime_episodes
    • Addedget_anime_genres
    • Addedget_anime_news
    • Addedget_anime_staff
    • Addedget_anime_statistics
    • Addedget_character
    • Addedget_manga_characters
    • Addedget_manga_genres
    • Addedget_manga_recommendations
    • Addedget_manga_reviews
    • Addedget_manga_statistics
    • Addedget_person
    • Addedget_producers
    • Addedget_random_anime
    • Addedget_random_character
    • Addedget_random_manga
    • Addedget_random_person
    • Addedget_seasons_list
    • Addedget_top_characters
    • Addedget_top_people
    • Addedget_upcoming_season
    • Addedsearch_characters
    • Addedsearch_people
    • Changedupdate_my_anime_status4 fields changed
      • addedInput schema / properties / num_times_rewatched
        Added value: +{
        +  "description": "Times rewatched.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / priority
        Added value: +{
        +  "description": "List priority: 0 = low, 1 = medium, 2 = high.",
        +  "maximum": 2,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / rewatch_value
        Added value: +{
        +  "description": "Rewatch/reread value: 0 = none … 5 = very high.",
        +  "maximum": 5,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Comma-separated free-text tags.",
        +  "type": "string"
        +}
    • Changedupdate_my_manga_status4 fields changed
      • addedInput schema / properties / num_times_reread
        Added value: +{
        +  "description": "Times reread.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / priority
        Added value: +{
        +  "description": "List priority: 0 = low, 1 = medium, 2 = high.",
        +  "maximum": 2,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / reread_value
        Added value: +{
        +  "description": "Rewatch/reread value: 0 = none … 5 = very high.",
        +  "maximum": 5,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Comma-separated free-text tags.",
        +  "type": "string"
        +}
  8. 20 tool updatesv0.1.0
    • First observeddelete_my_anime_list_item
    • First observeddelete_my_manga_list_item
    • First observedget_anime
    • First observedget_anime_characters
    • First observedget_anime_recommendations
    • First observedget_anime_reviews
    • First observedget_anime_schedule
    • First observedget_manga
    • First observedget_my_anime_list
    • First observedget_my_manga_list
    • First observedget_my_user_info
    • First observedget_seasonal_anime
    • First observedget_top_anime
    • First observedget_top_manga
    • First observedget_user_favorites
    • First observedget_user_profile
    • First observedsearch_anime
    • First observedsearch_manga
    • First observedupdate_my_anime_status
    • First observedupdate_my_manga_status

TDQS

A4/5.0

Scored across 54 tools

Disambiguation4/5

The tools are largely distinguishable by resource and action, and descriptions explicitly cross-reference close alternatives (e.g. site-wide news vs per-title news, top vs seasonal vs upcoming anime). However, with 54 tools there are many fine-grained siblings—multiple recommendation feeds, anime/manga twins, and several discovery/ranking tools—so an agent must read carefully to avoid misselection.

Naming Consistency5/5

Names follow a predictable snake_case verb_noun pattern throughout: search_*, get_*, update_*, delete_*, plus login_mal/submit_mal_redirect. Resource qualifiers (anime, manga, character, person) are applied consistently across the set.

Tool Count2/5

54 tools is very heavy for an agent-facing server. While the MyAnimeList domain is broad, many tools are narrow variants (separate random_*, anime/manga recommendation twins, multiple news tools), making the surface larger than necessary and increasing selection cost.

Completeness4/5

Coverage is broad: search/details for anime, manga, characters, people, producers, magazines, genres, recommendations, reviews, news, statistics, interest stacks, seasonal data, and authenticated list CRUD with login flow. Minor gaps remain around anime/manga image galleries, forums/clubs, and richer user-profile lookup, but core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that provides access to MyAnimeList's API for anime and manga data. It enables users to search, view rankings, manage their personal lists, and get recommendations through Claude and other MCP clients.
    295 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server for anime and manga discovery, enabling search, detail retrieval, franchise watch order, seasonal schedule, character lookups, rankings, and studio filmography via natural language.
    134 npm
    2
    Apache 2.0