mcp-animenewsnetwork
This MCP server provides read-only access to the Anime News Network encyclopedia and news wire. It allows you to:
Search titles (
search_titles): Find anime and manga by name, with optional filtering by kind (anime/manga/both) and result limit. Returns compact rows including ID, kind, and title.Get detailed entries (
get_title): Fetch full information for a title using its ID and kind. Opt-in sections include:basic(type, vintage, genres, ratings, plot summary),cast(voice actors),staff(crew),episodes,releases,relatedentries,news, andreviews. Long plot summaries are paginated viaoffset.Browse or list recent additions (
list_recent): View the newest anime, manga, people, or companies, or browse alphabetically by first letter.Read news feeds (
get_news): Access ANN's latest articles. Choose feed type (all,news,reviews), regional edition (us,uk,au), category filter, and result limit.
Constraints:
Read-only; no writes to ANN.
No API key, account, or configuration required.
Searches match titles only, not characters, studios, or plot keywords.
News feed is limited to the current window; older stories cannot be retrieved.
Responses are cached and rate-limited to be efficient; every result includes a source URL for attribution.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-animenewsnetworkFind the anime 'Steins;Gate' and give me its cast."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-animenewsnetwork
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.
Install
One-click install
Claude Code
claude mcp add animenewsnetwork -- npx -y mcp-animenewsnetworkClaude 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 |
| Finds anime and manga by title in the encyclopedia. |
| Reads one entry, its credits and its details. |
| Lists what was recently added, or browses the encyclopedia by letter. |
| 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 |
| string, at least 1 character | yes | A title, or part of one. |
|
| no | Which part of the encyclopedia. |
| integer, 1 to 50, default | 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 |
| integer, 1 or more | yes | The encyclopedia id. |
|
| yes | Which lookup the id belongs to. |
| array of | no | Which parts to return. |
| integer, 200 to 20000, default | no | How much of the plot summary to serve. |
| integer, 0 or more, default | 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 |
|
| no | What to list. |
| a single character | no | Browse the entries beginning with it. |
| integer, 1 to 50, default | no | Rows to serve. |
| integer, 0 or more, default | 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 |
|
| no | Which feed to read. |
|
| no | Which edition. |
| string | no | Keep the stories carrying this tag. |
| integer, 1 to 100, default | 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 |
| the project identity | Names your application to the service, with an address where a person can be reached. |
|
| Gap between two requests, from 1000 to 60000. |
|
| Deadline for one request, from 1000 to 120000. |
|
| Attempts after a transient failure, from 0 to 10. |
|
| How long an encyclopedia entry stays in memory, from 0 to 86400000. |
|
| How long a news feed stays in memory, from 0 to 86400000. |
|
| Answers held in memory at once, from 0 to 10000. |
|
|
|
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 |
| The service answered, and holds no such entry. | Check the id and the kind with |
| The arguments were refused before any request went out. | Read the message, which names the argument. |
| 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. |
| The answer arrived in a shape this client cannot read. | Report it at the issue tracker. |
| The request did not complete. | Try again shortly. |
| The request passed its deadline. | Raise |
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 checkTests 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)
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
Claude Code
claude mcp add animenewsnetwork -- npx -y mcp-animenewsnetworkClaude 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 |
| Trouve des animes et des mangas par leur titre dans l'encyclopédie. |
| Lit une fiche, ses crédits et ses détails. |
| Liste les ajouts récents, ou parcourt l'encyclopédie par lettre. |
| 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 |
| chaîne, au moins 1 caractère | oui | Un titre, ou une partie. |
|
| non | La partie de l'encyclopédie. |
| entier, 1 à 50, défaut | 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 |
| entier, 1 ou plus | oui | L'identifiant encyclopédique. |
|
| oui | Le registre dont l'id relève. |
| tableau de | non | Les parties à rendre. |
| entier, 200 à 20000, défaut | non | La longueur de résumé à servir. |
| entier, 0 ou plus, défaut | 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 |
|
| non | Ce qu'il faut lister. |
| un seul caractère | non | Parcourt les fiches commençant par lui. |
| entier, 1 à 50, défaut | non | Lignes à servir. |
| entier, 0 ou plus, défaut | 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 |
|
| non | Le fil à lire. |
|
| non | L'édition. |
| chaîne | non | Ne garder que les sujets portant cette étiquette. |
| entier, 1 à 100, défaut | 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 |
| l'identité du projet | Nomme votre application auprès du service, avec une adresse où joindre une personne. |
|
| Écart entre deux requêtes, de 1000 à 60000. |
|
| Délai d'une requête, de 1000 à 120000. |
|
| Tentatives après un échec passager, de 0 à 10. |
|
| Durée pendant laquelle une fiche reste en mémoire, de 0 à 86400000. |
|
| Durée pendant laquelle un fil reste en mémoire, de 0 à 86400000. |
|
| Réponses gardées en mémoire à la fois, de 0 à 10000. |
|
|
|
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 |
| Le service a répondu, et n'a pas cette fiche. | Vérifiez l'identifiant et le type avec |
| Les arguments ont été refusés avant toute requête. | Lisez le message, qui nomme l'argument. |
| Le service demande à ce client de ralentir. | Attendez les secondes indiquées et rappelez avec les mêmes arguments. La fiche est toujours là. |
| La réponse est arrivée dans une forme illisible ici. | Signalez-le sur le suivi d'incidents. |
| La requête n'a pas abouti. | Réessayez sous peu. |
| La requête a dépassé son délai. | Augmentez |
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 checkLes 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 toolsget_newsRead the news wireARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| feed | No | Which feed to read. 'all' is the busiest. | all |
| limit | No | How many stories to return. | |
| edition | No | Regional edition. They differ mostly in release and licensing coverage. | us |
| category | No | Keep only items tagged this way, matched case-insensitively. |
Output Schema
| Name | Required | Description |
|---|---|---|
| feed | Yes | |
| items | Yes | |
| notes | Yes | |
| edition | Yes | |
| total_available | Yes | Items in the feed after 'category' was applied, before 'limit'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the operation is read-only, idempotent, non-destructive, and open-world. The description adds useful behavior beyond that: the feed is the entire available window, category matching is case-insensitive, and stories repeated by the agent must cite and link Anime News Network.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each earning its place: purpose, feed semantics, retrieval-window limitation, and citation obligation. The most important operational constraints are front-loaded before the optional citation note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, annotations, and 100% schema parameter coverage, the description fills the remaining gaps: feed-scope meaning, unavailability of older stories, category filtering semantics, and attribution behavior. Nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already cover all four parameters, so the baseline is 3. The description adds value by explaining what 'all' means relative to 'news' and 'reviews', and by giving concrete category examples plus case-insensitive matching, which goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads the latest Anime News Network stories from RSS feeds and explains the feed variants. It does not explicitly name sibling tools or say how it differs from search_titles, get_title, or list_recent, so it is clear but lacks explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it covers only the current RSS window and states there is no way to reach older stories, which implies historical retrieval is not this tool's job. However, it never names an alternative tool for older or search-based lookups, so it stops short of explicit when-to-use versus alternatives.
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 entryARead-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. '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'.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Encyclopedia id, from search_titles. | |
| kind | Yes | Which lookup the id belongs to, from search_titles. | |
| offset | No | Where to resume the plot summary. | |
| sections | No | Which parts to return. 'basic' is usually enough. Adding 'cast' or 'news' can multiply the size of the answer. | |
| max_chars | No | Character budget for the plot summary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cast | No | |
| news | No | |
| notes | Yes | |
| staff | No | |
| title | Yes | |
| genres | Yes | |
| offset | Yes | |
| themes | Yes | |
| ratings | Yes | |
| related | No | |
| reviews | No | |
| episodes | No | |
| releases | No | |
| companies | No | |
| truncated | Yes | |
| alt_titles | Yes | |
| next_offset | Yes | Pass as 'offset' to read the rest. |
| picture_url | Yes | |
| total_chars | Yes | Length of the full plot summary. |
| plot_summary | Yes | |
| running_time | Yes | |
| ending_themes | Yes | |
| episode_count | Yes | |
| cast_languages | No | 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. |
| opening_themes | Yes | |
| returned_chars | Yes | |
| official_websites | Yes | |
| objectionable_content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive behavior; the description adds useful beyond-annotation detail about record size, section opt-in, what 'basic' includes, and the truncated/next_offset pagination protocol. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no filler, with the core action first followed by workflow, then size guidance, then pagination. Each sentence carries necessary operational detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-by-id tool with an output schema and rich annotations, the description covers prerequisite lookup, section selection, size behavior, and pagination. Nothing needed for correct invocation is missing, and the output schema covers return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning by defining what the 'basic' section returns and explaining the pagination loop using a response flag ('truncated', 'next_offset'), which goes beyond the schema's per-parameter descriptions without restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource ('Read one Anime News Network encyclopedia entry by id'), and clarifies the lookup workflow by pointing to search_titles for obtaining id and kind. This makes it easy to distinguish from the search/list siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: fetch id/kind from search_titles first, request only needed sections because a full record is large, and resume paginated summaries via offset. It does not explicitly contrast with list_recent or get_news, so it misses the explicit when-not-to-use guidance needed for a 5.
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 alphabeticallyARead-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 is a listing, not a search: use search_titles when you know what you are looking for.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Which catalogue to list. | anime |
| limit | No | How many rows to return. | |
| offset | No | How many rows to skip, for paging. | |
| starts_with | No | Single letter. Switches to an alphabetical browse of titles. Anime and manga only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| mode | Yes | 'recent' is by date added, 'browse' is alphabetical. |
| rows | Yes | |
| notes | Yes | |
| offset | Yes | |
| next_offset | Yes | Pass as 'offset' for the next page. Null when the last page came back short. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, and the description adds complementary context: starts_with switches to alphabetical browsing restricted to anime/manga, and returned rows expose an id consumable by get_title. No hidden side effects or usage restrictions are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences front-load the core purpose, then add the browse mode, id usage, and a clear search alternative. No filler or duplicated schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return details don't need to be repeated. The description covers what the tool lists, how to switch modes, the kind restrictions, and how rows connect to a sibling tool, which is everything an agent needs to select and call it appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The Schema Description Coverage is 100%, so the schema fully documents kind, limit, offset, and starts_with, including defaults and constraints. The description mostly restates starts_with's behavior rather than adding new parameter-specific meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states the exact operation: listing what was recently added to the ANN encyclopedia, with the four supported kinds enumerated. It distinguishes itself from a search and explicitly contrasts with search_titles, making the tool's job unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit direction on when to use the tool ('listing, not a search') and names the alternative (search_titles) for when a specific entry is sought. It also explains the alternative browse mode via starts_with and refers the returned id to get_title.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_titlesSearch the encyclopediaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Restrict results to one kind. The encyclopedia returns both by default. | both |
| limit | No | How many rows to return. | |
| query | Yes | Title or part of one, for example 'cowboy bebop'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | |
| query | Yes | |
| results | Yes | |
| total_available | Yes | Matches before 'limit' was applied. Higher than results.length means narrow the query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, openWorld, idempotent, non-destructive), the description discloses important behavior: substring matching, compact row output with specific fields, and the fact that short queries return many results. This goes well beyond the structured metadata and gives the agent accurate expectations for calling the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by output details, usage guidance, and limitations. Every sentence contributes meaningful information without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with full schema coverage, a rich output schema, and annotations covering safety and idempotence, the description is complete. It covers what the tool searches, what it returns, how to follow up with get_title, and what it cannot do, leaving no critical gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all parameters at 100%, providing descriptions for query, kind, and limit. The description adds extra semantic value by explaining substring matching and advising to narrow the query rather than increase the limit, which helps the agent use query and limit more effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 by title.' It also explicitly distinguishes this tool from get_title by saying to use the returned id and kind with get_title for the full entry, and clarifies that it cannot find entries by plot, character, or studio.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: title-based lookups only, with a follow-up call to get_title using the returned id and kind. It also provides practical advice to narrow the query rather than raising 'limit' and explicitly states the tool's limitations relative to plot, character, and studio searches.
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.
4 tool updates
v2.0.0- Changed
get_news8 fields changed- added
Output schema / properties / items / items / properties / category / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / category / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / items / items / properties / published_at / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / published_at / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / items / items / properties / summary / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / items / items / properties / summary / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / total_available / maximumAdded value: +9007199254740991 - added
Output schema / properties / total_available / minimumAdded value: +-9007199254740991
- Changed
get_title54 fields changed- added
Input schema / properties / id / maximumAdded value: +9007199254740991 - added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - added
Output schema / properties / cast / items / properties / lang / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / cast / items / properties / lang / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / cast / items / properties / person_id / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - added
Output schema / properties / cast_languages / items / properties / credits / maximumAdded value: +9007199254740991 - added
Output schema / properties / cast_languages / items / properties / credits / minimumAdded value: +-9007199254740991 - added
Output schema / properties / cast_languages / items / properties / lang / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / cast_languages / items / properties / lang / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / companies / items / properties / company_id / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - added
Output schema / properties / episode_count / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / episode_count / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / episodes / items / properties / lang / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / episodes / items / properties / lang / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / episodes / items / properties / title / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / episodes / items / properties / title / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / news / items / properties / date / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / news / items / properties / date / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / next_offset / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - added
Output schema / properties / objectionable_content / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / objectionable_content / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / offset / maximumAdded value: +9007199254740991 - added
Output schema / properties / offset / minimumAdded value: +-9007199254740991 - added
Output schema / properties / picture_url / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / picture_url / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / plot_summary / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / plot_summary / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / ratings / anyOfPrevious 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" + } +] - added
Output schema / properties / related / items / properties / id / maximumAdded value: +9007199254740991 - added
Output schema / properties / related / items / properties / id / minimumAdded value: +-9007199254740991 - added
Output schema / properties / releases / items / properties / date / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / releases / items / properties / date / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / releases / items / properties / href / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / releases / items / properties / href / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / returned_chars / maximumAdded value: +9007199254740991 - added
Output schema / properties / returned_chars / minimumAdded value: +-9007199254740991 - removed
Output schema / properties / reviews / items / $refRemoved value: -"#/properties/news/items" - added
Output schema / properties / reviews / items / additionalPropertiesAdded value: +false - added
Output schema / properties / reviews / items / propertiesAdded value: +{ + "date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "href": { + "type": "string" + }, + "title": { + "type": "string" + } +} - added
Output schema / properties / reviews / items / requiredAdded value: +[ + "title", + "href", + "date" +] - added
Output schema / properties / reviews / items / typeAdded value: +"object" - added
Output schema / properties / running_time / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / running_time / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / staff / items / properties / person_id / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - added
Output schema / properties / title / properties / id / maximumAdded value: +9007199254740991 - added
Output schema / properties / title / properties / id / minimumAdded value: +-9007199254740991 - added
Output schema / properties / title / properties / precision / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / title / properties / precision / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / title / properties / type / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / title / properties / type / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / title / properties / vintage / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / title / properties / vintage / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / total_chars / maximumAdded value: +9007199254740991 - added
Output schema / properties / total_chars / minimumAdded value: +-9007199254740991
- Changed
list_recent15 fields changed- added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - changed
Output schema / properties / next_offset / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - added
Output schema / properties / offset / maximumAdded value: +9007199254740991 - added
Output schema / properties / offset / minimumAdded value: +-9007199254740991 - added
Output schema / properties / rows / items / properties / date_added / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / rows / items / properties / date_added / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / rows / items / properties / id / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - added
Output schema / properties / rows / items / properties / precision / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / rows / items / properties / precision / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / rows / items / properties / source_url / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / rows / items / properties / source_url / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / rows / items / properties / type / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / rows / items / properties / type / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / rows / items / properties / vintage / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / rows / items / properties / vintage / typeRemoved value: -[ - "string", - "null" -]
- Changed
search_titles10 fields changed- added
Output schema / properties / results / items / properties / id / maximumAdded value: +9007199254740991 - added
Output schema / properties / results / items / properties / id / minimumAdded value: +-9007199254740991 - added
Output schema / properties / results / items / properties / precision / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / results / items / properties / precision / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / results / items / properties / type / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / results / items / properties / type / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / results / items / properties / vintage / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / results / items / properties / vintage / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / total_available / maximumAdded value: +9007199254740991 - added
Output schema / properties / total_available / minimumAdded value: +-9007199254740991
1 tool update
v1.2.3- Changed
get_title2 fields changed- changed
Output schema / properties / cast / items / properties / lang / descriptionPrevious 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." - added
Output schema / properties / cast_languagesAdded 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 tool updates
v1.0.0- First observed
get_news - First observed
get_title - First observed
list_recent - First observed
search_titles
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: searching titles, reading an encyclopedia entry by id, listing recent additions, and fetching news. The descriptions explicitly call out where one tool should be preferred over another.
Tool names mostly follow a consistent verb_noun pattern: search_titles, get_title, get_news. list_recent is slightly inconsistent because 'recent' is not a clear resource noun, but the overall style is still predictable and readable.
Four tools is well-scoped for this server: search, read, browse/list, and news each cover a distinct part of the Anime News Network domain without redundancy.
The core workflows are covered: find an anime/manga by title, read its full entry, browse recent additions, and get current news. Minor gaps exist, such as no direct search for people or companies and no access to older news stories, but these are workable for the stated purpose.
Maintenance
Related MCP Connectors
AniList MCP — wraps AniList GraphQL API (free, no auth)
Jikan MCP — wraps the Jikan v4 API (anime/manga data, free, no auth)
Unlock a world of television with the TV Maze MCP server. Effortlessly search for shows by name or
AnimeQuotes MCP — wraps animechan.io (free, no auth)
Related MCP Servers
- AlicenseBqualityCmaintenanceAniList MCP server for accessing AniList API data4412386MIT
- AlicenseNot gradedqualityDmaintenanceA 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.1201MIT
- AlicenseBqualityDmaintenanceMCP Server for interacting with the MyAnimeList API, allowing LLM clients to access and interact with anime, manga and more.152MIT
- AlicenseAqualityAmaintenanceMCP 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).541202MIT