MAL MCP Server
An MCP server for MyAnimeList that provides credential-free anime/manga discovery plus optional authenticated management of your personal MAL lists.
Search and browse anime, manga, characters, people, staff, studios, magazines, genres, seasons, schedules, rankings, news, reviews, recommendations, statistics, and interest stacks.
Fetch detailed entries by MAL ID, including synopses, scores, relations, credits, voice roles, videos, and external links.
Filter adult content with
sfw,sfw_strict, and content-rating filters.Use optional
MAL_CLIENT_IDso many read tools can fall back to the official MAL API if Tenrai is unavailable.After a one-time MAL login, view your profile and anime/manga lists, and add/update/delete list entries with status, score, progress, dates, tags, comments, and rewatch/reread data.
Provides tools to search for anime and manga, get details, rankings, seasonal anime, characters, recommendations, and reviews, as well as manage personal anime/manga lists (read, update, delete entries) via MyAnimeList.
Click on "Deploy 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., "@MAL MCP Server search for anime Frieren"
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.
MAL MCP Server
An MCP server for MyAnimeList. It works with any MCP-compatible client or agent (Claude Desktop/Code, Cursor, VS Code, Cline, Continue, and others), since the server speaks the standard MCP stdio protocol.
What it does
It uses a hybrid backend:
Reads → Tenrai (free, unofficial MAL API). Search, details, rankings, seasons, characters, recommendations and reviews. No credentials required.
Your personal list → official MyAnimeList API. Read, update and delete entries on your own anime/manga list. Requires a one-time login (see below).
Related MCP server: mal-mcp
What you need (and what it gets you)
Nothing is required to get started. You can skip straight to Install. Everything below is optional, and each step just adds more:
You set... | You get... |
(nothing) | Search, details, rankings, seasons, characters, reviews, and more. Works immediately, no signup. |
A MyAnimeList Client ID (2 minutes, free →) | Same as above, plus: 11 read tools (search, rankings, seasons, recommendations, details, statistics) keep working when Tenrai, the default read backend, has an outage. They retry against the official MyAnimeList API instead. Still no login step. |
The Client ID above, plus running the | Everything above, plus your own MyAnimeList list: view it, add/update entries, mark things watched, remove entries. |
Without a login, the personal-list tools reply with a clear message telling you how to get one. Everything else keeps working regardless.
Example queries
Once it's connected, just ask your agent in natural language.
No credentials needed (search, details, rankings, seasons, characters, …):
"Search for the anime Frieren and show its score, studio and synopsis."
"What are the top 10 anime of all time?"
"What's airing this season? Sort by popularity."
"Recommend anime similar to Steins;Gate."
"What are people saying in reviews of Chainsaw Man?"
"Show the main characters and Japanese voice actors of Cowboy Bebop."
"When does the next episode of One Piece air?"
"Give me the top manga in the Romance genre."
"What's on the upcoming season's schedule?"
"Pick a random highly-rated anime for me."With your MyAnimeList account (after a one-time login_mal; see
Connect your MyAnimeList account):
"Show my MAL profile and watching stats."
"What's on my anime list that I marked as watching?"
"Add Frieren to my plan-to-watch list."
"Set Cowboy Bebop to completed with a score of 9."
"Bump my episode count for One Piece to 1095."
"Remove Bleach from my manga list."Tools
Tool | Backend | Auth |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| Tenrai | none |
| MAL | token |
| MAL | token |
| MAL | token |
| MAL | login |
token = needs a MyAnimeList login (run login_mal once). Prompts:
recommend_similar, seasonal_overview, hidden_gems. recommend_similar's
title is optional: omit it and it'll ask which anime you mean. Clients that
support prompt-argument completion get live title suggestions as you type
(from the third character, or the second for non-Latin titles).
Install
As an .mcpb bundle (one-click, e.g. Claude Desktop)
Download mal-mcp.mcpb
(always the latest release) and open it with your MCP client. It prompts for an optional
MyAnimeList Client ID. Set it and run the login_mal tool to enable the personal-list
tools (see Connect your MyAnimeList account).
Leave it blank to use just the credential-free read tools.
From source
git clone https://github.com/Grinv/mal-mcp
cd mal-mcp
npm ci
npm run buildThis produces a self-contained dist/index.js. Point your client at it (see below).
Connect it to an MCP client
Add the server to your client's MCP config (Claude Desktop/Code, Cursor, VS Code,
Cline, …). The simplest option is npx, which needs no clone and no build. It runs on
your system Node, which must be 22.18 or newer (node -v); the .mcpb bundle above
uses the client's built-in Node instead:
{
"mcpServers": {
"mal": {
"command": "npx",
"args": ["-y", "mal-mcp"],
"env": {
"MAL_CLIENT_ID": "..."
}
}
}
}Or with the Claude Code CLI:
claude mcp add mal -e MAL_CLIENT_ID=... -- npx -y mal-mcpIf you built from source instead, replace "command": "npx", "args": ["-y", "mal-mcp"]
with "command": "node", "args": ["/absolute/path/to/mal-mcp/dist/index.js"].
The env block is optional. Omit it to use only the credential-free read
tools (search, details, rankings, …); the personal-list tools will return a clear
error until you log in. To enable them, set MAL_CLIENT_ID and run the
login_mal tool once (a one-time browser authorization; the token is then
stored and refreshed automatically). The server does not read a .env file, so
pass config via this env block (or your shell environment). See
docs/auth.md for the full login walkthrough and
docs/clients.md for more clients.
Connect your MyAnimeList account (for the personal-list tools)
The search/browse tools work with no setup. To use the personal-list tools
(get_my_*, update_my_*, delete_my_*), authorize your account once. It takes
about two minutes. There is no client secret: mal-mcp uses the modern
public-client flow (PKCE), so you only need a Client ID.
Step 1: Register a MyAnimeList app (one minute).
Go to https://myanimelist.net/apiconfig and click Create ID.
App Type: choose
other. (Notweb: that type forces a client secret this server doesn't use.)App Redirect URL: enter exactly
http://localhost:8080/callback(If port 8080 is already used on your machine, pick another port here and set
MAL_OAUTH_PORTto the same number. See Configuration.)Fill the remaining required fields with anything reasonable, accept the terms, and Submit.
Open your new app and copy its Client ID.
Step 2: Give the Client ID to the server.
Add it to your MCP client config (or paste it into the Claude Desktop install form). Nothing else is needed here:
"env": { "MAL_CLIENT_ID": "paste-your-client-id-here" }Restart the server/client so it picks up the value.
Step 3: Log in (one click).
In your assistant, run the login_mal tool (or just say "log in to
MyAnimeList"). It replies with a link. Open the link, sign in to MAL, and click
Allow.
Running locally (Claude Desktop, or Claude Code on your own machine): login finishes automatically the moment you click Allow. Confirm with "show my MAL profile" (
get_my_user_info).Running on a remote/SSH/headless host: after clicking Allow, your browser lands on a page that won't load. That's expected. Copy the full address from the browser's address bar (it contains
?code=…) and give it to thesubmit_mal_redirecttool to finish.
That's it. The token is saved locally (~/.config/mal-mcp/tokens.json, 0600)
and refreshed automatically from now on, so you won't need to log in again.
Prefer no interactive step? You can instead pre-set
MAL_REFRESH_TOKEN(withMAL_CLIENT_ID) or a standaloneMAL_ACCESS_TOKEN. See docs/auth.md for how to obtain them by hand.
Configuration
All configuration is via environment variables, all optional. Without credentials
the read tools still work. For the personal-list tools, set MAL_CLIENT_ID and run
the login_mal tool once; the access token is then fetched and refreshed
automatically. (mal-mcp is a public PKCE client, so there is no client secret.)
Variable | Purpose |
| Your MyAnimeList Client ID. See Connect your MyAnimeList account for how to get one (it's free, ~2 minutes, no coding involved). |
| Advanced, optional. Skips the interactive |
| Advanced, optional. A standalone token that works ~30 days without refreshing. See docs/auth.md. |
Tuning (rarely needed)
These have sensible defaults; change them only if you need different timing, a different upstream base URL, or want to override where/how the server logs or stores its token.
Variable | Purpose |
| Override where the login token is saved on disk (default: your OS's config folder). |
| Only needed if port |
| How much the server logs: |
| Min spacing between Tenrai calls (default |
| TTL for the in-memory read cache (default |
| Per-request timeout (default |
| Override upstream base URLs. |
Provide these in your MCP client config's env block (the server does not
read a .env file). See docs/auth.md for how to obtain the
credentials, and
docs/clients.md for client configuration snippets.
NSFW content
NSFW (adult) results are not filtered by default. The server returns whatever the upstream API provides. Most read tools accept two filter levels:
sfw: true: excludes adult/explicit-rated entries (R+ Mild Nudity and up).sfw_strict: true: also excludes anything tagged with the Ecchi genre, even otherwise mainstream, safely-rated shows thatsfwalone still lets through (e.g. No Game No Life, Kill la Kill).
On a list/search tool (search_anime, search_manga, get_seasonal_anime,
get_upcoming_season, get_anime_schedule, get_top_anime, get_top_manga,
get_random_anime, get_random_manga, get_recent_anime_recommendations,
get_recent_manga_recommendations) this filters which entries come back. On a
by-id lookup (get_anime, get_manga, get_anime_recommendations,
get_manga_recommendations, get_character, get_person, get_anime_news,
get_manga_news) the item you asked for is always returned regardless. It
instead filters NSFW entries out of that item's own nested lists (e.g. an
anime's relations, a person's own anime/manga credits), except on the two
news tools, where it can empty the result entirely for an NSFW-rated
anime/manga. get_top_people/get_top_characters have no such filter, since
people/characters aren't independently content-rated the way anime/manga are.
search_anime and get_top_anime/get_seasonal_anime/get_upcoming_season also
accept a rating filter for finer-grained control: target one or more specific
MAL content ratings (e.g. pg13, r17) directly instead of a blanket adult-content
cutoff.
Development
npm run build # type-check + bundle to dist/
npm test # node:test suite (mocked, offline)
npm run test:coverage
npm run lint
npm run format
npm run check:api # live health-check of upstream endpoints
npm run inspector # run under the MCP InspectorRuntime requires Node ≥ 22.18. See AGENTS.md for contributor/agent guidance.
Updating
To be notified of new versions, click Watch → Releases on GitHub.
.mcpbbundle: download the newmal-mcp.mcpbfrom the releases page and reinstall it in your client (it replaces the old version).From source:
git pull && npm ci && npm run build.npx (after npm publish): unpinned
npx -y mal-mcpfetches the latest on the next run; if you pinned a version, bump it.
See the CHANGELOG for what changed in each release.
Attribution and terms
This is an unofficial project and is not affiliated with or endorsed by MyAnimeList. Read data is provided by Tenrai, a free, unofficial MAL API; please respect its rate limits. Personal-list operations use the official MyAnimeList API under your own account and token. Use is subject to the MyAnimeList Terms of Service.
Privacy Policy
mal-mcp runs locally on your machine and has no telemetry of its own. See
PRIVACY.md for exactly what data it handles (including what the
personal-list tools can read and change on your real MyAnimeList account),
what it sends to Tenrai/MyAnimeList, and what (if anything) it stores on disk.
Security
See SECURITY.md for the read/write tool distinction, token storage, credential redaction, and how to report a vulnerability.
License
MIT © Grinv
Available Tools
54 toolsdelete_my_anime_list_itemRemove anime from my listADestructiveIdempotent
Remove an anime entry from the authenticated user's list. This cannot be undone. Returns deleted: true whenever MAL accepts the request — including when the anime was never on the list to begin with, since MAL's own delete endpoint doesn't distinguish the two — so success alone isn't proof something existed; check get_my_anime_list first if you need to confirm. Requires a MyAnimeList login.
Inputs: anime_id (required). Returns: deleted, anime_id
delete_my_manga_list_itemRemove manga from my listADestructiveIdempotent
Remove a manga entry from the authenticated user's list. This cannot be undone. Returns deleted: true whenever MAL accepts the request — including when the manga was never on the list to begin with, since MAL's own delete endpoint doesn't distinguish the two — so success alone isn't proof something existed; check get_my_manga_list first if you need to confirm. Requires a MyAnimeList login.
Inputs: manga_id (required). Returns: deleted, manga_id
get_animeGet anime detailsARead-only
Get full details for one anime by mal_id: synopsis, score, genres, studios, streaming links, external links (official site, social media), alternate title synonyms, and related entries. moreinfo is a free-text field MAL editors sometimes add (e.g. suggested viewing order for a franchise) — usually absent. Only carries the single main trailer URL — use get_anime_videos for every promo/episode-preview/music video. Obtain the mal_id from search_anime first. sfw/sfw_strict don't affect this anime itself (its id was requested explicitly) — they filter NSFW entries out of its relations list. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which omits themes/demographics/producers/licensors/streaming/opening_themes/ending_themes/trailer/favorites/moreinfo/explicit_genres/external (no equivalent fields there) and ignores sfw/sfw_strict entirely.
Inputs: id (required), sfw, sfw_strict. Returns: url, rank, type, year, +36 more
get_anime_charactersGet anime charactersARead-only
List the characters of an anime (by mal_id) with their roles and Japanese voice actors. Get the mal_id from search_anime.
Inputs: id (required). Returns: characters
get_anime_episodesGet anime episodesARead-only
List an anime's episodes (by mal_id) with titles, air dates and filler/recap flags. Paginated (~100 per page); use page for long-running series. Get the mal_id from search_anime.
Inputs: id (required), page. Returns: page, episodes
get_anime_genresGet anime genresARead-only
List anime genres/themes/demographics with their MAL IDs. Use this to discover the numeric IDs that the genres parameter of search_anime expects. sfw/sfw_strict drop the adult (and, for sfw_strict, Ecchi) genres from the list itself.
Inputs: sfw, filter, sfw_strict. Returns: genres
get_anime_interest_stacksGet interest stacks containing an animeARead-only
List the public MyAnimeList Interest Stacks that include a given anime (by mal_id) — useful for 'what do people group this with' and as a jumping-off point for recommendations rooted in human curation rather than vote counts. Get the mal_id from search_anime. Returns stack metadata only; pass a stack's own mal_id to get_interest_stack for its entries. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: id (required), sfw, page, sort, +6 more. Returns: page, results
get_anime_newsGet anime newsARead-only
List recent news articles about an anime (by mal_id): headline, date, author and excerpt. Useful for 'what's new / any announcements' questions. Get the mal_id from search_anime. Use get_news instead for a site-wide feed not tied to one anime. sfw/sfw_strict filter out articles for an NSFW/adult-adjacent anime — verified live this can cut the result down sharply (not necessarily to zero) rather than being a no-op.
Inputs: id (required), sfw, page, sfw_strict. Returns: page, results
get_anime_recommendationsGet anime recommendationsARead-only
Get community recommendations for anime similar to the given mal_id, ordered by votes and capped at the top 25 (no pagination). Get the mal_id from search_anime. Use get_top_anime instead for a global popularity/score ranking not tied to one title, or get_recent_anime_recommendations for a site-wide feed of recommendation pairs not tied to this title either. sfw/sfw_strict filter NSFW entries out of the recommendation list itself. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API's own recommendations field (same output shape, but at most 10 entries, ordering may differ from Tenrai's, and sfw/sfw_strict are ignored entirely).
Inputs: id (required), sfw, sfw_strict. Returns: recommendations
get_anime_reviewsGet anime reviewsARead-only
Get user reviews for one anime (by mal_id): review text (truncated to 1200 characters), score, spoiler/preliminary flags, episodes watched at review time (episodes_watched, not chapters_read — that field is manga-only), and community reaction counts. limit (default 5) caps how many of the fetched page's reviews come back — it does not itself fetch further pages, use page for Tenrai's own ~20-per-page listing. sort/preliminary/spoilers/sentiment filter/order the underlying set before that cap is applied. Get the mal_id from search_anime.
Inputs: id (required), page, sort, limit, +3 more. Returns: page, reviews
get_anime_scheduleGet broadcast scheduleARead-only
Get the anime broadcast schedule (air times in JST), optionally for a single weekday (or the unknown/other buckets Tenrai uses for shows with no fixed weekly slot). broadcast is only present for currently-airing shows. Defaults to 25 results if limit is omitted; use page for further results.
Inputs: day, sfw, kids, page, +3 more. Returns: page, results
get_anime_staffGet anime staffARead-only
List the production staff of an anime (by mal_id) — director, composer, etc. — with their roles. Complements get_anime_characters (which covers voice actors). Get the mal_id from search_anime.
Inputs: id (required). Returns: staff
get_anime_statisticsGet anime statisticsARead-only
Get watch-status counts (watching/completed/…) and the score distribution for an anime by mal_id. Get the mal_id from search_anime. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which omits the score distribution (scores) entirely — no equivalent field there.
Inputs: id (required). Returns: total, scores, dropped, on_hold, +5 more
get_anime_videosGet anime videosARead-only
List an anime's promotional videos (PVs/trailers), episode preview clips, and music videos (openings/endings), each with a title, watch URL, thumbnail, and view/like counts where available. This is richer than get_anime's single trailer field — use this instead when the caller wants every promo, not just the main one. Get the mal_id from search_anime.
Inputs: id (required). Returns: promo, episodes, music_videos
get_characterGet character detailsARead-only
Get full details for one character by mal_id: bio, the anime/manga they appear in, and their voice actors. Obtain the mal_id from search_characters or get_anime_characters. sfw/sfw_strict filter NSFW/adult-adjacent titles out of the character's own anime/manga appearance lists (verified live) rather than affecting the character itself.
Inputs: id (required), sfw, sfw_strict. Returns: url, name, about, anime, +7 more
get_interest_stackGet one interest stackARead-only
Get one MyAnimeList Interest Stack by mal_id, with its entries in the curator's own order — each carrying that curator's score (author_score) and note. Obtain the stack's mal_id from get_interest_stacks, get_anime_interest_stacks or get_manga_interest_stacks. Every entry's own mal_id chains into get_anime or get_manga (the stack's stack_type says which). sfw/sfw_strict filter NSFW entries out of the entry list rather than hiding the stack itself. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: id (required), sfw, sfw_strict. Returns: url, title, mal_id, entries, +10 more
get_interest_stacksBrowse interest stacksARead-only
Browse or search MyAnimeList Interest Stacks: themed anime/manga lists curated by real users, each entry carrying the curator's own score and note. Use this for taste- or mood-shaped requests ('something melancholy', 'cozy slice-of-life') where a ranking or a genre filter is the wrong instrument — get_top_anime answers 'what is best', this answers 'what goes together'. Returns stack metadata only; pass a stack's mal_id to get_interest_stack for its actual entries. For stacks containing one specific title, use get_anime_interest_stacks/get_manga_interest_stacks instead. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: q, sfw, page, sort, +7 more. Returns: page, results
get_magazinesGet manga magazinesARead-only
List or search manga serialization magazines/publishers (e.g. Weekly Shonen Jump) with their MAL IDs and manga counts. Use q to search by name, or look up an ID here for search_manga's magazines filter.
Inputs: q, page, sort, limit, +2 more. Returns: page, results
get_mangaGet manga detailsARead-only
Get full details for one manga by mal_id: synopsis, score, genres, authors, serialization, external links (official site, social media), alternate title synonyms, and related entries. Obtain the mal_id from search_manga first. sfw/sfw_strict don't affect this manga itself (its id was requested explicitly) — they filter NSFW entries out of its relations list. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which omits themes/demographics/favorites/moreinfo/explicit_genres/external (no equivalent fields there) and ignores sfw/sfw_strict entirely.
Inputs: id (required), sfw, sfw_strict. Returns: url, rank, type, score, +26 more
get_manga_charactersGet manga charactersARead-only
List the characters of a manga (by mal_id) with their roles. Get the mal_id from search_manga.
Inputs: id (required). Returns: characters
get_manga_genresGet manga genresARead-only
List manga genres/themes/demographics with their MAL IDs. Use this to discover the numeric IDs that the genres parameter of search_manga expects. sfw/sfw_strict drop the adult (and, for sfw_strict, Ecchi) genres from the list itself.
Inputs: sfw, filter, sfw_strict. Returns: genres
get_manga_interest_stacksGet interest stacks containing a mangaARead-only
List the public MyAnimeList Interest Stacks that include a given manga (by mal_id). The manga counterpart of get_anime_interest_stacks. Get the mal_id from search_manga. Returns stack metadata only; pass a stack's own mal_id to get_interest_stack for its entries. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: id (required), sfw, page, sort, +6 more. Returns: page, results
get_manga_newsGet manga newsARead-only
List recent news articles about a manga (by mal_id): headline, date, author and excerpt. Useful for 'what's new / any announcements' questions. Get the mal_id from search_manga. Use get_news instead for a site-wide feed not tied to one manga. sfw/sfw_strict filter out articles for an NSFW/adult-adjacent manga — verified live this can cut the result down sharply (not necessarily to zero) rather than being a no-op.
Inputs: id (required), sfw, page, sfw_strict. Returns: page, results
get_manga_recommendationsGet manga recommendationsARead-only
Get community recommendations for manga similar to the given mal_id, ordered by votes and capped at the top 25 (no pagination). Get the mal_id from search_manga. Use get_top_manga instead for a global popularity/score ranking not tied to one title, or get_recent_manga_recommendations for a site-wide feed of recommendation pairs not tied to this title either. sfw/sfw_strict filter NSFW entries out of the recommendation list itself. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API's own recommendations field (same output shape, but at most 10 entries, ordering may differ from Tenrai's, and sfw/sfw_strict are ignored entirely).
Inputs: id (required), sfw, sfw_strict. Returns: recommendations
get_manga_reviewsGet manga reviewsARead-only
Get user reviews for one manga (by mal_id): review text (truncated to 1200 characters), score, spoiler/preliminary flags, chapters read at review time (chapters_read, not episodes_watched — that field is anime-only), and community reaction counts. limit (default 5) caps how many of the fetched page's reviews come back — it does not itself fetch further pages, use page for Tenrai's own ~20-per-page listing. sort/preliminary/spoilers/sentiment filter/order the underlying set before that cap is applied. Get the mal_id from search_manga.
Inputs: id (required), page, sort, limit, +3 more. Returns: page, reviews
get_manga_statisticsGet manga statisticsARead-only
Get read-status counts (reading/completed/…) and the score distribution for a manga by mal_id. Get the mal_id from search_manga. Unlike get_anime_statistics, no official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: id (required). Returns: total, scores, dropped, on_hold, +5 more
get_my_anime_listGet my anime listARead-only
Get the authenticated user's own anime list, with each entry's status, score and progress. Requires a MyAnimeList login.
Inputs: sort, limit, offset, status. Returns: items, has_next_page
get_my_manga_listGet my manga listARead-only
Get the authenticated user's own manga list, with status, score and progress. Requires a MyAnimeList login.
Inputs: sort, limit, offset, status. Returns: items, has_next_page
get_my_user_infoGet my MAL profileARead-only
Get the logged-in user's MyAnimeList profile and anime watch-status statistics. Requires a MyAnimeList login. Anime-only — the official API has no manga statistics field at all, and there is no tool for a user's manga read stats.
Inputs: no named parameters. Returns: id, name, location, joined_at, +1 more
get_newsGet anime/manga newsARead-only
List recent MyAnimeList news articles site-wide (headline, date, author, excerpt) — not tied to one anime or manga. Use q to search by keyword or tag to filter by topic tag. Use get_anime_news/get_manga_news instead for news about one specific anime/manga by mal_id. sfw/sfw_strict drop articles about adult content.
Inputs: q, sfw, tag, page, +2 more. Returns: page, results
get_personGet person detailsARead-only
Get full details for one person by mal_id: bio, their anime/manga staff-credit lists, and their voiced roles. Staff credits are capped at the first 200 (only an extreme outlier hits that — a prolific sound director can have 500+; a well-known director sits under 100); when the cap bites, the response says so via credits_truncated plus total_anime_credits/total_manga_credits, and full_credits: true returns every entry. voice_roles is separately capped at the first 50, in whatever order the upstream API returns them (not necessarily their most notable roles). Obtain the mal_id from search_people, or from get_character's voice_actors (which include each actor's mal_id — get_anime_characters' voice_actors are names only, with no id). sfw/sfw_strict filter NSFW/adult-adjacent titles out of the person's own anime/manga credit lists (verified live) rather than affecting the person themselves.
Inputs: id (required), sfw, sfw_strict, full_credits. Returns: url, name, about, anime, +12 more
get_producerGet producer/studio detailsARead-only
Get full details for one anime producer/studio by mal_id: about text and external links (official site, social media) alongside the fields get_producers already returns. Obtain the mal_id from get_producers.
Inputs: id (required). Returns: url, name, about, count, +5 more
get_producersGet producers/studiosARead-only
List or search anime producers and studios with their MAL IDs and counts. Use q to search by name, then get_producer for one studio's full profile (about text, external links).
Inputs: q, page, sort, limit, +2 more. Returns: page, results
get_random_animeGet a random animeARead-only
Return one random anime (core details: no relations/streaming/opening_themes/ending_themes/external — call get_anime with the returned mal_id for those). Good for discovery / suggestions. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: sfw, sfw_strict. Returns: url, rank, type, year, +36 more
get_random_characterGet a random characterARead-only
Return one random character (core details: no anime/manga/voice_actors — call get_character with the returned mal_id for those). Good for discovery / trivia. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: no named parameters. Returns: url, name, about, anime, +7 more
get_random_mangaGet a random mangaARead-only
Return one random manga (core details: no relations/external — call get_manga with the returned mal_id for those). Good for discovery / suggestions. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: sfw, sfw_strict. Returns: url, rank, type, score, +26 more
get_random_personGet a random personARead-only
Return one random person — voice actor, director, author (core details: no anime/manga/voice_roles — call get_person with the returned mal_id for those). Good for discovery / trivia. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: no named parameters. Returns: url, name, about, anime, +12 more
get_recent_anime_recommendationsGet recent anime recommendationsARead-only
Get a site-wide feed of recently-submitted anime recommendation pairs (e.g. 'if you liked X, try Y') with the submitting user's own commentary — not tied to any one title. Use get_anime_recommendations instead for recommendations similar to a specific mal_id. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: sfw, page, limit, sfw_strict. Returns: page, results
get_recent_manga_recommendationsGet recent manga recommendationsARead-only
Get a site-wide feed of recently-submitted manga recommendation pairs (e.g. 'if you liked X, try Y') with the submitting user's own commentary — not tied to any one title. Use get_manga_recommendations instead for recommendations similar to a specific mal_id. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.
Inputs: sfw, page, limit, sfw_strict. Returns: page, results
get_seasonal_animeGet seasonal animeARead-only
List anime from a given season — supply both year and season together, or omit both for the current season; supplying only one is treated as omitting both. For next season's lineup use get_upcoming_season instead. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API — filter/rating/unapproved/continuing/kids are silently dropped (no equivalent there), order_by/sort keep only the default members-descending order (anything else comes back unsorted), themes/demographics/broadcast come back empty, and sfw_strict degrades to the same filtering as sfw there (no Ecchi-genre distinction available).
Inputs: sfw, kids, page, sort, +9 more. Returns: page, results
get_seasons_listList available seasonsARead-only
List the years and seasons that have anime data, so you can pick valid arguments for get_seasonal_anime.
Inputs: no named parameters. Returns: seasons
get_top_animeGet top animeARead-only
Get anime ranked by all-time score/popularity, not tied to any season. Use filter for special rankings (airing, upcoming, bypopularity, favorite); for a specific season's lineup use get_seasonal_anime or get_upcoming_season instead. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which takes one ranking instead of type + filter: filter wins over type; a type with no official ranking (ona, music, cm, pv, tv_special) or more than one type is dropped, and with nothing usable left the all-time ranking is returned; rating is ignored entirely, themes/demographics/broadcast come back empty, and sfw_strict degrades to the same filtering as sfw (the official API can't separate adult-rated from Ecchi-tagged-but-safely-rated).
Inputs: sfw, page, type, limit, +3 more. Returns: page, results
get_top_charactersGet top charactersARead-only
Get the most popular/favorited characters, ranked overall. Use search_characters instead to look up a specific character by name.
Inputs: page, limit. Returns: page, results
get_top_mangaGet top mangaARead-only
Get manga ranked by all-time score/popularity, not tied to any release window. Use filter for special rankings (publishing, upcoming, bypopularity, favorite). If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API, which takes one ranking instead of type + filter: filter publishing/upcoming has no official ranking and is dropped, bypopularity/favorite win over type, a single type maps to its closest official ranking (novel and lightnovel share one), more than one type is dropped, and with nothing usable left the all-time ranking is returned; themes/demographics come back empty, and sfw_strict degrades to the same filtering as sfw (the official API can't separate adult-rated from Ecchi-tagged-but-safely-rated).
Inputs: sfw, page, type, limit, +2 more. Returns: page, results
get_top_peopleGet top peopleARead-only
Get the most popular/favorited people (voice actors, staff, authors), ranked overall. Use search_people instead to look up a specific person by name.
Inputs: page, limit. Returns: page, results
get_upcoming_seasonGet upcoming season animeARead-only
List anime scheduled for the upcoming season. Use get_seasonal_anime for the current or a specific past season. If Tenrai is unavailable and MAL_CLIENT_ID is set, transparently retries via the official API — filter/rating/unapproved/continuing/kids are silently dropped (no equivalent there), order_by/sort keep only the default members-descending order (anything else comes back unsorted), themes/demographics/broadcast come back empty, and sfw_strict degrades to the same filtering as sfw there (no Ecchi-genre distinction available).
Inputs: sfw, kids, page, sort, +7 more. Returns: page, results
login_malLog in to MyAnimeListA
Authorize the personal-list tools with your MyAnimeList account (one-time). Prerequisite: register a MAL API app of type 'other' at https://myanimelist.net/apiconfig with Redirect URI set to this server's localhost callback, and set MAL_CLIENT_ID in the server env. Calling this returns an authorization URL: open it, log in, and click Allow. If your browser is on the same machine as the server and the callback port is free, login completes automatically; otherwise (a remote/headless host, or the port is busy) copy the URL you land on and pass it to submit_mal_redirect.
Inputs: no named parameters. Returns: auto_capture, instructions, redirect_uri, authorize_url
search_animeSearch animeARead-only
Search MyAnimeList anime by keyword; returns compact summaries (with the mal_id that other anime tools require) plus pagination info. If Tenrai is unavailable and MAL_CLIENT_ID is set and q has at least 3 characters (the official search rejects anything shorter, so a filter-only or 1-2 character search has no fallback), transparently retries via the official API, which ignores every filter except q/sfw/limit/page (type/status/genres/genres_exclude/rating/score/min_score/max_score/letter/producers/start_date/end_date/unapproved/order_by/sort are silently dropped), always returns empty themes/demographics/broadcast (no official-API equivalent for any of these), and — for a query with no real title match — comes back with a page of unrelated anime instead of an empty result (a quirk of the official search endpoint itself, not a mal-mcp bug; don't treat a nonsense-query result as a real match during a fallback).
Inputs: q, sfw, page, sort, +16 more. Returns: page, results
search_charactersSearch charactersARead-only
Search MyAnimeList characters by name. Returns compact summaries and the mal_id needed by get_character. Use get_anime_characters instead if you already have an anime's mal_id and want its full cast.
Inputs: q (required), page, sort, limit, +2 more. Returns: page, results
search_mangaSearch mangaARead-only
Search MyAnimeList manga by keyword (also light novels, manhwa/manhua); returns compact summaries with the mal_id that other manga tools require. If Tenrai is unavailable and MAL_CLIENT_ID is set and q has at least 3 characters (the official search rejects anything shorter, so a filter-only or 1-2 character search has no fallback), transparently retries via the official API, which ignores every filter except q/sfw/limit/page (type/status/genres/genres_exclude/score/min_score/max_score/letter/magazines/start_date/end_date/unapproved/order_by/sort are silently dropped), always returns empty themes/demographics (no official-API equivalent), and — for a query with no real title match — comes back with a page of unrelated manga instead of an empty result (a quirk of the official search endpoint itself, not a mal-mcp bug; don't treat a nonsense-query result as a real match during a fallback).
Inputs: q, sfw, page, sort, +15 more. Returns: page, results
search_peopleSearch peopleARead-only
Search MyAnimeList people (voice actors, directors, authors) by name. Returns the mal_id needed by get_person.
Inputs: q (required), page, sort, limit, +2 more. Returns: page, results
submit_mal_redirectFinish MyAnimeList loginA
Complete a login started with login_mal by submitting the URL your browser was redirected to after clicking Allow (the one containing ?code=...). Use this when login didn't complete automatically — e.g. the server runs on a remote/headless host. A bare code string is also accepted.
Inputs: redirect_url (required). Returns: user, message, logged_in
update_my_anime_statusUpdate my anime statusAIdempotent
Add or update an anime on the authenticated user's list (status, score, watched episodes, dates). Creates the entry if absent; fields you omit are left unchanged on an existing entry. Provide at least one field besides anime_id. Requires a MyAnimeList login.
Inputs: anime_id (required), tags, score, status, +8 more. Returns: score, status
update_my_manga_statusUpdate my manga statusAIdempotent
Add or update a manga on the authenticated user's list (status, score, chapters/volumes read, dates). Creates the entry if absent; fields you omit are left unchanged on an existing entry. Provide at least one field besides manga_id. Requires a MyAnimeList login.
Inputs: manga_id (required), tags, score, status, +9 more. Returns: score, status
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 54 tools
The tools are largely distinguishable by resource and action, and descriptions explicitly cross-reference close alternatives (e.g. site-wide news vs per-title news, top vs seasonal vs upcoming anime). However, with 54 tools there are many fine-grained siblings—multiple recommendation feeds, anime/manga twins, and several discovery/ranking tools—so an agent must read carefully to avoid misselection.
Names follow a predictable snake_case verb_noun pattern throughout: search_*, get_*, update_*, delete_*, plus login_mal/submit_mal_redirect. Resource qualifiers (anime, manga, character, person) are applied consistently across the set.
54 tools is very heavy for an agent-facing server. While the MyAnimeList domain is broad, many tools are narrow variants (separate random_*, anime/manga recommendation twins, multiple news tools), making the surface larger than necessary and increasing selection cost.
Coverage is broad: search/details for anime, manga, characters, people, producers, magazines, genres, recommendations, reviews, news, statistics, interest stacks, seasonal data, and authenticated list CRUD with login flow. Minor gaps remain around anime/manga image galleries, forums/clubs, and richer user-profile lookup, but core workflows are covered.
Maintenance
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)
AnimeQuotes MCP — wraps animechan.io (free, no auth)
Official MCP server for MAQAMI, a hotel and flight booking platform with 3M+ hotels. Search live hotel rates and flights, look up places, airports and hotel details, then prebook and book. Remote Streamable HTTP endpoint, no API key required.
Related MCP Servers
- AlicenseBqualityCmaintenanceAniList MCP server for accessing AniList API data44181 npm91MIT
- 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.82 npm2MIT
- AlicenseBqualityDmaintenanceMCP Server for interacting with the MyAnimeList API, allowing LLM clients to access and interact with anime, manga and more.154MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server for anime and manga discovery, enabling search, detail retrieval, franchise watch order, seasonal schedule, character lookups, rankings, and studio filmography via natural language.171 npm2Apache 2.0