# MAL MCP Server (npm · mal-mcp)

MyAnimeList MCP server: Tenrai-powered reads plus official MAL personal-list management.

- Trust score: 83/100 (high trust)
- Change this week: +42
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- mcpb · `mal-mcp.mcpb`: 47/100, [markdown](https://verifymcp.io/servers/grinv-mal-mcp/https-github-com-grinv-mal-mcp-releases-download-v0-9-1-mal-mcp-mcpb.md), [page](https://verifymcp.io/servers/grinv-mal-mcp/https-github-com-grinv-mal-mcp-releases-download-v0-9-1-mal-mcp-mcpb)
- npm · `mal-mcp`: 83/100 (this document), [markdown](https://verifymcp.io/servers/grinv-mal-mcp/mal-mcp.md), [page](https://verifymcp.io/servers/grinv-mal-mcp/mal-mcp)

## Channel facts

- Registry: `npm`
- Package: `mal-mcp`
- Version: `0.9.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 0 of 3 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to Grinv/mal-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 79/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 10530 tokens (~210/item across 50 items; 50 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 18/100
  - Stability check failed: the tool surface changed between 0.7.2 and 0.9.1: 2 tool removals, 4 breaking changes, 7 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### Claude

```bash
claude mcp add grinv-mal-mcp -- npx -y mal-mcp
```

### Codex

```bash
codex mcp add grinv-mal-mcp -- npx -y mal-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "grinv-mal-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mal-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add grinv-mal-mcp --command npx --arg -y --arg mal-mcp
```

### Hermes

```yaml
mcp_servers:
  grinv-mal-mcp:
    command: "npx"
    args: ["-y", "mal-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "grinv-mal-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "mal-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 14 to 18.

### 2026-08-02 (score 82, +22)

- [security improvement] Malware scan: unverified → pass
- [functional improvement] Schema quality: unverified → excellent

### 2026-08-01 (score 60, +26)

- [security regression] Stability: unverified → fail
- [functional regression] Schema quality: excellent → unverified
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → 100
- [functional] Package version: 0.9.0 → 0.9.1

### 2026-07-31 (score 34, −41)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 75, +34)

- [functional regression] Schema quality: 109 → 208
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Tool coverage: unverified → 100
- [functional] Package version: 0.8.0 → 0.9.0

### 2026-07-29 (score 41, −37)

- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional] Package version: 0.7.3 → 0.8.0

### 2026-07-28 (score 78, +37)

- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Tool coverage: unverified → 100

### 2026-07-27 (score 41, −55)

- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Package version: 0.7.2 → 0.7.3
- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (50)

### `search_anime` (~786 tokens)

Search anime

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, 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), enforces an explicit `sfw: true` client-side (a filtered page can come back shorter than `limit`), 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).

Input parameters:

- `end_date` (string): Only include entries whose end date is on or before this date (YYYY-MM-DD).
- `genres` (string): Comma-separated MAL genre IDs to include (max 25), e.g. '1,4'. Look up IDs with get_anime_genres.
- `genres_exclude` (string): Comma-separated MAL genre IDs to exclude (max 25), e.g. '1,4'. Look up IDs with get_anime_genres.
- `letter` (string): Restrict results to entries whose title starts with this single letter.
- `limit` (integer): Max results per page (1-50).
- `max_score` (number): Maximum average MAL score (inclusive), 1-10.
- `min_score` (number): Minimum average MAL score (inclusive), 0-10.
- `order_by` (string): Field to order by.
- `page` (integer): 1-based page number for pagination (1-1000).
- `producers` (string): Comma-separated MAL producer/studio IDs to restrict to (max 25). Look up IDs with get_producers.
- `q` (string, required): Search query, e.g. an anime title.
- `rating` (array): Restrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.
- `score` (number): Restrict to entries with exactly this average score (rarely useful — prefer min_score/max_score for a range).
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
- `sort` (string): Sort direction.
- `start_date` (string): Only include entries whose start date is on or after this date (YYYY-MM-DD).
- `status` (string): Filter by airing status.
- `type` (array): Restrict to one or more media types.
- `unapproved` (boolean): If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.

Output parameters:

- `page` (object)
- `results` (array)

### `search_manga` (~729 tokens)

Search manga

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, 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), enforces an explicit `sfw: true` client-side (a filtered page can come back shorter than `limit`), 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).

Input parameters:

- `end_date` (string): Only include entries whose end date is on or before this date (YYYY-MM-DD).
- `genres` (string): Comma-separated MAL genre IDs to include (max 25), e.g. '1,4'. Look up IDs with get_manga_genres.
- `genres_exclude` (string): Comma-separated MAL genre IDs to exclude (max 25), e.g. '1,4'. Look up IDs with get_manga_genres.
- `letter` (string): Restrict results to entries whose title starts with this single letter.
- `limit` (integer): Max results per page (1-50).
- `magazines` (string): Comma-separated MAL magazine IDs to restrict to (max 25). Look up IDs with get_magazines.
- `max_score` (number): Maximum average MAL score (inclusive), 1-10.
- `min_score` (number): Minimum average MAL score (inclusive), 0-10.
- `order_by` (string): Field to order by.
- `page` (integer): 1-based page number for pagination (1-1000).
- `q` (string, required): Search query, e.g. a manga title.
- `score` (number): Restrict to entries with exactly this average score (rarely useful — prefer min_score/max_score for a range).
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
- `sort` (string): Sort direction.
- `start_date` (string): Only include entries whose start date is on or after this date (YYYY-MM-DD).
- `status` (string): Filter by publication status.
- `type` (array): Restrict to one or more publication types.
- `unapproved` (boolean): If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.

Output parameters:

- `page` (object)
- `results` (array)

### `get_anime` (~372 tokens)

Get anime details

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 `producers`/`licensors`/`streaming`/`opening_themes`/`ending_themes`/`trailer`/`favorites`/`moreinfo`/`explicit_genres`/`external` (no equivalent fields there) and ignores `sfw`/`sfw_strict` entirely.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `aired` (string)
- `airing` (boolean)
- `background` (string)
- `broadcast` (string)
- `demographics` (array)
- `duration` (string)
- `ending_themes` (array)
- `episodes` (integer)
- `explicit_genres` (array)
- `external` (array)
- `favorites` (integer)
- `genres` (array)
- `image_url` (string)
- `licensors` (array)
- `mal_id` (integer)
- `members` (integer)
- `moreinfo` (string)
- `opening_themes` (array)
- `popularity` (integer)
- `producers` (array)
- `rank` (integer)
- `rating` (string)
- `relations` (array)
- `score` (number)
- `scored_by` (integer)
- `season` (string)
- `source` (string)
- `status` (string)
- `streaming` (array)
- `studios` (array)
- `synopsis` (string)
- `themes` (array)
- `title` (string)
- `title_english` (string)
- `title_japanese` (string)
- `title_synonyms` (array)
- `trailer` (string)
- `type` (string)
- `url` (string)
- `year` (integer)

### `get_manga` (~280 tokens)

Get manga details

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 `favorites`/`explicit_genres`/`external` (no equivalent field there) and ignores `sfw`/`sfw_strict` entirely.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `authors` (array)
- `background` (string)
- `chapters` (integer)
- `demographics` (array)
- `explicit_genres` (array)
- `external` (array)
- `favorites` (integer)
- `genres` (array)
- `image_url` (string)
- `mal_id` (integer)
- `members` (integer)
- `popularity` (integer)
- `published` (string)
- `publishing` (boolean)
- `rank` (integer)
- `relations` (array)
- `score` (number)
- `scored_by` (integer)
- `serializations` (array)
- `status` (string)
- `synopsis` (string)
- `themes` (array)
- `title` (string)
- `title_english` (string)
- `title_japanese` (string)
- `title_synonyms` (array)
- `type` (string)
- `url` (string)
- `volumes` (integer)

### `get_anime_characters` (~51 tokens)

Get anime characters

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

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.

Output parameters:

- `characters` (array)

### `get_manga_characters` (~47 tokens)

Get manga characters

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

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.

Output parameters:

- `characters` (array)

### `get_anime_episodes` (~89 tokens)

Get anime episodes

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `page` (integer): 1-based page number for pagination (1-1000).

Output parameters:

- `episodes` (array)
- `page` (object)

### `get_anime_videos` (~107 tokens)

Get anime videos

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.

Output parameters:

- `episodes` (array)
- `music_videos` (array)
- `promo` (array)

### `get_anime_recommendations` (~297 tokens)

Get anime recommendations

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 ordering/counts may differ slightly from Tenrai's, and `sfw`/`sfw_strict` are ignored entirely).

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `recommendations` (array)

### `get_recent_anime_recommendations` (~241 tokens)

Get recent anime recommendations

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.

Input parameters:

- `limit` (integer): Max results per page (1-100).
- `page` (integer): 1-based page number for pagination (1-1000).
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `page` (object)
- `results` (array)

### `get_anime_reviews` (~310 tokens)

Get anime reviews

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `limit` (integer): Max results per page (1-50).
- `page` (integer): 1-based page number for pagination (1-1000).
- `preliminary` (string): Filter by preliminary. 'true' includes them alongside other reviews (default), 'false' excludes them, 'only' returns exclusively preliminary reviews.
- `sentiment` (string): Restrict to reviews with this overall sentiment tag. Omit for all sentiments.
- `sort` (string): Sort order. Defaults to most_helpful (Tenrai's own default) when omitted.
- `spoilers` (string): Filter by spoiler. 'true' includes them alongside other reviews (default), 'false' excludes them, 'only' returns exclusively spoiler reviews.

Output parameters:

- `reviews` (array)

### `get_manga_recommendations` (~297 tokens)

Get manga recommendations

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 ordering/counts may differ slightly from Tenrai's, and `sfw`/`sfw_strict` are ignored entirely).

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `recommendations` (array)

### `get_recent_manga_recommendations` (~241 tokens)

Get recent manga recommendations

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.

Input parameters:

- `limit` (integer): Max results per page (1-100).
- `page` (integer): 1-based page number for pagination (1-1000).
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `page` (object)
- `results` (array)

### `get_manga_reviews` (~310 tokens)

Get manga reviews

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `limit` (integer): Max results per page (1-50).
- `page` (integer): 1-based page number for pagination (1-1000).
- `preliminary` (string): Filter by preliminary. 'true' includes them alongside other reviews (default), 'false' excludes them, 'only' returns exclusively preliminary reviews.
- `sentiment` (string): Restrict to reviews with this overall sentiment tag. Omit for all sentiments.
- `sort` (string): Sort order. Defaults to most_helpful (Tenrai's own default) when omitted.
- `spoilers` (string): Filter by spoiler. 'true' includes them alongside other reviews (default), 'false' excludes them, 'only' returns exclusively spoiler reviews.

Output parameters:

- `reviews` (array)

### `get_top_anime` (~397 tokens)

Get top anime

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 — `type`/`filter` are merged into one best-effort ranking, `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).

Input parameters:

- `filter` (string): Special ranking filter.
- `limit` (integer): Max results per page (1-50).
- `page` (integer): 1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog.
- `rating` (array): Restrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
- `type` (array): Restrict to one or more media types.

Output parameters:

- `page` (object)
- `results` (array)

### `get_top_manga` (~319 tokens)

Get top manga

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 — `type`/`filter` are merged into one best-effort ranking, `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).

Input parameters:

- `filter` (string): Special ranking filter.
- `limit` (integer): Max results per page (1-50).
- `page` (integer): 1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
- `type` (array): Restrict to one or more publication types.

Output parameters:

- `page` (object)
- `results` (array)

### `get_seasonal_anime` (~527 tokens)

Get seasonal anime

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`/`order_by`/`sort` are silently dropped (no equivalent there), `themes`/`demographics`/`broadcast` come back empty, an explicit `sfw: true` is enforced client-side (a filtered page can come back shorter than `limit`), and `sfw_strict` degrades to the same filtering as `sfw` there (no Ecchi-genre distinction available).

Input parameters:

- `continuing` (boolean): If true, also include TV series continuing from a previous season. Defaults to false.
- `filter` (array): Restrict to one or more media types.
- `kids` (boolean): If true, exclude entries tagged as children's/kids content. Defaults to false.
- `limit` (integer): Max results per page (1-50).
- `order_by` (string): Field to order by. Defaults to members.
- `page` (integer): 1-based page number for pagination (1-1000).
- `rating` (array): Restrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.
- `season` (string): Season name.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
- `sort` (string): Sort direction.
- `unapproved` (boolean): If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.
- `year` (integer): Four-digit year, e.g. 2024.

Output parameters:

- `page` (object)
- `results` (array)

### `get_anime_schedule` (~318 tokens)

Get broadcast schedule

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.

Input parameters:

- `day` (string): Weekday to filter by, or `unknown`/`other` for shows with no fixed weekly slot. Omit for the whole week.
- `kids` (boolean): If true, exclude entries tagged as children's/kids content. Defaults to false.
- `limit` (integer): Max results per page (1-50).
- `page` (integer): 1-based page number for pagination (1-1000).
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
- `unapproved` (boolean): If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.

Output parameters:

- `page` (object)
- `results` (array)

### `get_anime_genres` (~62 tokens)

Get anime genres

List anime genres/themes/demographics with their MAL IDs. Use this to discover the numeric IDs that the `genres` parameter of search_anime expects.

Input parameters:

- `filter` (string): Restrict to one kind of tag. Omit to list all.

Output parameters:

- `genres` (array)

### `get_manga_genres` (~62 tokens)

Get manga genres

List manga genres/themes/demographics with their MAL IDs. Use this to discover the numeric IDs that the `genres` parameter of search_manga expects.

Input parameters:

- `filter` (string): Restrict to one kind of tag. Omit to list all.

Output parameters:

- `genres` (array)

### `search_characters` (~134 tokens)

Search characters

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.

Input parameters:

- `letter` (string): Restrict results to entries whose title starts with this single letter.
- `limit` (integer): Max results per page (1-50).
- `order_by` (string): Field to order by.
- `page` (integer): 1-based page number for pagination (1-1000).
- `q` (string, required): Character name.
- `sort` (string): Sort direction.

Output parameters:

- `page` (object)
- `results` (array)

### `get_character` (~220 tokens)

Get character details

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `about` (string)
- `anime` (array)
- `favorites` (integer)
- `image_url` (string)
- `mal_id` (integer)
- `manga` (array)
- `name` (string)
- `name_kanji` (string)
- `nicknames` (array)
- `url` (string)
- `voice_actors` (array)

### `search_people` (~116 tokens)

Search people

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

Input parameters:

- `letter` (string): Restrict results to entries whose title starts with this single letter.
- `limit` (integer): Max results per page (1-50).
- `order_by` (string): Field to order by.
- `page` (integer): 1-based page number for pagination (1-1000).
- `q` (string, required): Person name.
- `sort` (string): Sort direction.

Output parameters:

- `page` (object)
- `results` (array)

### `get_person` (~270 tokens)

Get person details

Get full details for one person by mal_id: bio, their anime/manga staff positions and voiced roles (capped to the first 50 for prolific people, 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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `about` (string)
- `alternate_names` (array)
- `anime` (array)
- `birthday` (string)
- `family_name` (string)
- `favorites` (integer)
- `given_name` (string)
- `image_url` (string)
- `mal_id` (integer)
- `manga` (array)
- `name` (string)
- `url` (string)
- `voice_roles` (array)

### `get_anime_staff` (~68 tokens)

Get anime staff

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.

Output parameters:

- `staff` (array)

### `get_random_anime` (~162 tokens)

Get a random anime

Return one random anime (full details). Good for discovery / suggestions. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

Input parameters:

- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `aired` (string)
- `airing` (boolean)
- `background` (string)
- `broadcast` (string)
- `demographics` (array)
- `duration` (string)
- `ending_themes` (array)
- `episodes` (integer)
- `explicit_genres` (array)
- `external` (array)
- `favorites` (integer)
- `genres` (array)
- `image_url` (string)
- `licensors` (array)
- `mal_id` (integer)
- `members` (integer)
- `moreinfo` (string)
- `opening_themes` (array)
- `popularity` (integer)
- `producers` (array)
- `rank` (integer)
- `rating` (string)
- `relations` (array)
- `score` (number)
- `scored_by` (integer)
- `season` (string)
- `source` (string)
- `status` (string)
- `streaming` (array)
- `studios` (array)
- `synopsis` (string)
- `themes` (array)
- `title` (string)
- `title_english` (string)
- `title_japanese` (string)
- `title_synonyms` (array)
- `trailer` (string)
- `type` (string)
- `url` (string)
- `year` (integer)

### `get_random_manga` (~162 tokens)

Get a random manga

Return one random manga (full details). Good for discovery / suggestions. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

Input parameters:

- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `authors` (array)
- `background` (string)
- `chapters` (integer)
- `demographics` (array)
- `explicit_genres` (array)
- `external` (array)
- `favorites` (integer)
- `genres` (array)
- `image_url` (string)
- `mal_id` (integer)
- `members` (integer)
- `popularity` (integer)
- `published` (string)
- `publishing` (boolean)
- `rank` (integer)
- `relations` (array)
- `score` (number)
- `scored_by` (integer)
- `serializations` (array)
- `status` (string)
- `synopsis` (string)
- `themes` (array)
- `title` (string)
- `title_english` (string)
- `title_japanese` (string)
- `title_synonyms` (array)
- `type` (string)
- `url` (string)
- `volumes` (integer)

### `get_upcoming_season` (~475 tokens)

Get upcoming season anime

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`/`order_by`/`sort` are silently dropped (no equivalent there), `themes`/`demographics`/`broadcast` come back empty, an explicit `sfw: true` is enforced client-side (a filtered page can come back shorter than `limit`), and `sfw_strict` degrades to the same filtering as `sfw` there (no Ecchi-genre distinction available).

Input parameters:

- `continuing` (boolean): If true, also include TV series continuing from a previous season. Defaults to false.
- `filter` (array): Restrict to one or more media types.
- `kids` (boolean): If true, exclude entries tagged as children's/kids content. Defaults to false.
- `limit` (integer): Max results per page (1-50).
- `order_by` (string): Field to order by. Defaults to members.
- `page` (integer): 1-based page number for pagination (1-1000).
- `rating` (array): Restrict to one or more specific content ratings. More granular than `sfw`/`sfw_strict` — use this to target a precise rating band instead of a blanket adult-content cutoff.
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.
- `sort` (string): Sort direction.
- `unapproved` (boolean): If true, also include entries not yet approved by MAL's moderators (excluded by default). Defaults to false.

Output parameters:

- `page` (object)
- `results` (array)

### `get_anime_statistics` (~89 tokens)

Get anime statistics

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.

Output parameters:

- `completed` (integer)
- `dropped` (integer)
- `on_hold` (integer)
- `plan_to_read` (integer)
- `plan_to_watch` (integer)
- `reading` (integer)
- `scores` (array)
- `total` (integer)
- `watching` (integer)

### `get_manga_statistics` (~78 tokens)

Get manga statistics

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.

Output parameters:

- `completed` (integer)
- `dropped` (integer)
- `on_hold` (integer)
- `plan_to_read` (integer)
- `plan_to_watch` (integer)
- `reading` (integer)
- `scores` (array)
- `total` (integer)
- `watching` (integer)

### `get_producers` (~133 tokens)

Get producers/studios

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).

Input parameters:

- `letter` (string): Restrict results to entries whose title starts with this single letter.
- `limit` (integer): Max results per page (1-50).
- `order_by` (string): Field to order by.
- `page` (integer): 1-based page number for pagination (1-1000).
- `q` (string): Filter by name.
- `sort` (string): Sort direction.

Output parameters:

- `page` (object)
- `results` (array)

### `get_producer` (~64 tokens)

Get producer/studio details

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.

Output parameters:

- `about` (string)
- `count` (integer)
- `established` (string)
- `external` (array)
- `favorites` (integer)
- `image_url` (string)
- `mal_id` (integer)
- `name` (string)
- `url` (string)

### `get_magazines` (~145 tokens)

Get manga magazines

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.

Input parameters:

- `letter` (string): Restrict results to entries whose title starts with this single letter.
- `limit` (integer): Max results per page (1-100).
- `order_by` (string): Field to order by.
- `page` (integer): 1-based page number for pagination (1-1000).
- `q` (string): Filter by name.
- `sort` (string): Sort direction.

Output parameters:

- `page` (object)
- `results` (array)

### `get_top_people` (~86 tokens)

Get top people

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

Input parameters:

- `limit` (integer): Max results per page (1-50).
- `page` (integer): 1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog.

Output parameters:

- `page` (object)
- `results` (array)

### `get_top_characters` (~81 tokens)

Get top characters

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

Input parameters:

- `limit` (integer): Max results per page (1-50).
- `page` (integer): 1-based page number for pagination. No upper bound — this ranking runs to the end of MAL's own catalog.

Output parameters:

- `page` (object)
- `results` (array)

### `get_seasons_list` (~34 tokens)

List available seasons

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

Output parameters:

- `seasons` (array)

### `get_random_character` (~43 tokens)

Get a random character

Return one random character (full details). Good for discovery / trivia. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

Output parameters:

- `about` (string)
- `anime` (array)
- `favorites` (integer)
- `image_url` (string)
- `mal_id` (integer)
- `manga` (array)
- `name` (string)
- `name_kanji` (string)
- `nicknames` (array)
- `url` (string)
- `voice_actors` (array)

### `get_random_person` (~50 tokens)

Get a random person

Return one random person — voice actor, director, author (full details). Good for discovery / trivia. No official-API fallback exists for this tool — it always needs Tenrai itself to be reachable.

Output parameters:

- `about` (string)
- `alternate_names` (array)
- `anime` (array)
- `birthday` (string)
- `family_name` (string)
- `favorites` (integer)
- `given_name` (string)
- `image_url` (string)
- `mal_id` (integer)
- `manga` (array)
- `name` (string)
- `url` (string)
- `voice_roles` (array)

### `get_anime_news` (~262 tokens)

Get anime news

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `page` (integer): 1-based page number for pagination (1-1000).
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `page` (object)
- `results` (array)

### `get_manga_news` (~262 tokens)

Get manga news

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.

Input parameters:

- `id` (integer, required): MyAnimeList numeric ID.
- `page` (integer): 1-based page number for pagination (1-1000).
- `sfw` (boolean): If true, exclude adult/explicit-rated entries (R+ Mild Nudity and up). Defaults to false (no filtering). Note: this alone still allows mainstream, safely-rated shows tagged with the Ecchi genre (fans…
- `sfw_strict` (boolean): If true, exclude adult/explicit-rated entries AND anything tagged with the Ecchi genre, even otherwise-mainstream/safely-rated shows. Stricter than `sfw` alone. Defaults to false.

Output parameters:

- `page` (object)
- `results` (array)

### `get_news` (~169 tokens)

Get anime/manga news

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.

Input parameters:

- `limit` (integer): Max results per page (1-50).
- `page` (integer): 1-based page number for pagination (1-1000).
- `q` (string): Search query, e.g. a keyword or title. Verified live to search beyond just the headline (a real, unfamiliar-sounding title can still match) — don't assume a result's title visibly contains the term.
- `tag` (string): Filter by topic tag.

Output parameters:

- `page` (object)
- `results` (array)

### `get_my_user_info` (~58 tokens)

Get my MAL profile

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.

Output parameters:

- `anime_statistics` (object)
- `id` (integer)
- `joined_at` (string)
- `location`
- `name` (string)

### `get_my_anime_list` (~97 tokens)

Get my anime list

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

Input parameters:

- `limit` (integer): Max results (1-100).
- `offset` (integer): Offset for pagination.
- `sort` (string): Sort order. list_score/list_updated_at return highest/most-recent first; anime_title returns A-Z.
- `status` (string): List status bucket.

Output parameters:

- `has_next_page` (boolean)
- `items` (array)

### `get_my_manga_list` (~94 tokens)

Get my manga list

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

Input parameters:

- `limit` (integer): Max results (1-100).
- `offset` (integer): Offset for pagination.
- `sort` (string): Sort order. list_score/list_updated_at return highest/most-recent first; manga_title returns A-Z.
- `status` (string): List status bucket.

Output parameters:

- `has_next_page` (boolean)
- `items` (array)

### `update_my_anime_status` (~335 tokens)

Update my anime status

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.

Input parameters:

- `anime_id` (integer, required): MyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or…
- `comments` (string): Free-text comments.
- `finish_date` (string): Date as YYYY-MM-DD.
- `is_rewatching` (boolean): Whether currently rewatching.
- `num_times_rewatched` (integer): Times rewatched.
- `num_watched_episodes` (integer): Episodes watched. Note: get_my_anime_list returns this same value as `num_episodes_watched` — the field name is intentionally different here.
- `priority` (integer): List priority: 0 = low, 1 = medium, 2 = high.
- `rewatch_value` (integer): Rewatch/reread value: 0 = none … 5 = very high.
- `score` (integer): Score 0-10 (0 clears the score).
- `start_date` (string): Date as YYYY-MM-DD.
- `status` (string): List status bucket.
- `tags` (string): Comma-separated free-text tags.

Output parameters:

- `score` (integer)
- `status` (string)

### `update_my_manga_status` (~292 tokens)

Update my manga status

Add or update a manga on the authenticated user's list (status, score, chapters/volumes read). 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.

Input parameters:

- `comments` (string): Free-text comments.
- `is_rereading` (boolean): Whether currently rereading.
- `manga_id` (integer, required): MyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or…
- `num_chapters_read` (integer): Chapters read.
- `num_times_reread` (integer): Times reread.
- `num_volumes_read` (integer): Volumes read.
- `priority` (integer): List priority: 0 = low, 1 = medium, 2 = high.
- `reread_value` (integer): Rewatch/reread value: 0 = none … 5 = very high.
- `score` (integer): Score 0-10 (0 clears the score).
- `status` (string): List status bucket.
- `tags` (string): Comma-separated free-text tags.

Output parameters:

- `score` (integer)
- `status` (string)

### `delete_my_anime_list_item` (~165 tokens)

Remove anime from my list

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.

Input parameters:

- `anime_id` (integer, required): MyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or…

Output parameters:

- `anime_id` (integer)
- `deleted` (boolean)

### `delete_my_manga_list_item` (~165 tokens)

Remove manga from my list

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.

Input parameters:

- `manga_id` (integer, required): MyAnimeList numeric ID of the target entry. (The read tools call this same id `id`; it's named anime_id/manga_id here to match MAL's own write endpoints.) Obtain it from search_anime/search_manga, or…

Output parameters:

- `deleted` (boolean)
- `manga_id` (integer)

### `login_mal` (~138 tokens)

Log in to MyAnimeList

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.

Output parameters:

- `authorize_url` (string)
- `auto_capture` (boolean)
- `instructions` (string)
- `redirect_uri` (string)

### `submit_mal_redirect` (~90 tokens)

Finish MyAnimeList login

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.

Input parameters:

- `redirect_url` (string, required): The full redirected URL (contains ?code=...), or just the code value.

Output parameters:

- `logged_in` (boolean)
- `message` (string)
- `user` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/grinv-mal-mcp/mal-mcp#diagnostics

## Score history

- 2026-08-03: 83
- 2026-08-02: 82
- 2026-08-01: 60
- 2026-07-31: 34
- 2026-07-30: 75
- 2026-07-29: 41
- 2026-07-28: 78
- 2026-07-27: 41
- 2026-07-26: 96

## Links

- npm package: https://www.npmjs.com/package/mal-mcp
- Socket report: https://socket.dev/npm/package/mal-mcp
- Repository: https://github.com/Grinv/mal-mcp
- Changelog RSS feed: https://verifymcp.io/servers/grinv-mal-mcp/mal-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/grinv-mal-mcp/mal-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/grinv-mal-mcp/mal-mcp
