AI Manga & Anime Generator - Mangii MCP
Create manga and anime art from text. 24 styles, multi-panel stories, BYOK.
Should I use this
Quality & Safety
Findings (9)
- LOWin manga.list_styles
- LOWin manga.get_credits
- LOWin manga.list_panels
- LOWin manga.list_stories
- LOWin manga.create_story
- LOWin manga.continue_story
- LOWin manga.regenerate_panel
- LOWin manga.buy_credits
- LOWin manga.get_job
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"manga": {
"url": "https://mcp.mangii.ai/mcp"
}
}
}Remote endpoints
https://mcp.mangii.ai/mcpstreamable-httpWhat it can do
Tool inventory
Tools (9)
🟢manga.list_styles(group, limit)
List the 24 canonical Mangii art styles with live style ids. Call this before manga.create_story. Experimental and alias ids are excluded. Filter with group or limit when you only need one look.
Input Schema
{
"type": "object",
"properties": {
"group": {
"type": "string",
"enum": [
"shonen_action",
"modern_anime",
"romance_cute",
"dark_mature",
"webtoon_cultivation",
"painterly_artistic"
],
"description": "Optional style group. Example: shonen_action or painterly_artistic. Omit to return every selectable style."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 24,
"description": "Optional max number of styles to return after filtering. Example: 6."
}
}
}Output Schema
{
"type": "object",
"properties": {
"styles": {
"type": "array",
"description": "Selectable styles.",
"items": {
"type": "object",
"required": [
"id",
"name",
"group"
],
"properties": {
"id": {
"type": "string",
"description": "Pass this as style_id on manga.create_story. Example: classic_shonen."
},
"name": {
"type": "string",
"description": "Human display name. Example: Classic Action."
},
"group": {
"type": "string",
"description": "Picker group id. Example: shonen_action."
}
}
}
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
},
"required": [
"styles"
]
}🟢manga.get_credits(include_notes)
Return the API wallet. Spendable is apiPackCredits plus packCredits after the account has ever purchased. Later ad/referral grants on that pack pool also spend. weeklyCredits is display-only.
Input Schema
{
"type": "object",
"properties": {
"include_notes": {
"type": "boolean",
"description": "When true (default), include a notes string explaining that weeklyCredits does not spend on API or MCP."
}
}
}Output Schema
{
"type": "object",
"properties": {
"weeklyCredits": {
"type": "integer",
"description": "In-app weekly credits. Display-only for API/MCP."
},
"packCredits": {
"type": "integer",
"description": "In-app pack credits. After a purchase (hasEverPurchasedCredits), the full current balance is included in spendableCredits, including later ad/referral grants. Never-purchased pack balances do not spend."
},
"apiPackCredits": {
"type": "integer",
"description": "Spendable API credits for generate tools."
},
"spendableCredits": {
"type": "integer",
"description": "apiPackCredits plus packCredits when the account has ever purchased. Same number useApiCredit will spend."
},
"notes": {
"type": "string",
"description": "Wallet rules for agents."
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
}
}🟢manga.list_panels(story_id)
List panels you own for a story. Use this to get panel_id values before changing Image 1 or Image 2 on manga.continue_story or manga.regenerate_panel. Each row has ref_role: identity on the first panel, scene on the last distinct panel, otherwise null.
Input Schema
{
"type": "object",
"properties": {
"story_id": {
"type": "string",
"description": "Story id from manga.create_story. Example: a Firestore story document id returned as story_id."
}
},
"required": [
"story_id"
]
}Output Schema
{
"type": "object",
"properties": {
"story_id": {
"type": "string",
"description": "Story id from manga.create_story. Example: a Firestore story document id returned as story_id."
},
"panels": {
"type": "array",
"description": "Panels in reading order, with ids for identity_panel_id and continuity_panel_id.",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Panel id. Pass as identity_panel_id or continuity_panel_id."
},
"story_id": {
"type": "string",
"description": "Parent story id."
},
"order_index": {
"type": "integer",
"description": "Zero-based reading order. First panel is 0."
},
"image_url": {
"type": "string",
"description": "HTTPS URL of this panel image."
},
"prompt": {
"type": "string",
"description": "Stored user prompt for this panel."
},
"ref_role": {
"type": "string",
"description": "Default continue slot: identity, scene, or null if unused."
}
}
}
},
"hint": {
"type": "string",
"description": "How to override Image 1 and Image 2 on continue or regenerate."
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
},
"required": [
"panels"
]
}🟢manga.list_stories(limit)
List stories you own, newest first. Call this when you lost story_id after context compaction so you can resume with manga.continue_story. Optional limit is an integer from 1 to 50 (default 20).
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Max stories to return. Integer from 1 to 50. Default 20. Omit to use the default."
}
}
}Output Schema
{
"type": "object",
"properties": {
"stories": {
"type": "array",
"description": "Owned active stories, newest updated_at first.",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Story id. Pass as story_id on manga.continue_story."
},
"title": {
"type": [
"string",
"null"
],
"description": "Story title. Null when the story was never named."
},
"visibility": {
"type": "string",
"description": "private or public. Defaults to private."
},
"panelCount": {
"type": "integer",
"description": "How many panels this story currently has."
},
"style_id": {
"type": [
"string",
"null"
],
"description": "Locked art style id from create. Do not send it on continue."
},
"language": {
"type": [
"string",
"null"
],
"description": "Story language code when stored."
},
"created_at": {
"type": [
"string",
"null"
],
"description": "ISO created timestamp, or null if missing."
},
"updated_at": {
"type": [
"string",
"null"
],
"description": "ISO updated timestamp, or null if missing."
},
"cover_url": {
"type": [
"string",
"null"
],
"description": "Cover image HTTPS URL when the story has one."
}
}
}
},
"next_step": {
"type": "string",
"description": "What to call next. Follow this instead of guessing."
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
},
"required": [
"stories",
"next_step"
]
}⚪manga.create_story(prompt, style_id, quality, title, reference_image, ...)
Start a new private manga (panel 1). Required: prompt + style_id from manga.list_styles. Optional identity_image or reference_image is Image 1. Style locks. Default async=false returns image_url, story_id, panel_id. Then manga.continue_story. Costs 1/2/5 credits by quality.
Input Schema
{
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "Scene in everyday language: characters, place, action, mood, camera, weather, color or black-and-white. Example: \"A duel under cherry blossoms, low angle, rain, full color.\" Max 2000 characters."
},
"style_id": {
"type": "string",
"description": "Canonical style id from manga.list_styles. Example: classic_shonen or cinematic_anime. Locked after panel 0."
},
"quality": {
"type": "string",
"enum": [
"standard",
"hd",
"ultra"
],
"description": "Generation quality. standard costs 1 credit, hd 2, ultra 5. Default standard. HD/Ultra need an unlocked API wallet."
},
"title": {
"type": "string",
"description": "Optional story title shown in the library. Example: \"Rain Duel\". Omit to let Mangii name it."
},
"reference_image": {
"type": "string",
"description": "Optional first-panel identity photo. https URL or data URI. Alias of identity_image."
},
"identity_image": {
"type": "string",
"description": "Replacement photo: https URL or data:image/...;base64,... URI. Public hosts only. Same slot cannot also send a panel id."
},
"async": {
"type": "boolean",
"description": "On this MCP server the default is false: wait and return image_url in one call. Set true only if you will poll manga.get_job. HTTP API default remains async."
},
"idempotency_key": {
"type": "string",
"description": "Optional. Reuse the same key on retry so a timeout does not charge twice. 8-200 chars. Omit to mint a one-shot key (unsafe on retry).",
"minLength": 8,
"maxLength": 200
}
},
"required": [
"prompt",
"style_id"
]
}Output Schema
{
"type": "object",
"properties": {
"story_id": {
"type": "string",
"description": "Created or existing story id."
},
"panel_id": {
"type": "string",
"description": "Generated or regenerated panel id."
},
"image_url": {
"type": "string",
"description": "HTTPS URL of the finished panel when async is false and generation succeeded."
},
"job_id": {
"type": "string",
"description": "Async job id when async is true or the work is still running."
},
"request_id": {
"type": "string",
"description": "Request correlation id."
},
"credits_charged": {
"type": "integer",
"description": "API credits billed for a successful generation."
},
"credits_remaining": {
"type": "integer",
"description": "Remaining spendableCredits after the call (apiPack plus packCredits after a purchase)."
},
"quality": {
"type": "string",
"enum": [
"standard",
"hd",
"ultra"
],
"description": "Quality used for this generation."
},
"next_step": {
"type": "string",
"description": "What the agent should call next. Follow this instead of guessing."
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
},
"description": "Completed panel, accepted job, or tool error."
}🟡manga.continue_story(story_id, prompt, quality, identity_panel_id, identity_image, ...)
Add the next panel. Do not send style_id. Defaults: Image 1 = first panel (identity), Image 2 = last distinct panel (scene). Override via manga.list_panels then identity_panel_id or identity_image and/or continuity_panel_id or continuity_image. Same credit costs as create.
Input Schema
{
"type": "object",
"properties": {
"story_id": {
"type": "string",
"description": "Story id from manga.create_story. Example: a Firestore story document id returned as story_id."
},
"prompt": {
"type": "string",
"description": "Scene in everyday language: characters, place, action, mood, camera, weather, color or black-and-white. Example: \"A duel under cherry blossoms, low angle, rain, full color.\" Max 2000 characters."
},
"quality": {
"type": "string",
"enum": [
"standard",
"hd",
"ultra"
],
"description": "Generation quality. standard costs 1 credit, hd 2, ultra 5. Default standard. HD/Ultra need an unlocked API wallet."
},
"identity_panel_id": {
"type": "string",
"description": "Override Image 1 (identity) with this panel id from manga.list_panels. Do not also send identity_image."
},
"identity_image": {
"type": "string",
"description": "Replacement photo: https URL or data:image/...;base64,... URI. Public hosts only. Same slot cannot also send a panel id."
},
"reference_image": {
"type": "string",
"description": "Alias for identity_image. Replaces Image 1 with an uploaded photo or URL."
},
"continuity_panel_id": {
"type": "string",
"description": "Override Image 2 (scene) with this panel id from manga.list_panels. Do not also send continuity_image."
},
"continuity_image": {
"type": "string",
"description": "Replacement Image 2 (scene) photo: https URL or data URI. Do not also send continuity_panel_id."
},
"context_panel_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Legacy list override [identity_panel_id, scene_panel_id]. Ignored when identity_* or continuity_* fields are set. Prefer those named slots."
},
"async": {
"type": "boolean",
"description": "On this MCP server the default is false: wait and return image_url in one call. Set true only if you will poll manga.get_job. HTTP API default remains async."
},
"idempotency_key": {
"type": "string",
"description": "Optional. Reuse the same key on retry so a timeout does not charge twice. 8-200 chars. Omit to mint a one-shot key (unsafe on retry).",
"minLength": 8,
"maxLength": 200
}
},
"required": [
"story_id",
"prompt"
]
}Output Schema
{
"type": "object",
"properties": {
"story_id": {
"type": "string",
"description": "Created or existing story id."
},
"panel_id": {
"type": "string",
"description": "Generated or regenerated panel id."
},
"image_url": {
"type": "string",
"description": "HTTPS URL of the finished panel when async is false and generation succeeded."
},
"job_id": {
"type": "string",
"description": "Async job id when async is true or the work is still running."
},
"request_id": {
"type": "string",
"description": "Request correlation id."
},
"credits_charged": {
"type": "integer",
"description": "API credits billed for a successful generation."
},
"credits_remaining": {
"type": "integer",
"description": "Remaining spendableCredits after the call (apiPack plus packCredits after a purchase)."
},
"quality": {
"type": "string",
"enum": [
"standard",
"hd",
"ultra"
],
"description": "Quality used for this generation."
},
"next_step": {
"type": "string",
"description": "What the agent should call next. Follow this instead of guessing."
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
},
"description": "Completed panel, accepted job, or tool error."
}🟡manga.regenerate_panel(story_id, panel_id, prompt, quality, identity_panel_id, ...)
Redraw or edit one panel. Style stays locked. Same Image 1 / Image 2 ref overrides as manga.continue_story. Get ids from manga.list_panels. Costs the same credits as a new panel.
Input Schema
{
"type": "object",
"properties": {
"story_id": {
"type": "string",
"description": "Story id from manga.create_story. Example: a Firestore story document id returned as story_id."
},
"panel_id": {
"type": "string",
"description": "Panel id from a previous generate result or manga.list_panels. Example: the panel_id returned by manga.create_story."
},
"prompt": {
"type": "string",
"description": "Optional rewrite of the scene. Same prompt rules as create. Omit to retry the stored prompt."
},
"quality": {
"type": "string",
"enum": [
"standard",
"hd",
"ultra"
],
"description": "Generation quality. standard costs 1 credit, hd 2, ultra 5. Default standard. HD/Ultra need an unlocked API wallet."
},
"identity_panel_id": {
"type": "string",
"description": "Override Image 1 (identity) with this panel id from manga.list_panels. Do not also send identity_image."
},
"identity_image": {
"type": "string",
"description": "Replacement photo: https URL or data:image/...;base64,... URI. Public hosts only. Same slot cannot also send a panel id."
},
"reference_image": {
"type": "string",
"description": "Alias for identity_image. Replaces Image 1 with an uploaded photo or URL."
},
"continuity_panel_id": {
"type": "string",
"description": "Override Image 2 (scene) with this panel id from manga.list_panels. Do not also send continuity_image."
},
"continuity_image": {
"type": "string",
"description": "Replacement Image 2 (scene) photo: https URL or data URI. Do not also send continuity_panel_id."
},
"context_panel_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Legacy list override [identity_panel_id, scene_panel_id]. Ignored when identity_* or continuity_* fields are set. Prefer those named slots."
},
"async": {
"type": "boolean",
"description": "On this MCP server the default is false: wait and return image_url in one call. Set true only if you will poll manga.get_job. HTTP API default remains async."
},
"idempotency_key": {
"type": "string",
"description": "Optional. Reuse the same key on retry so a timeout does not charge twice. 8-200 chars. Omit to mint a one-shot key (unsafe on retry).",
"minLength": 8,
"maxLength": 200
}
},
"required": [
"story_id",
"panel_id"
]
}Output Schema
{
"type": "object",
"properties": {
"story_id": {
"type": "string",
"description": "Created or existing story id."
},
"panel_id": {
"type": "string",
"description": "Generated or regenerated panel id."
},
"image_url": {
"type": "string",
"description": "HTTPS URL of the finished panel when async is false and generation succeeded."
},
"job_id": {
"type": "string",
"description": "Async job id when async is true or the work is still running."
},
"request_id": {
"type": "string",
"description": "Request correlation id."
},
"credits_charged": {
"type": "integer",
"description": "API credits billed for a successful generation."
},
"credits_remaining": {
"type": "integer",
"description": "Remaining spendableCredits after the call (apiPack plus packCredits after a purchase)."
},
"quality": {
"type": "string",
"enum": [
"standard",
"hd",
"ultra"
],
"description": "Quality used for this generation."
},
"next_step": {
"type": "string",
"description": "What the agent should call next. Follow this instead of guessing."
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
},
"description": "Completed panel, accepted job, or tool error."
}🟢manga.buy_credits(quality)
Return the Console billing URL so a human can fund apiPackCredits. Generate-scoped keys cannot create Checkout sessions. Call this after 402 insufficient_credits.
Input Schema
{
"type": "object",
"properties": {
"quality": {
"type": "string",
"enum": [
"standard",
"hd",
"ultra"
],
"description": "Optional quality you plan to generate next. Included in the response as next_generation_credits so the human knows how many credits to buy."
}
}
}Output Schema
{
"type": "object",
"properties": {
"buy_url": {
"type": "string",
"description": "Absolute Console billing URL. Always https://mangii.ai/console/billing."
},
"credit_costs": {
"type": "object",
"description": "Credits charged per successful panel.",
"properties": {
"standard": {
"type": "integer"
},
"hd": {
"type": "integer"
},
"ultra": {
"type": "integer"
}
}
},
"next_generation_credits": {
"type": "integer",
"description": "Credits needed for the requested quality, or null if quality was omitted."
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
},
"required": [
"buy_url",
"credit_costs"
]
}🟢manga.get_job(job_id)
Poll a generation job from manga.create_story, manga.continue_story, or manga.regenerate_panel when async=true. Repeat until status is succeeded or failed. Prefer async=false so you do not need this tool.
Input Schema
{
"type": "object",
"properties": {
"job_id": {
"type": "string",
"description": "Job id from a previous generate result. Example: job_ab12cd34."
}
},
"required": [
"job_id"
]
}Output Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Job id."
},
"status": {
"type": "string",
"enum": [
"queued",
"running",
"succeeded",
"failed"
],
"description": "Job status."
},
"result": {
"type": "object",
"description": "Finished panel fields when status is succeeded."
},
"error": {
"type": "string",
"description": "Machine error code such as invalid_request, insufficient_credits, or quality_forbidden."
},
"next_step": {
"type": "string",
"description": "What to call next."
},
"message": {
"type": "string",
"description": "Human-readable error. Never includes stack traces or internal paths."
}
}
}Recommended Prompts
manga.get_creditsmanga.get_creditsmanga.list_stylesmanga.list_stylesmanga.list_stylesmanga.get_creditsCommunity
Evidence