mal-mcp
Provides tools to access and analyze a user's MyAnimeList data including watch list, scores, episode progress, and public anime catalog.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mal-mcpanalyze my anime taste"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
myanimelist-mcp
An MCP server that exposes your MyAnimeList data — watch list, scores, progress, rankings, recommendations — as tools, plus a premium MCP Apps UI that renders those results as an interactive, anime-styled interface right inside the chat. Any assistant that speaks MCP can analyze your taste, browse seasons, and edit your list; on hosts that support MCP Apps it does so through the UI below.
Python 3.12 · FastMCP 3 (stdio) · React + Vite for the UI.
Installation
Requires uv. No clone, no build, no Docker.
uvx myanimelist-mcpThe server speaks MCP over stdio: it prints nothing and waits on stdin for JSON-RPC, so
running it by hand looks like a hang — that is correct behaviour. Your MCP client is what
launches it. Add it to your client config — macOS
~/Library/Application Support/Claude/claude_desktop_config.json,
Windows %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"myanimelist": {
"command": "uvx",
"args": ["myanimelist-mcp"],
"env": {
"MAL_CLIENT_ID": "your-client-id",
"MAL_CLIENT_SECRET": "your-client-secret",
"MAL_REFRESH_TOKEN": "your-refresh-token",
"MAL_TIMEZONE": "Europe/Istanbul"
}
}
}
}Then quit and reopen the client completely. See Authentication for how to get those credentials.
spawn uvx ENOENT? Desktop clients launch servers with a minimalPATHthat usually excludes~/.local/bin. Runwhich uvxand put the absolute path in"command".
Your credentials live in that file in plaintext, and stderr from this server is persisted by some clients (e.g.
~/Library/Logs/Claude/). Considerchmod 600on the config, and revoke the MAL token if you ever share logs.
For Claude Code:
claude mcp add --env MAL_CLIENT_ID=… --env MAL_REFRESH_TOKEN=… \
--transport stdio myanimelist -- uvx myanimelist-mcpPinning a version, or installing with pip instead:
uvx --from 'myanimelist-mcp==X.Y.Z' myanimelist-mcp
pip install myanimelist-mcp # then "command": "myanimelist-mcp"
# or "command": "python", "args": ["-m", "mal_mcp"]Related MCP server: mal-mcp
The interface
Each read tool ships a ui:// app resource alongside its text summary, so hosts that support
MCP Apps render the result as a
live view. The model still receives the compact text summary; the full data travels to the
iframe as structured content. Where the host has no MCP Apps support, the tools degrade to
those text summaries and everything still works.




The detail and list views edit your MAL entries in place (status / score / progress) and navigate between titles — all through the same tools, so nothing UI-only happens behind the model's back. The theme follows the host's light/dark mode; cover art loads from MAL's CDN.
Tools
Anime
Tool | Description |
| A page of your list: title, cover, watch status, score, episode progress, genres, community mean, studios. |
| Locally computed summary: status/score/genre/media-type/decade distributions, total episodes, estimated watch time, user-vs-community score deviation, top studios. |
| Public catalog search (compact results with covers, truncated synopsis). |
| Full public detail incl. related anime, recommendations, statistics, and your own list entry if present. |
| Token-efficient raw export of the whole list (grouped by status, sorted by score) for the calling model to analyze — this tool itself performs no analysis. |
Manga
Tool | Description |
| Public manga catalog search (chapters/volumes, authors, genres). |
| Full manga detail incl. authors, serialization magazines, related works, recommendations, and your own entry if present. |
| A page of your manga list with chapter/volume progress. |
Discovery
Tool | Description |
| MAL's official rankings: all, airing, upcoming, tv, ova, movie, special, bypopularity, favorite. |
| Manga rankings: all, manga, novels, oneshots, doujin, manhwa, manhua, bypopularity, favorite. |
| Anime of one broadcast season (winter/spring/summer/fall). |
| MAL's personalized suggestions for the authenticated user. |
| Your personal weekly airing calendar: the currently-airing anime on your |
Users
Tool | Description |
| Your profile + lifetime anime statistics. MAL exposes this only for |
| Another user's public anime list (403 usually = private list or unknown user). |
| Another user's public manga list. |
Write tools — these modify your MAL list
Tool | Description |
| Update score/status/episode progress/tags — or add the anime to the list. Only provided fields change. |
| Permanently remove an anime from the list (cannot be undone). |
| Same as the anime variant, with chapter/volume progress. |
| Permanently remove a manga from the list. |
Aggregate tools (get_user_stats, analyze_taste) fetch the entire list in one paginated
pass (safety cap: 20,000 entries — beyond that a truncated/WARNING marker is included).
paging.next URLs are validated (https + api.myanimelist.net) before being followed, so
the bearer token can never be sent elsewhere. Verified MAL API facts (fields syntax,
pagination, limits, error shapes) are documented in NOTES.md.
Development
uv sync # install Python dependencies
uv run pytest # unit tests (pure helpers, no network)
uv run myanimelist-mcp # run the server over stdio (waits on stdin for JSON-RPC)Building the UI
The server runs without the UI bundle (it serves a small placeholder), so a clone never needs Node. To build the real interface:
cd ui
npm ci
npm run build # emits src/mal_mcp/ui/dist/index.html (a single self-contained file)For UI development without a host, npm run dev in ui/ renders every view with fixture
data and a view switcher — the screenshots above are those views.
Released wheels always ship a freshly built bundle: .github/workflows/publish.yml builds it
before uv build and fails the release if it is missing.
Authentication
The server needs a MyAnimeList access token and stores nothing on disk. Set the credentials in
the "env" block of your MCP client config, in one of two ways (this is the precedence order):
MAL_REFRESH_TOKEN(+MAL_CLIENT_ID,MAL_CLIENT_SECRET) — recommended. The server mints and renews access tokens itself via the OAuthrefresh_tokengrant, in memory only. Set up once, no monthly re-pasting.MAL_ACCESS_TOKEN— a static token (expires ~31 days); simplest for a quick test.
Getting a MAL token
Create an API app at https://myanimelist.net/apiconfig → Create ID, App Type:
Web(this is what makes MAL issue a Client Secret). Set the redirect URL to your OAuth callback, or a localhost URL likehttp://localhost:8080/callbackfor the manual flow.MAL uses
plainPKCE only (noS256), so the code verifier and challenge are the same string. Obtain a token once:
# 1) code verifier (43-128 chars); challenge == verifier for plain PKCE
VERIFIER=$(python3 -c "import secrets; print(secrets.token_urlsafe(64)[:100])")
# 2) open in a browser, log in, approve — you get ?code=<CODE> at your redirect URL:
# https://myanimelist.net/v1/oauth2/authorize?response_type=code&client_id=<CLIENT_ID>&code_challenge=$VERIFIER&code_challenge_method=plain&state=x&redirect_uri=<URL_ENCODED_REDIRECT_URL>
# 3) exchange the code for tokens:
curl -s https://myanimelist.net/v1/oauth2/token \
-d client_id=<CLIENT_ID> -d client_secret=<CLIENT_SECRET> \
-d grant_type=authorization_code -d code=<CODE> \
-d code_verifier=$VERIFIER -d redirect_uri=<REDIRECT_URL>
# → {"token_type":"Bearer","expires_in":2678400,"access_token":"...","refresh_token":"..."}Keep the refresh_token for MAL_REFRESH_TOKEN (option 1), or the access_token for
MAL_ACCESS_TOKEN (option 2).
Environment variables
Variable | Default | Purpose |
| (unset) | Enables self-renewing tokens via the |
| (unset) | MAL app Client ID, for the refresh grant. |
| (unset) | MAL app Client Secret — required for "Web"-type apps. |
| (unset) | Static fallback token (expires ~31 days). |
| (unset → JST) | Default IANA timezone for |
Project layout
src/mal_mcp/
├── server.py # FastMCP app, token helper, 20 tools, stats/format/summary helpers
├── mal_client.py # MAL API wrapper: fields, pagination (paging.next), retries, error mapping
├── token_manager.py# self-renewing OAuth refresh_token grant (in-memory)
├── __main__.py # `python -m mal_mcp`
└── ui/ # MCP Apps layer: ui:// resource + meta/ToolResult helpers
└── dist/ # built single-file HTML bundle (gitignored; built by CI for releases)
ui/ # Vite + React + TypeScript app (motion animations, 6 views)
tests/ # offline unit tests (pure helpers, token manager, UI contract)
NOTES.md # verified MAL API / FastMCP factsThe PyPI distribution is myanimelist-mcp; the import package is mal_mcp.
License
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityCmaintenanceA smart AniList integration for the Model Context Protocol that provides AI assistants with tools for searching media, managing watchlists, and analyzing user anime or manga tastes. It goes beyond basic API calls by offering personalized recommendations, taste comparisons, and natural language profile summaries.Last updated2551253MIT
- Alicense-qualityDmaintenanceA 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.Last updated525MIT
- AlicenseBqualityDmaintenanceMCP Server for interacting with the MyAnimeList API, allowing LLM clients to access and interact with anime, manga and more.Last updated152MIT
- FlicenseAqualityDmaintenanceEnables AI assistants to interact with MyAnimeList user accounts for list management, progress tracking, and personalized anime recommendations.Last updated11
Related MCP Connectors
AniList MCP — wraps AniList GraphQL API (free, no auth)
Access and interact with anime and manga data seamlessly. Retrieve detailed information about your…
AnimeQuotes MCP — wraps animechan.io (free, no auth)
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/UmutKDev/myanimelist-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server