Skip to main content
Glama
MAL MCP Server

MAL MCP Server

MAL MCP Server

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

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

What it does

It uses a hybrid backend:

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

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

Related MCP server: mal-mcp

What you need (and what it gets you)

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

You set...

You get...

(nothing)

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

A MyAnimeList Client ID (2 minutes, free →)

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

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

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

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

Example queries

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

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

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

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

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

Tools

Tool

Backend

Auth

search_anime, search_manga

Tenrai

none

get_anime, get_manga

Tenrai

none

get_anime_characters, get_anime_recommendations, get_anime_reviews

Tenrai

none

get_manga_characters, get_manga_recommendations, get_manga_reviews

Tenrai

none

get_recent_anime_recommendations, get_recent_manga_recommendations

Tenrai

none

get_anime_episodes, get_anime_videos

Tenrai

none

get_anime_genres, get_manga_genres

Tenrai

none

search_characters, get_character

Tenrai

none

search_people, get_person, get_anime_staff

Tenrai

none

get_anime_statistics, get_manga_statistics

Tenrai

none

get_random_anime, get_random_manga, get_random_character, get_random_person

Tenrai

none

get_anime_news, get_manga_news, get_news

Tenrai

none

get_top_anime, get_top_manga

Tenrai

none

get_top_people, get_top_characters

Tenrai

none

get_seasonal_anime, get_upcoming_season, get_seasons_list, get_anime_schedule

Tenrai

none

get_producers, get_producer, get_magazines

Tenrai

none

get_interest_stacks, get_interest_stack, get_anime_interest_stacks, get_manga_interest_stacks

Tenrai

none

get_my_user_info, get_my_anime_list, get_my_manga_list

MAL

token

update_my_anime_status, update_my_manga_status

MAL

token

delete_my_anime_list_item, delete_my_manga_list_item

MAL

token

login_mal, submit_mal_redirect

MAL

login

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

Install

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

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

From source

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

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

Connect it to an MCP client

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

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

Or with the Claude Code CLI:

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

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

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

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

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

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

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

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

  3. App Redirect URL: enter exactly

    http://localhost:8080/callback

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

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

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

Step 2: Give the Client ID to the server.

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

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

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

Step 3: Log in (one click).

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

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

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

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

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

Configuration

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

Variable

Purpose

MAL_CLIENT_ID

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

MAL_REFRESH_TOKEN

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

MAL_ACCESS_TOKEN

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

Tuning (rarely needed)

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

Variable

Purpose

MAL_TOKEN_STORE

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

MAL_OAUTH_PORT

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

LOG_LEVEL

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

TENRAI_MIN_INTERVAL_MS

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

CACHE_TTL_MS

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

HTTP_TIMEOUT_MS, HTTP_RETRIES

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

TENRAI_BASE_URL, MAL_BASE_URL, MAL_OAUTH_BASE_URL

Override upstream base URLs.

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

NSFW content

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

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

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

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

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

Development

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

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

Updating

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

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

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

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

See the CHANGELOG for what changed in each release.

Attribution and terms

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

Privacy Policy

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

Security

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

License

MIT © Grinv

Available Tools

54 tools
delete_my_anime_list_itemRemove anime from my listA
DestructiveIdempotent

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

Inputs: anime_id (required). Returns: deleted, anime_id

delete_my_manga_list_itemRemove manga from my listA
DestructiveIdempotent

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

Inputs: manga_id (required). Returns: deleted, manga_id

get_animeGet anime detailsA
Read-only

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

Inputs: id (required), sfw, sfw_strict. Returns: url, rank, type, year, +36 more

get_anime_charactersGet anime charactersA
Read-only

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

Inputs: id (required). Returns: characters

get_anime_episodesGet anime episodesA
Read-only

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

Inputs: id (required), page. Returns: page, episodes

get_anime_genresGet anime genresA
Read-only

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

Inputs: sfw, filter, sfw_strict. Returns: genres

get_anime_interest_stacksGet interest stacks containing an animeA
Read-only

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

Inputs: id (required), sfw, page, sort, +6 more. Returns: page, results

get_anime_newsGet anime newsA
Read-only

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

Inputs: id (required), sfw, page, sfw_strict. Returns: page, results

get_anime_recommendationsGet anime recommendationsA
Read-only

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

Inputs: id (required), sfw, sfw_strict. Returns: recommendations

get_anime_reviewsGet anime reviewsA
Read-only

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

Inputs: id (required), page, sort, limit, +3 more. Returns: page, reviews

get_anime_scheduleGet broadcast scheduleA
Read-only

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

Inputs: day, sfw, kids, page, +3 more. Returns: page, results

get_anime_staffGet anime staffA
Read-only

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

Inputs: id (required). Returns: staff

get_anime_statisticsGet anime statisticsA
Read-only

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

Inputs: id (required). Returns: total, scores, dropped, on_hold, +5 more

get_anime_videosGet anime videosA
Read-only

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

Inputs: id (required). Returns: promo, episodes, music_videos

get_characterGet character detailsA
Read-only

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

Inputs: id (required), sfw, sfw_strict. Returns: url, name, about, anime, +7 more

get_interest_stackGet one interest stackA
Read-only

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

Inputs: id (required), sfw, sfw_strict. Returns: url, title, mal_id, entries, +10 more

get_interest_stacksBrowse interest stacksA
Read-only

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

Inputs: q, sfw, page, sort, +7 more. Returns: page, results

get_magazinesGet manga magazinesA
Read-only

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

Inputs: q, page, sort, limit, +2 more. Returns: page, results

get_mangaGet manga detailsA
Read-only

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

Inputs: id (required), sfw, sfw_strict. Returns: url, rank, type, score, +26 more

get_manga_charactersGet manga charactersA
Read-only

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

Inputs: id (required). Returns: characters

get_manga_genresGet manga genresA
Read-only

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

Inputs: sfw, filter, sfw_strict. Returns: genres

get_manga_interest_stacksGet interest stacks containing a mangaA
Read-only

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

Inputs: id (required), sfw, page, sort, +6 more. Returns: page, results

get_manga_newsGet manga newsA
Read-only

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

Inputs: id (required), sfw, page, sfw_strict. Returns: page, results

get_manga_recommendationsGet manga recommendationsA
Read-only

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

Inputs: id (required), sfw, sfw_strict. Returns: recommendations

get_manga_reviewsGet manga reviewsA
Read-only

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

Inputs: id (required), page, sort, limit, +3 more. Returns: page, reviews

get_manga_statisticsGet manga statisticsA
Read-only

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

Inputs: id (required). Returns: total, scores, dropped, on_hold, +5 more

get_my_anime_listGet my anime listA
Read-only

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

Inputs: sort, limit, offset, status. Returns: items, has_next_page

get_my_manga_listGet my manga listA
Read-only

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

Inputs: sort, limit, offset, status. Returns: items, has_next_page

get_my_user_infoGet my MAL profileA
Read-only

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

Inputs: no named parameters. Returns: id, name, location, joined_at, +1 more

get_newsGet anime/manga newsA
Read-only

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

Inputs: q, sfw, tag, page, +2 more. Returns: page, results

get_personGet person detailsA
Read-only

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

Inputs: id (required), sfw, sfw_strict, full_credits. Returns: url, name, about, anime, +12 more

get_producerGet producer/studio detailsA
Read-only

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

Inputs: id (required). Returns: url, name, about, count, +5 more

get_producersGet producers/studiosA
Read-only

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

Inputs: q, page, sort, limit, +2 more. Returns: page, results

get_random_animeGet a random animeA
Read-only

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

Inputs: sfw, sfw_strict. Returns: url, rank, type, year, +36 more

get_random_characterGet a random characterA
Read-only

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

Inputs: no named parameters. Returns: url, name, about, anime, +7 more

get_random_mangaGet a random mangaA
Read-only

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

Inputs: sfw, sfw_strict. Returns: url, rank, type, score, +26 more

get_random_personGet a random personA
Read-only

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

Inputs: no named parameters. Returns: url, name, about, anime, +12 more

get_recent_anime_recommendationsGet recent anime recommendationsA
Read-only

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

Inputs: sfw, page, limit, sfw_strict. Returns: page, results

get_recent_manga_recommendationsGet recent manga recommendationsA
Read-only

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

Inputs: sfw, page, limit, sfw_strict. Returns: page, results

get_seasonal_animeGet seasonal animeA
Read-only

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

Inputs: sfw, kids, page, sort, +9 more. Returns: page, results

get_seasons_listList available seasonsA
Read-only

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

Inputs: no named parameters. Returns: seasons

get_top_animeGet top animeA
Read-only

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

Inputs: sfw, page, type, limit, +3 more. Returns: page, results

get_top_charactersGet top charactersA
Read-only

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

Inputs: page, limit. Returns: page, results

get_top_mangaGet top mangaA
Read-only

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

Inputs: sfw, page, type, limit, +2 more. Returns: page, results

get_top_peopleGet top peopleA
Read-only

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

Inputs: page, limit. Returns: page, results

get_upcoming_seasonGet upcoming season animeA
Read-only

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

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 animeA
Read-only

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

Inputs: q, sfw, page, sort, +16 more. Returns: page, results

search_charactersSearch charactersA
Read-only

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

Inputs: q (required), page, sort, limit, +2 more. Returns: page, results

search_mangaSearch mangaA
Read-only

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

Inputs: q, sfw, page, sort, +15 more. Returns: page, results

search_peopleSearch peopleA
Read-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 statusA
Idempotent

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

Inputs: anime_id (required), tags, score, status, +8 more. Returns: score, status

update_my_manga_statusUpdate my manga statusA
Idempotent

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

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

    A4/5.0

    Scored across 54 tools

    Disambiguation4/5

    The tools are largely distinguishable by resource and action, and descriptions explicitly cross-reference close alternatives (e.g. site-wide news vs per-title news, top vs seasonal vs upcoming anime). However, with 54 tools there are many fine-grained siblings—multiple recommendation feeds, anime/manga twins, and several discovery/ranking tools—so an agent must read carefully to avoid misselection.

    Naming Consistency5/5

    Names follow a predictable snake_case verb_noun pattern throughout: search_*, get_*, update_*, delete_*, plus login_mal/submit_mal_redirect. Resource qualifiers (anime, manga, character, person) are applied consistently across the set.

    Tool Count2/5

    54 tools is very heavy for an agent-facing server. While the MyAnimeList domain is broad, many tools are narrow variants (separate random_*, anime/manga recommendation twins, multiple news tools), making the surface larger than necessary and increasing selection cost.

    Completeness4/5

    Coverage is broad: search/details for anime, manga, characters, people, producers, magazines, genres, recommendations, reviews, news, statistics, interest stacks, seasonal data, and authenticated list CRUD with login flow. Minor gaps remain around anime/manga image galleries, forums/clubs, and richer user-profile lookup, but core workflows are covered.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol server that provides access to MyAnimeList's API for anime and manga data. It enables users to search, view rankings, manage their personal lists, and get recommendations through Claude and other MCP clients.
      82 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      An MCP server for anime and manga discovery, enabling search, detail retrieval, franchise watch order, seasonal schedule, character lookups, rankings, and studio filmography via natural language.
      171 npm
      2
      Apache 2.0