Skip to main content
Glama

mcp-animenewsnetwork

npm CI license MCP Registry Glama M8ven LobeHub Install in Cursor Install in VS Code

Anime News Network has been covering anime and manga since 1998. It keeps an encyclopedia of the works themselves, with the cast and staff credited on each, the episodes, the releases, the opening and ending themes and the readers' ratings, and it runs a news wire alongside it, with separate editions for the United States, the United Kingdom and Australia.

This server connects a chat client to both. You can search the encyclopedia for an anime or a manga, read one entry with its credits and its details, list what was recently added or browse the encyclopedia alphabetically, and read the news wire. It needs no API key and no account.

Version française


Install

One-click install

Install in Cursor Install in VS Code

Claude Code

claude mcp add animenewsnetwork -- npx -y mcp-animenewsnetwork

Claude Desktop, Cursor, and any client using the standard config format

{
  "mcpServers": {
    "animenewsnetwork": {
      "command": "npx",
      "args": ["-y", "mcp-animenewsnetwork"]
    }
  }
}

Node 24 or later is required, and no environment variable has to be set.

With Docker

{
  "mcpServers": {
    "animenewsnetwork": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-animenewsnetwork:3.0.0"]
    }
  }
}

-i keeps stdin open, which is where the protocol travels, and -t is left out because a TTY rewrites the stream. The container needs outbound HTTPS to cdn.animenewsnetwork.com and www.animenewsnetwork.com, and nothing else: no volume, no port, no credential.

Bundle, without npm

Download mcp-animenewsnetwork-2.0.1.mcpb from the latest release and open it. A client that supports MCP bundles installs it on its own, with no npm and no configuration file to edit. The bundle carries its dependencies, so nothing is fetched at install time.

Related MCP server: mal-mcp

What you can ask

  • "What does the encyclopedia have on Cowboy Bebop?"

  • "Who voiced Spike, and in which languages?"

  • "What anime were added to the encyclopedia recently?"

  • "What is the anime news today?"

  • "How did readers rate that series?"

The ordinary path runs from a search to an entry: a row carries an id and a kind, and get_title takes both together.

Tools

Tool

What it does

search_titles

Finds anime and manga by title in the encyclopedia.

get_title

Reads one entry, its credits and its details.

list_recent

Lists what was recently added, or browses the encyclopedia by letter.

get_news

Reads the news wire.

An entry is addressed by its id together with its kind, since the encyclopedia numbers anime and manga separately.

search_titles

Finds anime and manga by title.

Argument

Type

Required

What it does

query

string, at least 1 character

yes

A title, or part of one.

kind

anime, manga or both, default both

no

Which part of the encyclopedia.

limit

integer, 1 to 50, default 10

no

Rows to serve.

In return: rows carrying id and kind, which get_title takes together; name; type, reading TV, movie, OAV, ONA, special, manga or novel; precision; vintage, the original release date or range as published; and source_url. A field the entry leaves empty is null.

get_title

Reads one entry. The heavier parts are asked for rather than served by default.

Argument

Type

Required

What it does

id

integer, 1 or more

yes

The encyclopedia id.

kind

anime or manga

yes

Which lookup the id belongs to.

sections

array of basic, cast, staff, episodes, releases, related, news, reviews, default ["basic"]

no

Which parts to return.

max_chars

integer, 200 to 20000, default 4000

no

How much of the plot summary to serve.

offset

integer, 0 or more, default 0

no

Where to resume the plot summary.

In return: title, the entry a search row carries, which comes back whatever was asked for so that any answer can be cited. Asking for basic adds alt_titles, genres, themes, episode_count, running_time, objectionable_content, official_websites, picture_url, opening_themes and ending_themes. ratings carries the readers' votes, weighted_score and bayesian_score, each null where the encyclopedia computed none. plot_summary is served a slice at a time, described by total_chars, returned_chars, offset, next_offset and truncated. A cast entry names the role, the person and the lang they performed in.

list_recent

Lists what was recently added to the encyclopedia, or browses it by first letter.

Argument

Type

Required

What it does

kind

anime, manga, person or company, default anime

no

What to list.

starts_with

a single character

no

Browse the entries beginning with it.

limit

integer, 1 to 50, default 20

no

Rows to serve.

offset

integer, 0 or more, default 0

no

Rows to skip, for paging.

In return: rows, each carrying id, kind, name, type, precision, vintage, date_added and source_url, any of which the report may leave empty. mode says whether the answer was read as recent or as browse, since passing starts_with changes the question being asked, and next_offset continues.

get_news

Reads the news wire.

Argument

Type

Required

What it does

feed

all, news or reviews, default all

no

Which feed to read.

edition

us, uk or au, default us

no

Which edition.

category

string

no

Keep the stories carrying this tag.

limit

integer, 1 to 100, default 20

no

Stories to serve.

In return: items, each with its title, link, summary, categories holding every tag the feed carries on the story, and published_at as an ISO timestamp when the feed's date could be read. total_available counts the stories the feed held, which is a fixed feed length rather than the size of the archive.

Configuration

Every variable is optional. Set them in the env block of your client config.

Variable

Default

What it does

ANN_USER_AGENT

the project identity

Names your application to the service, with an address where a person can be reached.

ANN_MIN_INTERVAL_MS

1100

Gap between two requests, from 1000 to 60000.

ANN_TIMEOUT_MS

15000

Deadline for one request, from 1000 to 120000.

ANN_MAX_RETRIES

3

Attempts after a transient failure, from 0 to 10.

ANN_CACHE_TTL_MS

3600000

How long an encyclopedia entry stays in memory, from 0 to 86400000.

ANN_NEWS_CACHE_TTL_MS

300000

How long a news feed stays in memory, from 0 to 86400000.

ANN_CACHE_MAX_ENTRIES

200

Answers held in memory at once, from 0 to 10000.

ANN_LOG_LEVEL

error

silent, error, info or debug, written to stderr.

The news wire publishes several times an hour where the encyclopedia changes rarely, so the two are held for different lengths of time. A value outside its range falls back to the default, and the reason is written to stderr.

Errors

Every failure carries one of six codes, a message, and where it helps a hint naming the next move.

Code

What happened

What to do

not_found

The service answered, and holds no such entry.

Check the id and the kind with search_titles.

invalid_input

The arguments were refused before any request went out.

Read the message, which names the argument.

rate_limited

The service asked this client to slow down.

Wait the number of seconds the hint names and call again with the same arguments. The entry is still there.

parse_failure

The answer arrived in a shape this client cannot read.

Report it at the issue tracker.

network_error

The request did not complete.

Try again shortly.

timeout

The request passed its deadline.

Raise ANN_TIMEOUT_MS, or ask for fewer rows.

As a library

The layer reading the service is published on its own, with its pacing, its cache and its errors, and with no protocol attached.

import { AnnClient } from "mcp-animenewsnetwork/client";

const client = new AnnClient();
const { data, cached } = await client.getTitle("anime", 1);
console.log(data.name, cached);

Each read answers { data, cached }, and throws an error carrying one of the six codes. The floor between two requests holds here as well.

Pacing and attribution

Requests go out one at a time with at least 1.1 seconds between them, and the floor of one second holds however the server is configured. The User-Agent always ends with the project identity and an address where a person can be reached.

Every result carries the address of the encyclopedia page or of the article. The encyclopedia and the news are the work of Anime News Network and its contributors, and attribution is what the service asks for in return.

This MCP server is an unofficial project, with no affiliation to Anime News Network.

Privacy

This server collects nothing about you and sends nothing to its author. It runs on your machine, contacts cdn.animenewsnetwork.com and www.animenewsnetwork.com and nothing else, holds its answers in memory while it runs, and writes nothing to disk. PRIVACY.md states what a request carries and which settings change any of it.

Development

npm install
npm run build:fixtures
npm test
npm run check

Tests run against generated fixtures and make no network request. The live suite, npm run test:live, makes one request per route and runs nightly against the service itself.

Contributing

Bugs, questions and ideas belong in the issue tracker. Pull requests are welcome; opening an issue first helps agree on the shape of the change. See CONTRIBUTING.md.

License

MIT, see LICENSE. The encyclopedia and the news belong to Anime News Network and its contributors.


mcp-animenewsnetwork (français)

English version

Anime News Network couvre l'anime et le manga depuis 1998. Le site tient une encyclopédie des œuvres elles-mêmes, avec les interprètes et l'équipe créditée sur chacune, les épisodes, les parutions, les génériques de début et de fin et les notes de ses lecteurs, et il fait tourner à côté un fil d'actualité, avec des éditions distinctes pour les États-Unis, le Royaume-Uni et l'Australie.

Ce serveur relie un client de conversation aux deux. On peut chercher un anime ou un manga dans l'encyclopédie, lire une fiche avec ses crédits et ses détails, lister ce qui vient d'être ajouté ou parcourir l'encyclopédie par lettre, et lire le fil d'actualité. Aucune clé d'API, aucun compte.

Installation

Installation en un clic

Install in Cursor Install in VS Code

Claude Code

claude mcp add animenewsnetwork -- npx -y mcp-animenewsnetwork

Claude Desktop, Cursor, et tout client au format de configuration standard

{
  "mcpServers": {
    "animenewsnetwork": {
      "command": "npx",
      "args": ["-y", "mcp-animenewsnetwork"]
    }
  }
}

Node 24 ou plus récent est nécessaire, et aucune variable d'environnement n'est à renseigner.

Avec Docker

{
  "mcpServers": {
    "animenewsnetwork": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-animenewsnetwork:3.0.0"]
    }
  }
}

-i garde l'entrée standard ouverte, qui est le canal du protocole, et -t est omis parce qu'un TTY réécrit le flux. Le conteneur a besoin d'un accès HTTPS sortant vers cdn.animenewsnetwork.com et www.animenewsnetwork.com, et de rien d'autre : aucun volume, aucun port, aucun identifiant.

Bundle, sans npm

Téléchargez mcp-animenewsnetwork-2.0.1.mcpb depuis la dernière publication et ouvrez-le. Un client qui gère les bundles MCP l'installe seul, sans npm et sans fichier de configuration à modifier. Le bundle emporte ses dépendances, donc rien n'est téléchargé à l'installation.

Ce qu'on peut demander

  • « Qu'est-ce que l'encyclopédie a sur Cowboy Bebop ? »

  • « Qui a doublé Spike, et dans quelles langues ? »

  • « Quels animes ont été ajoutés récemment à l'encyclopédie ? »

  • « Quelle est l'actualité anime du jour ? »

  • « Comment les lecteurs ont-ils noté cette série ? »

Le chemin ordinaire va d'une recherche à une fiche : une ligne porte un id et un kind, et get_title reprend les deux ensemble.

Les outils

Outil

Ce qu'il fait

search_titles

Trouve des animes et des mangas par leur titre dans l'encyclopédie.

get_title

Lit une fiche, ses crédits et ses détails.

list_recent

Liste les ajouts récents, ou parcourt l'encyclopédie par lettre.

get_news

Lit le fil d'actualité.

Une fiche s'adresse par son id accompagné de son kind, l'encyclopédie numérotant les animes et les mangas séparément.

search_titles

Trouve des animes et des mangas par leur titre.

Argument

Type

Requis

Ce qu'il fait

query

chaîne, au moins 1 caractère

oui

Un titre, ou une partie.

kind

anime, manga ou both, défaut both

non

La partie de l'encyclopédie.

limit

entier, 1 à 50, défaut 10

non

Lignes à servir.

En retour : des lignes portant id et kind, que get_title reprend ensemble ; name ; type, valant TV, movie, OAV, ONA, special, manga ou novel ; precision ; vintage, la date ou la période de parution telle que publiée ; et source_url. Un champ que la fiche laisse vide vaut null.

get_title

Lit une fiche. Les parties lourdes se demandent au lieu d'être servies par défaut.

Argument

Type

Requis

Ce qu'il fait

id

entier, 1 ou plus

oui

L'identifiant encyclopédique.

kind

anime ou manga

oui

Le registre dont l'id relève.

sections

tableau de basic, cast, staff, episodes, releases, related, news, reviews, défaut ["basic"]

non

Les parties à rendre.

max_chars

entier, 200 à 20000, défaut 4000

non

La longueur de résumé à servir.

offset

entier, 0 ou plus, défaut 0

non

Où reprendre le résumé.

En retour : title, la fiche que porte une ligne de recherche, qui revient quelle que soit la demande pour que toute réponse puisse être citée. Demander basic y ajoute alt_titles, genres, themes, episode_count, running_time, objectionable_content, official_websites, picture_url, opening_themes et ending_themes. ratings porte les votes des lecteurs, le weighted_score et le bayesian_score, chacun null là où l'encyclopédie n'en a calculé aucun. plot_summary est servi par tranches, décrites par total_chars, returned_chars, offset, next_offset et truncated. Une entrée de distribution nomme le role, la person et la langue lang dans laquelle elle a joué.

list_recent

Liste les ajouts récents à l'encyclopédie, ou la parcourt par première lettre.

Argument

Type

Requis

Ce qu'il fait

kind

anime, manga, person ou company, défaut anime

non

Ce qu'il faut lister.

starts_with

un seul caractère

non

Parcourt les fiches commençant par lui.

limit

entier, 1 à 50, défaut 20

non

Lignes à servir.

offset

entier, 0 ou plus, défaut 0

non

Lignes à sauter, pour paginer.

En retour : rows, chacune portant id, kind, name, type, precision, vintage, date_added et source_url, que le rapport peut laisser vides. mode dit si la réponse a été lue en recent ou en browse, passer starts_with changeant la question posée, et next_offset poursuit.

get_news

Lit le fil d'actualité.

Argument

Type

Requis

Ce qu'il fait

feed

all, news ou reviews, défaut all

non

Le fil à lire.

edition

us, uk ou au, défaut us

non

L'édition.

category

chaîne

non

Ne garder que les sujets portant cette étiquette.

limit

entier, 1 à 100, défaut 20

non

Sujets à servir.

En retour : items, chacun avec son title, link, summary, ses categories portant chaque étiquette que le fil pose sur le sujet, et published_at en horodatage ISO quand la date du fil a pu être lue. total_available compte les sujets que le fil contenait, ce qui est une longueur de fil fixe et non la taille des archives.

Configuration

Chaque variable est facultative. Elles se posent dans le bloc env de la configuration du client.

Variable

Défaut

Ce qu'elle fait

ANN_USER_AGENT

l'identité du projet

Nomme votre application auprès du service, avec une adresse où joindre une personne.

ANN_MIN_INTERVAL_MS

1100

Écart entre deux requêtes, de 1000 à 60000.

ANN_TIMEOUT_MS

15000

Délai d'une requête, de 1000 à 120000.

ANN_MAX_RETRIES

3

Tentatives après un échec passager, de 0 à 10.

ANN_CACHE_TTL_MS

3600000

Durée pendant laquelle une fiche reste en mémoire, de 0 à 86400000.

ANN_NEWS_CACHE_TTL_MS

300000

Durée pendant laquelle un fil reste en mémoire, de 0 à 86400000.

ANN_CACHE_MAX_ENTRIES

200

Réponses gardées en mémoire à la fois, de 0 à 10000.

ANN_LOG_LEVEL

error

silent, error, info ou debug, écrit sur la sortie d'erreur.

Le fil d'actualité publie plusieurs fois par heure là où l'encyclopédie change rarement, donc les deux sont gardés des durées différentes. Une valeur hors de sa plage retombe sur le défaut, et la raison est écrite sur la sortie d'erreur.

Erreurs

Chaque échec porte un des six codes, un message, et quand cela aide une indication du geste suivant.

Code

Ce qui s'est passé

Que faire

not_found

Le service a répondu, et n'a pas cette fiche.

Vérifiez l'identifiant et le type avec search_titles.

invalid_input

Les arguments ont été refusés avant toute requête.

Lisez le message, qui nomme l'argument.

rate_limited

Le service demande à ce client de ralentir.

Attendez les secondes indiquées et rappelez avec les mêmes arguments. La fiche est toujours là.

parse_failure

La réponse est arrivée dans une forme illisible ici.

Signalez-le sur le suivi d'incidents.

network_error

La requête n'a pas abouti.

Réessayez sous peu.

timeout

La requête a dépassé son délai.

Augmentez ANN_TIMEOUT_MS, ou demandez moins de lignes.

Comme bibliothèque

La couche qui lit le service est publiée seule, avec son rythme, son cache et ses erreurs, sans protocole attaché.

import { AnnClient } from "mcp-animenewsnetwork/client";

const client = new AnnClient();
const { data, cached } = await client.getTitle("anime", 1);
console.log(data.name, cached);

Chaque lecture répond { data, cached }, et lève une erreur portant un des six codes. Le plancher entre deux requêtes tient également ici.

Rythme et attribution

Les requêtes partent une à une avec au moins 1,1 seconde entre elles, et le plancher d'une seconde tient quelle que soit la configuration. Le User-Agent se termine toujours par l'identité du projet et une adresse où joindre une personne.

Chaque résultat porte l'adresse de la page encyclopédique ou de l'article. L'encyclopédie et l'actualité sont l'œuvre d'Anime News Network et de ses contributeurs, et l'attribution est ce que le service demande en retour.

Ce MCP est un projet non officiel, sans affiliation à Anime News Network.

Confidentialité

Ce serveur ne collecte rien sur vous et n'envoie rien à son auteur. Il tourne sur votre machine, ne joint que cdn.animenewsnetwork.com et www.animenewsnetwork.com, garde ses réponses en mémoire le temps qu'il tourne, et n'écrit rien sur le disque. PRIVACY.md dit ce qu'une requête emporte et quels réglages changent cela.

Développement

npm install
npm run build:fixtures
npm test
npm run check

Les tests s'exécutent sur des fixtures engendrées et n'émettent aucune requête. La suite en direct, npm run test:live, émet une requête par route et tourne chaque nuit contre le service lui-même.

Contribuer

Les anomalies, les questions et les idées ont leur place dans le suivi d'incidents. Les propositions de modification sont bienvenues ; ouvrir un ticket d'abord aide à s'accorder sur la forme du changement. Voir CONTRIBUTING.md.

Licence

MIT, voir LICENSE. L'encyclopédie et l'actualité appartiennent à Anime News Network et à ses contributeurs.

Available Tools

4 tools
get_newsRead the news wireA
Read-onlyIdempotent

Read the latest Anime News Network stories from their RSS feeds. 'all' mixes news, reviews and features; 'news' and 'reviews' are the narrower feeds. Filter with 'category' to keep only stories the feed tags a given way, such as Manga or Anime. The feed is the whole window available: there is no way to reach older stories through this tool. When you repeat a story, cite Anime News Network and link the article.

NameRequiredDescriptionDefault
feedNoWhich feed to read. 'all' is the busiest.all
limitNoHow many stories to return.
editionNoRegional edition. They differ mostly in release and licensing coverage.us
categoryNoKeep only items tagged this way, matched case-insensitively.

Output Schema

NameRequiredDescription
feedYes
itemsYes
notesYes
editionYes
total_availableYesItems in the feed after 'category' was applied, before 'limit'.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds genuinely new behavioral facts: the feed is a bounded window with no older-story access, feed composition, and a citation obligation for reuse — none of which appear in the structured fields.

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 purpose, then feed semantics, then the hard window limit. Every sentence carries information; the closing citation instruction is a usage policy rather than tool semantics but is short enough not to be bloat.

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 and rich annotations, the description only needs to cover scope and limits, which it does. The one missing piece is routing to a sibling for older or search-based retrieval, which it gestures at only implicitly.

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%, so the schema already documents all four parameters including enums. The description adds some semantic color for 'feed' (what 'all' mixes) and a case example for 'category', but says nothing about 'limit' or 'edition' beyond the schema — 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 ('Read the latest Anime News Network stories from their RSS feeds') and immediately unpacks what each feed contains. An agent can distinguish this from search_titles/get_title/list_recent based on the live-RSS scope described.

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 selection guidance between feed values and explains when to use 'category'. It also implicitly excludes the tool for historical lookups ('no way to reach older stories through this tool'), though it does not name which sibling to use instead.

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

get_titleRead an encyclopedia entryA
Read-onlyIdempotent

Read one Anime News Network encyclopedia entry by id. Get the id and kind from search_titles first. Sections are opt-in because a full record is very large: ask only for what you need. The entry's name, kind, id and link come back whatever you ask for, so any answer can be cited. 'basic' covers type, vintage, genres, themes, episode count, ratings and the plot summary. Long plot summaries are paginated: when 'truncated' is true, call again with 'offset' set to 'next_offset'.

NameRequiredDescriptionDefault
idYesEncyclopedia id, from search_titles.
kindYesWhich lookup the id belongs to, from search_titles.
offsetNoWhere to resume the plot summary.
sectionsNoWhich parts to return. 'basic' is usually enough. Adding 'cast' or 'news' can multiply the size of the answer.
max_charsNoCharacter budget for the plot summary.

Output Schema

NameRequiredDescription
castNo
newsNo
notesYes
staffNo
titleYes
genresNo
offsetNo
themesNo
ratingsNo
relatedNo
reviewsNo
episodesNo
releasesNo
companiesNo
truncatedNo
alt_titlesNo
next_offsetNoPass as 'offset' to read the rest.
picture_urlNo
total_charsNoLength of the full plot summary.
plot_summaryNo
running_timeNo
ending_themesNo
episode_countNo
cast_languagesNoEvery language the site records a cast in, with its full credit count, so a trimmed 'cast' still shows what exists. Ask again with a narrower question if a language you need was cut.
opening_themesNo
returned_charsNo
official_websitesNo
objectionable_contentNo

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the read-only/idempotent annotations, it discloses the payload-size tradeoff of opt-in sections, the invariant fields that always come back (so any answer is citable), and the truncation/offset continuation loop. These are exactly the behaviors an agent cannot infer from 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?

Six short sentences, front-loaded with the identity of the operation before prerequisites, section policy, and pagination. No sentence is redundant with the schema or restates 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?

With an output schema present the description need not enumerate return values, and it covers everything else that matters for correct invocation: id provenance, required kind, section selection, and the pagination continuation rule.

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 already 100%, so baseline is 3; the description earns above that by explaining what 'basic' actually contains and by tying 'offset' to the 'next_offset' field returned when 'truncated' is true. It does not add format details for max_chars or the remaining section names, leaving some gaps.

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 ('Read one Anime News Network encyclopedia entry by id'), and immediately distinguishes itself from the sibling search_titles, which only supplies ids. An agent can tell without opening the schema that this is a detail-fetch, not a search.

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 prerequisite ('Get the id and kind from search_titles first') and an explicit selection policy for the optional parts ('ask only for what you need', 'ask only for what you need'). It also names the alternative path for paginating the plot summary rather than leaving the agent to guess.

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

list_recentList recent or browse alphabeticallyA
Read-onlyIdempotent

List what was added to the Anime News Network encyclopedia most recently: anime, manga, people or companies. Pass 'starts_with' to browse titles alphabetically instead, which only applies to anime and manga. Rows carry an id you can pass to get_title when the kind is anime or manga. This walks the catalogue in order: use search_titles when you know the title you are after.

NameRequiredDescriptionDefault
kindNoWhich catalogue to list.anime
limitNoHow many rows to return.
offsetNoHow many rows to skip, for paging.
starts_withNoSingle letter. Switches to an alphabetical browse of titles. Anime and manga only.

Output Schema

NameRequiredDescription
kindYes
modeYes'recent' is by date added, 'browse' is alphabetical.
rowsYes
notesYes
offsetYes
next_offsetYesPass as 'offset' for the next page. Null when the last page came back short.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely non-structured behavior: that 'starts_with' only works for anime and manga, and that returned ids can be chained into get_title. It does not mention rate limits, result caps, or how 'recent' is ordered beyond 'walks the catalogue in order'.

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?

Four tight sentences with the core action front-loaded and the alternative modes following. Slight density in the id/get_title sentence and the trailing search_titles clause, but nothing is wasted.

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 shape needn't be described, and no parameters are required, keeping the surface simple. The description covers modes, applicability of the browse option, and the handoff to a sibling; only the meaning of 'recent' (ordering or time window) is left implicit.

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%, so all four parameters are already documented, including the starts_with constraint and the limit/offset paging semantics. The description restates the starts_with behavior rather than adding syntax or edge-case detail, 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 ('list what was added to the Anime News Network encyclopedia most recently') and enumerates the four catalogues it covers. It also explicitly separates itself from the alphabetical-browse mode and from the search sibling, so an agent can identify 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?

Gives explicit routing: use this to walk the catalogue in order, pass 'starts_with' to browse alphabetically, and use search_titles when you already know the title. Both the when-to-use and the when-not-to-use alternative are named.

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

search_titlesSearch the encyclopediaA
Read-onlyIdempotent

Search the Anime News Network encyclopedia for anime and manga by title. Returns one compact row per match: id, kind, type, name, precision and vintage. Use the id and kind with get_title to read the full entry. Matching is on substring, so a short query returns a lot: narrow the query rather than raising 'limit'. This searches titles only. It cannot find an entry from a plot detail, a character or a studio.

NameRequiredDescriptionDefault
kindNoRestrict results to one kind. The encyclopedia returns both by default.both
limitNoHow many rows to return.
queryYesTitle or part of one, for example 'cowboy bebop'.

Output Schema

NameRequiredDescription
notesYes
queryYes
resultsYes
total_availableYesRows this server could read, before 'limit' was applied. Higher than results.length means narrow the query.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that matching is substring-based, that short queries return many results, and what columns are returned per match. This gives the agent useful behavioral context for forming queries and interpreting results.

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 purpose and return shape, then adds usage guidance and limitations. Every sentence contributes practical information for selecting and invoking the tool.

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 search behavior, output schema, and sibling tools, the description is complete enough to call correctly. It explains what the rows contain, how to continue with get_title, and the important scope limitation that this is title-only search.

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 already 100%, so the baseline is 3. The description adds meaningful query semantics: matching is substring-based, short queries are broad, and the recommended strategy is to narrow the query rather than increase limit.

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: search the Anime News Network encyclopedia for anime and manga titles. It distinguishes itself from get_title by explaining that search returns compact rows and that get_title should be used for full entries, and it clarifies that it searches titles only.

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 explains when to use this tool, how to follow up with get_title using id and kind, and how to handle broad results by narrowing the query rather than raising limit. It also states what the tool cannot do, including finding entries from plot details, characters, or studios.

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. 4 tool updatesv3.0.0
    • Changedget_news8 fields changed
      • addedInput schema / properties / category / minLength
        Added value: +1
      • addedOutput schema / properties / items / items / properties / categories
        Added value: +{
        +  "description": "Every tag the feed carries on the story. Empty when it carries none.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / items / items / properties / category
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • removedOutput schema / properties / items / items / properties / published_at / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / items / items / properties / published_at / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / items / items / properties / summary / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / items / items / properties / summary / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / items / items / required
        Previous value: -[
        -  "title",
        -  "link",
        -  "summary",
        -  "published_at",
        -  "category"
        -]New value: +[
        +  "title",
        +  "link",
        +  "summary",
        +  "published_at",
        +  "categories"
        +]
    • Changedget_title34 fields changed
      • removedOutput schema / properties / cast / items / properties / lang / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / cast / items / properties / lang / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / cast_languages / items / properties / lang / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / cast_languages / items / properties / lang / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / episode_count / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / episode_count / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / episodes / items / properties / lang / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / episodes / items / properties / lang / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / episodes / items / properties / title / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / episodes / items / properties / title / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / news / items / properties / date / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / news / items / properties / date / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / objectionable_content / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / objectionable_content / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / picture_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / picture_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / plot_summary / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / plot_summary / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / ratings / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "bayesian_score": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "votes": {
        -        "anyOf": [
        -          {
        -            "maximum": 9007199254740991,
        -            "minimum": -9007199254740991,
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "weighted_score": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      }
        -    },
        -    "required": [
        -      "votes",
        -      "weighted_score",
        -      "bayesian_score"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bayesian_score": {
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "votes": {
        +        "anyOf": [
        +          {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "weighted_score": {
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "votes",
        +      "weighted_score",
        +      "bayesian_score"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / releases / items / properties / date / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / releases / items / properties / date / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / releases / items / properties / href / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / releases / items / properties / href / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / reviews / items / properties / date / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / reviews / items / properties / date / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / running_time / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / running_time / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / title / properties / precision / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / title / properties / precision / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / title / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / title / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / title / properties / vintage / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / title / properties / vintage / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / required
        Previous value: -[
        -  "title",
        -  "alt_titles",
        -  "genres",
        -  "themes",
        -  "episode_count",
        -  "running_time",
        -  "objectionable_content",
        -  "official_websites",
        -  "picture_url",
        -  "opening_themes",
        -  "ending_themes",
        -  "ratings",
        -  "plot_summary",
        -  "total_chars",
        -  "returned_chars",
        -  "offset",
        -  "next_offset",
        -  "truncated",
        -  "notes"
        -]New value: +[
        +  "title",
        +  "notes"
        +]
    • Changedlist_recent11 fields changed
      • addedInput schema / properties / starts_with / minLength
        Added value: +1
      • removedOutput schema / properties / rows / items / properties / date_added / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / rows / items / properties / date_added / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / rows / items / properties / precision / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / rows / items / properties / precision / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / rows / items / properties / source_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / rows / items / properties / source_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / rows / items / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / rows / items / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / rows / items / properties / vintage / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / rows / items / properties / vintage / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedsearch_titles7 fields changed
      • removedOutput schema / properties / results / items / properties / precision / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / precision / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / vintage / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / vintage / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / total_available / description
        Previous value: -"Matches before 'limit' was applied. Higher than results.length means narrow the query."New value: +"Rows this server could read, before 'limit' was applied. Higher than results.length means narrow the query."
  2. 4 tool updatesv2.0.0
    • Changedget_news8 fields changed
      • addedOutput schema / properties / items / items / properties / category / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / items / items / properties / category / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / items / items / properties / published_at / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / items / items / properties / published_at / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / items / items / properties / summary / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / items / items / properties / summary / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / total_available / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / total_available / minimum
        Added value: +-9007199254740991
    • Changedget_title54 fields changed
      • addedInput schema / properties / id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / cast / items / properties / lang / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / cast / items / properties / lang / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • changedOutput schema / properties / cast / items / properties / person_id / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / cast_languages / items / properties / credits / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / cast_languages / items / properties / credits / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / cast_languages / items / properties / lang / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / cast_languages / items / properties / lang / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • changedOutput schema / properties / companies / items / properties / company_id / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / episode_count / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / episode_count / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / episodes / items / properties / lang / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / episodes / items / properties / lang / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / episodes / items / properties / title / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / episodes / items / properties / title / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / news / items / properties / date / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / news / items / properties / date / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • changedOutput schema / properties / next_offset / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / objectionable_content / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / objectionable_content / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / offset / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / offset / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / picture_url / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / picture_url / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / plot_summary / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / plot_summary / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • changedOutput schema / properties / ratings / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "bayesian_score": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "votes": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "weighted_score": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "votes",
        -      "weighted_score",
        -      "bayesian_score"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bayesian_score": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "votes": {
        +        "anyOf": [
        +          {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "weighted_score": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "required": [
        +      "votes",
        +      "weighted_score",
        +      "bayesian_score"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / related / items / properties / id / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / related / items / properties / id / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / releases / items / properties / date / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / releases / items / properties / date / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / releases / items / properties / href / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / releases / items / properties / href / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / returned_chars / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / returned_chars / minimum
        Added value: +-9007199254740991
      • removedOutput schema / properties / reviews / items / $ref
        Removed value: -"#/properties/news/items"
      • addedOutput schema / properties / reviews / items / additionalProperties
        Added value: +false
      • addedOutput schema / properties / reviews / items / properties
        Added value: +{
        +  "date": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ]
        +  },
        +  "href": {
        +    "type": "string"
        +  },
        +  "title": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / reviews / items / required
        Added value: +[
        +  "title",
        +  "href",
        +  "date"
        +]
      • addedOutput schema / properties / reviews / items / type
        Added value: +"object"
      • addedOutput schema / properties / running_time / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / running_time / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • changedOutput schema / properties / staff / items / properties / person_id / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / title / properties / id / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / title / properties / id / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / title / properties / precision / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / title / properties / precision / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / title / properties / type / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / title / properties / type / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / title / properties / vintage / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / title / properties / vintage / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / total_chars / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / total_chars / minimum
        Added value: +-9007199254740991
    • Changedlist_recent15 fields changed
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / next_offset / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / offset / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / offset / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / rows / items / properties / date_added / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / rows / items / properties / date_added / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • changedOutput schema / properties / rows / items / properties / id / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / rows / items / properties / precision / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / rows / items / properties / precision / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / rows / items / properties / source_url / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / rows / items / properties / source_url / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / rows / items / properties / type / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / rows / items / properties / type / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / rows / items / properties / vintage / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / rows / items / properties / vintage / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
    • Changedsearch_titles10 fields changed
      • addedOutput schema / properties / results / items / properties / id / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / results / items / properties / id / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / results / items / properties / precision / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / results / items / properties / precision / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / results / items / properties / type / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / results / items / properties / type / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / results / items / properties / vintage / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / results / items / properties / vintage / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / total_available / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / total_available / minimum
        Added value: +-9007199254740991
  3. 1 tool updatev1.2.3
    • Changedget_title2 fields changed
      • changedOutput schema / properties / cast / items / properties / lang / description
        Previous value: -"Dub language. Null marks the original cast."New value: +"Language of this credit, such as 'JA' for the Japanese cast of a Japanese production or 'FR' for the French dub. Null when the site records none, which is not a claim that the credit is the original one."
      • addedOutput schema / properties / cast_languages
        Added value: +{
        +  "description": "Every language the site records a cast in, with its full credit count, so a trimmed 'cast' still shows what exists. Ask again with a narrower question if a language you need was cut.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "credits": {
        +        "type": "integer"
        +      },
        +      "lang": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "lang",
        +      "credits"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  4. 4 tool updatesv1.0.0
    • First observedget_news
    • First observedget_title
    • First observedlist_recent
    • First observedsearch_titles

TDQS

A4.4/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: title lookup (search_titles), entry retrieval (get_title), catalogue browsing (list_recent), and news reading (get_news). Descriptions explicitly draw the boundaries, e.g. telling the agent to prefer search_titles over list_recent when a title is known, and search_titles over get_title for discovery.

Naming Consistency4/5

All names are snake_case verb_* forms (search_titles, get_title, list_recent, get_news), giving a predictable pattern. The only minor deviation is list_recent, whose object is an adjective rather than a resource noun, but the verb convention stays intact.

Tool Count5/5

Four tools is well-scoped for a read-only encyclopedia-plus-news server: discovery, retrieval, browsing, and feeds each earn their place with no padding. Nothing feels thin given the narrow read-only purpose.

Completeness3/5

Core anime/manga lookup and news reading are covered, but the surface has notable gaps: search only covers titles (no character, staff, or studio lookup), and list_recent returns ids for people and companies that get_title apparently cannot resolve, creating a dead end. News is also capped at the current feed window with no way to reach older stories.

Maintenance

ActivityActive
ResponsivenessResponsive

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.
    194 npm
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for MyAnimeList that enables searching anime/manga, getting details, rankings, seasons, characters, reviews, and user profiles without authentication, and managing personal anime/manga lists with authentication (token required).
    54
    194 npm
    3
    MIT