mal-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HOST | No | Bind address. | 0.0.0.0 |
| PORT | No | HTTP listen port. | 8000 |
| MAL_CLIENT_ID | No | MyAnimeList API app Client ID, needed for the refresh grant. | |
| MAL_ACCESS_TOKEN | No | Static fallback access token (expires ~31 days). Used only when no Authorization header arrives and no refresh setup exists. | |
| MAL_CLIENT_SECRET | No | MyAnimeList API app Client Secret – required for 'Web'-type apps, omit for public clients. | |
| MAL_REFRESH_TOKEN | No | MyAnimeList OAuth refresh token (obtained once; see README). Enables self-renewing tokens. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_my_anime_listA | Fetch a page of the authenticated user's MyAnimeList anime list. Results are paged to keep responses bounded: use |
| get_user_statsA | Compute summary statistics over the authenticated user's entire anime list. Fetches the full list in one paginated pass and aggregates locally (no extra MAL calls). Returns a text digest plus structured content with: total_entries; status_distribution; scores (count/mean/median/1-10 histogram); episodes (total watched + estimated watch hours/days, using each show's average episode duration, ~24 min fallback); top_genres (top 15 with count and avg user score); media_type_distribution; release_decades; community_comparison (avg difference between the user's scores and MAL community means); top_studios (top 10). If the list exceeds the 20,000-entry fetch cap, "truncated": true and a warning are included. |
| search_animeA | Search MyAnimeList's public anime catalog by title. Returns a compact text table (id|title|year|type|mean|eps|genres) plus structured content {"count": int, "results": [...]} where each result has: id, title, picture, year, media_type, airing_status, mean (community score), num_episodes, genres, and a synopsis truncated to 300 characters. Use get_anime_detail for full information. |
| get_anime_detailA | Fetch full public details for one anime by its MAL id. Returns title(s), synopsis, community stats (mean, rank, popularity, list/scoring user counts, per-status statistics), airing info, source, rating, genres, studios, related_anime, and up to 10 community recommendations. If the anime is on the authenticated user's list, my_list_status (their status/score/progress) is included. |
| analyze_tasteA | Return the user's entire anime list in a compact, token-efficient text format. This tool performs NO analysis - it exports the raw data (grouped by watch status, sorted by the user's score) so the calling model can analyze taste, spot patterns, and craft recommendations. Line format: my_score|title|year|type|watched/total_eps| genres|mal_mean ('-' = not scored / unknown). Lists longer than the 20,000-entry fetch cap are exported partially, with a leading WARNING line. |
| search_mangaA | Search MyAnimeList's public manga catalog by title. Returns a compact text table (id|title|year|type|mean|chapters|genres) plus structured content {"count": int, "results": [...]} where each result has: id, title, picture, year, media_type (manga/novel/one_shot/...), publishing_status, mean (community score), num_chapters/num_volumes (0 = unknown/ongoing), genres, authors, and a synopsis truncated to 300 characters. Use get_manga_detail for full information. |
| get_manga_detailA | Fetch full public details for one manga by its MAL id. Returns title(s), synopsis, community stats (mean, rank, popularity), publication info, chapter/volume counts, genres, authors, serialization magazines, related_manga/related_anime, and up to 10 community recommendations. If the manga is on the authenticated user's list, my_list_status is included. |
| get_my_manga_listC | Fetch a page of the authenticated user's MyAnimeList manga list. |
| get_anime_rankingA | Fetch MAL's official anime rankings. ranking_type: all (top by score), airing, upcoming, tv, ova, movie, special, bypopularity, favorite. Returns a compact text table plus structured content {"ranking_type", "total_returned", "offset", "has_more", "entries"}; each entry: rank, previous_rank, id, title, picture, year, media_type, mean, num_list_users, num_episodes, airing_status, genres. |
| get_manga_rankingA | Fetch MAL's official manga rankings. ranking_type: all, manga, novels, oneshots, doujin, manhwa, manhua, bypopularity, favorite. Returns the same paged shape as get_anime_ranking; each entry: rank, previous_rank, id, title, picture, year, media_type, mean, num_list_users, num_chapters, publishing_status, authors, genres. |
| get_seasonal_animeA | Fetch the anime that aired in one broadcast season (winter/spring/summer/fall). Seasons: winter = Jan-Mar, spring = Apr-Jun, summer = Jul-Sep, fall = Oct-Dec. sort: anime_score (desc) or anime_num_list_users (desc). Returns a compact text table plus structured content {"year", "season", "total_returned", "offset", "has_more", "entries"} with compact anime entries (including picture). |
| get_suggested_animeA | Fetch MyAnimeList's personalized anime suggestions for the authenticated user. These are MAL's own recommendations based on the user's list (empty for accounts without watch history). Returns a compact text table plus structured content {"total_returned", "offset", "has_more", "results"} with the same compact shape as search_anime. |
| get_weekly_scheduleA | Your personal weekly airing calendar: which anime on your 'watching' list broadcast on each day of the week. Fetches your watching list, keeps only currently-airing shows, and groups them by
broadcast day. Times are shown in the Returns a per-day text digest plus structured content {"timezone", "today", "total", "days": [{"day", "entries": [...]}]}; each entry has id, title, picture, media_type, my_score, episodes_watched, total_episodes, broadcast_time. |
| get_my_profileA | Fetch the authenticated user's MAL profile and lifetime anime statistics. Returns id, name, picture, birthday, location, joined_at, time_zone, is_supporter, and anime_statistics (items/days per watch status, total episodes, rewatches, mean score). MAL only exposes this endpoint for the token's own account. |
| get_user_anime_listA | Fetch a page of ANOTHER MAL user's anime list (works only for public lists). Same paged shape as get_my_anime_list, plus "user_name" echoed in the response. A 403 usually means the user's list is private or the username does not exist. |
| get_user_manga_listA | Fetch a page of ANOTHER MAL user's manga list (works only for public lists). Same paged shape as get_my_manga_list, plus "user_name" echoed in the response. A 403 usually means the user's list is private or the username does not exist. |
| update_my_anime_entryA | Update the authenticated user's list entry for an anime (or ADD it to the list). Only the provided fields are changed; at least one is required. If the anime is not on the user's list yet, MAL creates the entry (e.g. pass status="plan_to_watch" to add something). Returns the updated my_list_status. |
| delete_my_anime_entryA | PERMANENTLY remove an anime from the authenticated user's list. This deletes the entry's score, progress, dates, and tags on MAL - it cannot be undone. MAL treats the delete as idempotent in practice (removing an entry that is already absent still succeeds); a 404 for an unknown id returns a clear message. |
| update_my_manga_entryA | Update the authenticated user's list entry for a manga (or ADD it to the list). Only the provided fields are changed; at least one is required. If the manga is not on the user's list yet, MAL creates the entry (e.g. pass status="plan_to_read" to add something). Returns the updated my_list_status. |
| delete_my_manga_entryA | PERMANENTLY remove a manga from the authenticated user's list. This deletes the entry's score, progress, dates, and tags on MAL - it cannot be undone. MAL treats the delete as idempotent in practice (removing an entry that is already absent still succeeds); a 404 for an unknown id returns a clear message. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| mal_app | Interactive UI for the MyAnimeList tools (MCP Apps). |
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