# ZenCreator MCP — Full documentation > Drive ZenCreator AI image & video generation from any MCP client. # Overview Source: https://mcp.zencreator.pro/docs/index.md # ZenCreator MCP Server ZenCreator is an AI image and video generation platform. The ZenCreator MCP server lets any MCP client — Claude.ai, Claude Desktop, Claude Code, Cursor, ChatGPT — drive ZenCreator on your behalf: generate images and video, edit and composite with reference images, face-swap, upscale, lip-sync, animate photos, browse templates, and manage your assets and credits. It exposes a family of `zencreator_*` tools that proxy the ZenCreator API, so your AI client can run real generation jobs from inside a chat. ## Why it's different Most MCP servers are something you install and run locally, wired up with an API key you paste into a config file. ZenCreator's MCP is the opposite: a **hosted, remote server secured with OAuth 2.1**. Connecting means: - **Add one URL** — `https://mcp.zencreator.pro/mcp`. - **Log in once** in your browser. You approve a consent screen; that's it. - **No API keys** to paste, nothing to install, no local process to run. - **Tokens are automatic** — your client stores the token and refreshes it for you. You need a ZenCreator account at [app.zencreator.pro](https://app.zencreator.pro). You log in with it during the OAuth flow. ## What you can make Each capability runs through a **generation tool** you pass to `zencreator_create_task` (named in parentheses). Full model details live in [Generation tools & models](./models.md). - **Generate images from text** (`by_prompt`) - **Edit and composite images with references** — the main, most flexible image tool (`image_editor`) - **Generate a new face from attributes** (`facegen`) - **Run a face + body reference batch through a preset** (`photoshoot`) - **Face-swap onto a photo** — image only (`faceswap`) - **Upscale an image to a higher resolution** (`upscaler`) - **Animate a photo into video, or text → video** (`videogen`, `text_to_video`) - **Replace a character in an existing video** (`video2video`) - **Lip-sync a talking head from audio + a first frame** (`lipsync`) - **Upscale a video** (`video_upscaler`) - **Stitch 2–5 video clips into one, with transitions** (`video_merger`) - **Browse and reuse templates** (presets with ready-to-submit inputs) ZenCreator also supports uncensored / NSFW generation, gated by account settings. See [Concepts](./concepts.md) for how the `nsfw_allowed` and `is_trusted` gates work. ## The connection in one line ``` https://mcp.zencreator.pro/mcp ``` Add that URL in your client, log in, and you're connected. See the [Quickstart](./quickstart.md) or pick your client below. ## Documentation map This page is the navigation hub. Every other page is linked here. ### Get started | Page | What it covers | | --- | --- | | [Quickstart](./quickstart.md) | Connect and run your first generation in a few minutes. | ### Connect your client | Page | What it covers | | --- | --- | | [Claude.ai (web)](./connect/claude-ai.md) | Add the connector in Settings and log in via OAuth. | | [Claude Code (CLI)](./connect/claude-code.md) | `claude mcp add`, scopes, and authenticating via `/mcp`. | | [Cursor](./connect/cursor.md) | Add the remote MCP server and complete the browser login. | | [ChatGPT](./connect/chatgpt.md) | Add a custom connector under Settings → Connectors. | ### Understand it | Page | What it covers | | --- | --- | | [Concepts](./concepts.md) | The two layers (MCP tools vs. generation tools), tasks and calls, assets, templates, credits, NSFW gates, and the response contract. | | [Workflows](./workflows.md) | End-to-end recipes: generate, edit, upscale, animate, lip-sync, and use templates. | | [Generation tools & models](./models.md) | Every `tool_name` value and its models, with prompt guidance. | ### Tool reference | Page | What it covers | | --- | --- | | [Generation & tasks](./tools/generation.md) | Discovery, pricing, and task-lifecycle tools (`create_task`, `run_and_wait`, `get_task`, and more). | | [Assets](./tools/assets.md) | Upload assets and fetch download / preview URLs. | | [Templates](./tools/templates.md) | List, fetch, use, and (where enabled) search templates. | | [Account](./tools/account.md) | Profile, credit balance, and transaction history. | ### Operate | Page | What it covers | | --- | --- | | [Troubleshooting](./troubleshooting.md) | Connection, auth, out-of-credits, and NSFW-gate fixes. | ## First steps New here? Start with the **[Quickstart](./quickstart.md)** — it walks you from adding the URL to running your first generation. If you already know which client you use, jump straight to its [connect guide](./connect/claude-code.md). --- # Quickstart Source: https://mcp.zencreator.pro/docs/quickstart.md # Quickstart Connect ZenCreator to your AI client and generate something in about two minutes. ZenCreator's MCP server is **hosted and remote**, secured with OAuth 2.1. Connecting means adding **one URL** and logging in once in your browser. There are no API keys to paste, nothing to install, and no local process to run — your client stores the token and refreshes it automatically. The single URL your client connects to: ``` https://mcp.zencreator.pro/mcp ``` ## Prerequisite A ZenCreator account at [https://app.zencreator.pro](https://app.zencreator.pro). You log in with it during the OAuth step below. Generation spends credits, so make sure you have a balance — top up at [https://app.zencreator.pro/billing](https://app.zencreator.pro/billing). ## Step 1 — Add the connector You only ever paste one URL: `https://mcp.zencreator.pro/mcp`. **Claude.ai (web) or Claude Desktop** — the most common path: 1. Open **Settings → Connectors**. 2. Choose **Add custom connector**. 3. Paste `https://mcp.zencreator.pro/mcp` and save. **Claude Code (CLI)** — one line: ```bash claude mcp add --transport http zencreator https://mcp.zencreator.pro/mcp ``` Using another client? See the per-client connect guides: - [Claude.ai](./connect/claude-ai.md) - [Claude Code](./connect/claude-code.md) - [Cursor](./connect/cursor.md) - [ChatGPT](./connect/chatgpt.md) ## Step 2 — Log in The first time your client uses the connector, it opens your browser to log in at ZenCreator. You approve a consent screen that grants the scopes `mcp.read` and `mcp.generate`, and the client stores the resulting token — refreshing it automatically from then on. **No API keys.** You log in once. You will not be asked again unless you disconnect or your client needs to re-authenticate. ## Step 3 — Your first generation Ask your agent in plain language. For example: > Use ZenCreator to generate an image of a red fox in a snowy forest at dawn. Check my credits and the price first. A well-behaved agent will run roughly this chain: 1. **Check credits** — calls `zencreator_get_me` to read your balance (and whether you are out of credits). 2. **Estimate price** — calls `zencreator_estimate_price` for the exact credit cost of this generation, and states it to you before committing. (If cost matters, it may call `zencreator_compare_prices` to shop models cheapest-first.) 3. **Generate** — calls `zencreator_create_task` (or `zencreator_run_and_wait`, which submits and blocks until the image is ready) with a generation tool such as `by_prompt` or `image_editor`. 4. **Show the result** — fetches the generated asset and shows you a preview inline in the chat. That is the standard rhythm for every job: check credits, estimate price, generate, show the result. For full step-by-step recipes (editing with references, face-swap, upscale, video, templates), see [Workflows](./workflows.md). ## What next - [Concepts](./concepts.md) — tasks, calls, assets, templates, credits, and the two tool layers (MCP tools vs. generation tools). - [Workflows](./workflows.md) — copy-paste recipes for common jobs. - [Generation tools reference](./tools/generation.md) — `zencreator_create_task` and the lifecycle tools in detail. - [Troubleshooting](./troubleshooting.md) — connection, login, out-of-credits, and NSFW gating fixes. --- # Claude.ai & Desktop Source: https://mcp.zencreator.pro/docs/connect/claude-ai.md # Connect from Claude.ai and Claude Desktop This guide connects the ZenCreator MCP server to **Claude.ai** (web) and **Claude Desktop**. Both use the same custom-connector flow: you add one URL and log in once in your browser. There are no API keys to paste and nothing to install — the ZenCreator MCP server is hosted and remote, secured with OAuth 2.1. Your Claude client stores the token and refreshes it automatically. New here? Start with the [Quickstart](../quickstart.md) or the [overview](../index.md). ## Prerequisite You need a ZenCreator account. Sign up or sign in at [https://app.zencreator.pro](https://app.zencreator.pro) — this is the account you'll log in with during the OAuth step below. Generation spends credits; top up at [https://app.zencreator.pro/billing](https://app.zencreator.pro/billing). The MCP endpoint you'll connect to: ``` https://mcp.zencreator.pro/mcp ``` ## Add the connector The flow is the same on Claude.ai and Claude Desktop: 1. Open **Settings → Connectors**. 2. Choose **Add custom connector**. 3. Paste the URL `https://mcp.zencreator.pro/mcp`. 4. Save. On first use, the client runs the OAuth login in your browser. > Older Claude Desktop builds used a config-file form instead of the Connectors UI; the server URL was the same value under `mcpServers`. If your build has the Connectors screen, prefer it. ## Log in (OAuth) On first use, your client discovers the server's protected-resource metadata and opens your browser to log in at ZenCreator. You'll see a consent screen requesting two scopes: - `mcp.read` — read your profile, tasks, assets, templates, and prices. - `mcp.generate` — submit generations on your behalf. Approve the consent screen. The client stores the resulting token and refreshes it automatically, so you only do this once. There are no API keys involved. (The server is an OAuth 2.1 Resource Server conforming to the MCP **2025-06-18** spec revision with audience-bound tokens.) ### The globe icon is cosmetic On Claude.ai, custom-URL connectors show a generic globe icon rather than a brand logo. Brand icons are only shown for directory connectors. This is purely cosmetic and does not affect the connection. ## Verify it works Once connected, ask your agent to check your account: > Run `zencreator_get_me` and tell me my credit balance. A working connection returns your profile, including your credit balance and flags like `nsfw_allowed`, `is_trusted`, and `out_of_credits`. If it answers, you're connected and authenticated. ## Troubleshooting - **Connector shows disconnected**, or tools fail with an auth error: reconnect / re-authenticate. Open **Settings → Connectors**, and reconnect the ZenCreator connector to run the browser login again. - For more, see [Troubleshooting](../troubleshooting.md). ## Next steps - [Quickstart](../quickstart.md) — your first generation. - [Concepts](../concepts.md) — tasks, calls, assets, templates, and credits. - [Generation tools reference](../tools/generation.md) — what you can pass to `zencreator_create_task`. - Other clients: [Claude Code](./claude-code.md) · [Cursor](./cursor.md) · [ChatGPT](./chatgpt.md). --- # Claude Code Source: https://mcp.zencreator.pro/docs/connect/claude-code.md # Connect from Claude Code (CLI) Connect the ZenCreator MCP server to the Claude Code CLI. ZenCreator's MCP is a **hosted, remote server secured with OAuth 2.1** — you add one URL and log in once in your browser. There are no API keys to paste, nothing to install, and no local process to run. Claude Code stores the token and refreshes it automatically. - MCP endpoint: `https://mcp.zencreator.pro/mcp` - Prerequisite: a ZenCreator account at (you log in with it during OAuth). ## 1. Add the server ```bash claude mcp add --transport http zencreator https://mcp.zencreator.pro/mcp ``` This registers a server named `zencreator` using the HTTP transport pointed at the remote endpoint. ### Choose a scope By default the server is added at the **local** scope (this project only). Use a flag to widen it: | Scope | Flag | Effect | | --- | --- | --- | | local | *(default)* | Available in the current project only. | | user | `--scope user` | Available across all your projects. | | project | `--scope project` | Shared with the project via a committed `.mcp.json`. | Example, available everywhere: ```bash claude mcp add --transport http --scope user zencreator https://mcp.zencreator.pro/mcp ``` ### JSON form To wire it up by hand (for example, `--scope project` writes this into `.mcp.json` at the project root): ```json { "mcpServers": { "zencreator": { "type": "http", "url": "https://mcp.zencreator.pro/mcp" } } } ``` ## 2. Authenticate (OAuth) Adding the server does not log you in. Until you authenticate, the server shows as **Needs authentication**. 1. Start Claude Code: ```bash claude ``` 2. Run the `/mcp` slash command. 3. Pick the `zencreator` server, then choose **Authenticate**. 4. Your browser opens to log in at ZenCreator. Approve the consent screen, which grants the scopes `mcp.read` and `mcp.generate`. 5. The token is stored by Claude Code and **refreshes automatically** — you should not need to log in again. The first connect can be slow while the client runs OAuth discovery and the login round-trip. To re-authenticate later (for example, after revoking access), run `/mcp` again and choose **Authenticate**. ## 3. Verify Check registration and auth status from the shell: ```bash claude mcp list ``` This shows the `zencreator` server and reports **Needs authentication** until you have logged in. Then confirm the tools actually work by asking your agent to call one. In a `claude` session, try: > Use ZenCreator to call `zencreator_get_me` and show my credit balance. or > List the ZenCreator generation tools with `zencreator_list_tools`. If `zencreator_get_me` returns your profile and credit balance, the connection is live. The `zencreator_*` tools are now available to your agent for generation, assets, templates, and account tasks. ## Manage the connection - **Status:** `claude mcp list` - **Re-authenticate:** run `/mcp` inside `claude`, pick `zencreator`, choose **Authenticate**. - **Remove:** ```bash claude mcp remove zencreator ``` ## Troubleshooting - **`claude mcp list` says "Needs authentication"** — you have added the server but not logged in. Run `/mcp` and authenticate. - **First call hangs or feels slow** — the first connect runs OAuth discovery plus the browser login; subsequent calls are fast. - **No ZenCreator account** — sign up at first; you log in with it during OAuth. See [Troubleshooting](../troubleshooting.md) for more. ## Next steps - [Quickstart](../quickstart.md) — your first generation, end to end. - [Documentation home](../index.md) — overview of the server and every page. - [Troubleshooting](../troubleshooting.md) — common connection and auth issues. --- # Cursor Source: https://mcp.zencreator.pro/docs/connect/cursor.md # Connect from Cursor Connect Cursor to the ZenCreator MCP server. It is a **hosted, remote** server secured with OAuth 2.1 — you add one URL and log in once in your browser. No API keys, nothing to install, no local process to run. Cursor handles the token (and its refresh) automatically. **Prerequisite:** a ZenCreator account at — you log in with it during the OAuth step. **MCP endpoint:** `https://mcp.zencreator.pro/mcp` ## Add the server In Cursor, add an MCP server pointing at the remote URL `https://mcp.zencreator.pro/mcp`. The JSON form is: ```json { "mcpServers": { "zencreator": { "url": "https://mcp.zencreator.pro/mcp" } } } ``` ## Log in (OAuth) OAuth login happens in your browser on first use. The first time Cursor calls a `zencreator_*` tool, it opens your browser, you log in at ZenCreator and approve a consent screen granting the scopes `mcp.read` + `mcp.generate`. Cursor stores the resulting token and refreshes it automatically — there are no API keys to paste. ## Verify Once the server is connected and you have logged in, ask Cursor's agent to list the available generation tools (this calls `zencreator_list_tools`), or to fetch your account profile and credit balance (`zencreator_get_me`). A successful response confirms the connection and that your token is valid. ## Next steps - [Quickstart](../quickstart.md) — your first generation, end to end. - [Overview](../index.md) — what the server does and how the pieces fit. - [Troubleshooting](../troubleshooting.md) — if connection, auth, or generation fails. --- # ChatGPT Source: https://mcp.zencreator.pro/docs/connect/chatgpt.md # Connect from ChatGPT Connect ChatGPT to the ZenCreator MCP server by adding one URL and logging in once with your browser. There are no API keys to paste, nothing to install, and no local process to run. ChatGPT handles the OAuth token and its refresh automatically. The ZenCreator MCP server is a **hosted, remote server secured with OAuth 2.1**. The only thing you add to ChatGPT is the endpoint URL below. ## Prerequisites - A ZenCreator account at [https://app.zencreator.pro](https://app.zencreator.pro). You log in with it during the OAuth step. - A ChatGPT plan and account that supports **custom MCP connectors**. Availability depends on your plan, and you may need to enable developer / connector access for your account first. ## The endpoint Add this URL as a custom MCP connector: ``` https://mcp.zencreator.pro/mcp ``` ## Add the connector > **Note:** ChatGPT's settings UI changes over time, and the exact menu labels and layout differ between plans, platforms, and releases. The steps below describe what to look for rather than an exact click path. If a label here does not match what you see, look for the equivalent **Connectors** / **custom connector** option. 1. Open ChatGPT **Settings**. 2. Look for **Connectors** (this is where custom MCP connectors live). If you do not see it, you may need to enable developer / connector access for your account first; this option also depends on your plan. 3. Choose to add a **custom connector** (sometimes shown as adding a connector by URL). 4. Paste the server URL: ``` https://mcp.zencreator.pro/mcp ``` 5. Save / add the connector. ## Log in (OAuth) The first time ChatGPT uses the connector, it runs the OAuth login in your browser: 1. ChatGPT discovers the server's protected-resource metadata and opens your browser. 2. Log in at ZenCreator. 3. Approve the consent screen. It grants the scopes `mcp.read` and `mcp.generate`. 4. ChatGPT stores the resulting token and refreshes it automatically. You do not paste anything back. No API keys are involved at any point. The server is an OAuth 2.1 Resource Server conforming to the MCP **2025-06-18** revision with audience-bound tokens. ## Verify it works Once the connector is added and you have logged in, ask ChatGPT to call a read-only tool, for example: > Use ZenCreator to show my account and credit balance. This calls `zencreator_get_me` and returns your profile, credit balance, and flags such as `nsfw_allowed`, `is_trusted`, and `out_of_credits`. If that succeeds, the connection is working. You can also ask: > List the ZenCreator generation tools and their prices. This calls `zencreator_list_tools`. ## Troubleshooting - **No Connectors option in Settings.** Custom MCP connectors depend on your plan, and you may need to enable developer / connector access. Check that your account and plan support custom connectors. - **Login window never finishes or tools fail with an auth error.** Re-run the connection so the browser OAuth login can complete, then approve the consent screen granting `mcp.read` and `mcp.generate`. - **Generation fails with an out-of-credits signal.** Top up at [https://app.zencreator.pro/billing](https://app.zencreator.pro/billing). The same `out_of_credits` flag is also visible via `zencreator_get_me`. For more, see the [troubleshooting guide](../troubleshooting.md). ## Next steps - [Quickstart](../quickstart.md) — your first generation, end to end. - [Documentation home](../index.md) — overview, concepts, and the full tool reference. --- # Concepts Source: https://mcp.zencreator.pro/docs/concepts.md # Concepts — the mental model This page explains how the ZenCreator MCP server is put together so you can reason about it before you start calling tools. Read it once and the [tool reference](./tools/generation.md), the [model catalog](./models.md), and the [workflows](./workflows.md) will all click into place. If you just want to connect and go, start with the [quickstart](./quickstart.md). --- ## MCP tools vs generation tools & models This is the single most important distinction in the whole product. There are **two layers**, and they use the word "tool" for different things. **Layer 1 — MCP tools.** These are the callable tools your AI client sees in its tool list. There are roughly 28 of them and every one is prefixed `zencreator_` (for example `zencreator_create_task`, `zencreator_list_tools`, `zencreator_get_me`). This is the API surface of the MCP server. It is documented across the reference pages under [`tools/`](./tools/generation.md): [generation](./tools/generation.md), [assets](./tools/assets.md), [templates](./tools/templates.md), and [account](./tools/account.md). **Layer 2 — generation tools & models.** These are *values you pass in*, not tools your client calls. When you submit a generation you call the MCP tool `zencreator_create_task` and pass a `tool_name` argument — and `tool_name` is a **generation tool** such as `by_prompt`, `image_editor`, `videogen`, `faceswap`, `upscaler`, or `lipsync`. Each generation tool exposes its own set of **models** (for example `by_prompt` offers models like `GENERAL_NSFW`, `SDXL_NSFW`, `NANO_BANANA`, `QWEN_IMAGE`, `SEEDREAM_5`, `WAN_2_7_IMAGE`, `FLUX_KLEIN_NSFW`). Generation tools and their models are documented in [`models.md`](./models.md). Put plainly: > `zencreator_create_task` is an **MCP tool**. `by_prompt` is a **generation tool** you pass to it > as `tool_name`. `SDXL_NSFW` is a **model** you pass to `by_prompt`. A typical flow touches both layers: 1. Discover what is available with the MCP tool `zencreator_list_tools` (lists generation tools, prices, and whether any are blocked). 2. Inspect one generation tool's exact inputs with `zencreator_get_tool_schema` — call this **before** you submit, so you know the schema, prompt guidance, and which models it supports. 3. Submit with `zencreator_create_task`, passing `tool_name` (the generation tool) plus its inputs. See [`tools/generation.md`](./tools/generation.md) for the MCP-tool side and [`models.md`](./models.md) for the generation-tool / model side. --- ## Tasks and calls Generation is organized as **tasks** and **calls**. - A **task** wraps **1 to 50** generation **calls**. Each call is one generation request (one `tool_name` + its inputs). Batching many calls into a single task is how you fan out variations or render a set of images in one submission. - Submitting is **asynchronous**. `zencreator_create_task` returns a **task id** immediately; the generation runs in the background. The task id is your handle for everything that follows. - Poll progress with `zencreator_get_task`. It returns the task and its calls with their statuses. `status='failed'` is terminal — read `calls[].error` for the reason and don't retry without confirming with the user. Use `zencreator_get_processing_tasks` for a cheap "is anything still running?" check. - **Per-call output is lazy.** On a polled task, each call's `output` field comes back `null` even after it completes. To get the actual result — including the generated **asset ids** — call `zencreator_get_call_result(call_id)` for that call. This is the **only** way to discover the asset ids a completed generation produced. - For a one-shot blocking flow, use `zencreator_run_and_wait`: it submits **and** blocks until the task reaches a terminal status, then auto-fetches the outputs and asset ids for you. This is the best choice for **images you want in the same turn**. Do **not** use it for **video** — video is too slow to block on; submit with `zencreator_create_task` and poll instead. The full pattern for fetching results: 1. `zencreator_create_task(tool_name, …)` → task id. 2. `zencreator_get_task(task_id)` until a call shows `status='completed'`. 3. `zencreator_get_call_result(call_id)` for each completed call → extract asset ids. See [`tools/generation.md`](./tools/generation.md) for parameters and the [workflows](./workflows.md) page for end-to-end recipes. --- ## Assets Both the **inputs** and the **outputs** of generation are **assets**, each identified by an immutable `asset_id`. An asset is a stored piece of media (image, video, or audio). Asset ids never change, so you can pass an output asset id straight back in as the input to another generation (face-swap a result, upscale it, animate it, and so on). - **Bring your own media** with `zencreator_upload_asset` — upload an image, video, or audio from a URL or base64, and get back an `asset_id` you can reference in generation inputs. - **Inspect** an asset's media type with `zencreator_get_asset`. - **Download the original** with `zencreator_get_asset_download_url` (single) or `zencreator_get_asset_download_urls` (batch) — these return short-lived presigned URLs to the full-resolution original. - **Preview** with `zencreator_get_asset_preview_url` (single) or `zencreator_get_asset_preview_urls` (batch) — these return a reduced-size web preview (a downscaled thumbnail, commonly WebP, **not** the original), and can additionally attach the preview image **inline** so it renders directly in the chat (see [Response format](#response-format) for the inline caps). See [`tools/assets.md`](./tools/assets.md) for full parameters. --- ## Templates (presets) A **template** (a.k.a. **preset**) is a pre-built set of generation inputs — a ready-made starting point you can submit as-is or tweak. - Browse with `zencreator_list_templates` (paginated). - Fetch one in full, including a ready-to-submit input, with `zencreator_get_template`. - Submit in one shot with `zencreator_use_template`: it fetches the template, merges any overrides you supply, and submits — no manual schema wrangling. **Optional semantic search** — on deployments that have the search subsystem enabled, three extra MCP tools are available: `zencreator_search_templates` (semantic + keyword search), `zencreator_get_template_card` (a synthesized summary card), and `zencreator_search_index_status` (a diagnostic). These **may not be available on every deployment** — if they don't appear in your client's tool list, the server you're connected to doesn't have search enabled; fall back to `zencreator_list_templates`. See [`tools/templates.md`](./tools/templates.md). --- ## Credits & pricing Generation spends **credits**. Cost varies by generation tool, model, resolution, and duration, and the numbers are backend-driven — so **never assume a price**. - **Estimate before you commit.** Call `zencreator_estimate_price` to get the exact credit cost of a specific candidate input, or `zencreator_compare_prices` to shop the cost across all models of a generation tool (cheapest first, sweeping resolutions where relevant). State the cost to the user before submitting. - **Running out is signaled, not silent.** If a generation runs out of credits the tool returns HTTP 402 with a structured signal: ```json { "error_code": "insufficient_credits", "out_of_credits": true, "purchase_url": "https://app.zencreator.pro/billing", "message": "You're out of ZenCreator credits. Top up at https://app.zencreator.pro/billing to keep generating." } ``` The same `out_of_credits` flag and `purchase_url` also appear in the `zencreator_get_me` payload, so "out of credits" reads identically whether you check ahead of time or hit it mid-generation. - **Top up** at [https://app.zencreator.pro/billing](https://app.zencreator.pro/billing). - Review spending history with `zencreator_list_credit_transactions` (paginated). For the pricing tools' parameters see [`tools/generation.md`](./tools/generation.md), and for fixing a stuck or out-of-credits state see [troubleshooting](./troubleshooting.md). --- ## NSFW & trusted accounts ZenCreator supports uncensored / NSFW generation. Two **account gates** govern access, both visible on your profile via `zencreator_get_me`: - **`nsfw_allowed`** — whether adult content is enabled on the account. If this is `false`, the fix is to **enable adult content in your ZenCreator account settings**, then retry. - **`is_trusted`** — whether the account has **Trusted Status**, which unlocks ZenCreator's extended capabilities: uncensored NSFW generation, 18+ templates and LoRAs, Face Swap tools, and more flexible generation options. An account becomes trusted **automatically after its first successful payment** (purchasing any credit pack in the Billing section); the status is then permanent. Trusted-only **models** are marked **(trusted)** in the [model catalog](./models.md) (for example `SDXL_NSFW`, `FLUX_KLEIN_NSFW`, `wan@2.7-nsfw`), and a few whole **tools** are trusted-only — `flux_klein_lora` and `text_to_video`. Without trusted status you can't use them. If your orchestrating client refuses to author explicit prompts, the optional `zencreator_craft_prompt` tool exists precisely for this: it delegates NSFW / model-specific prompt writing to an uncensored sidecar LLM and **spends no ZenCreator credits**. It is only present when the prompt-agent sidecar is configured on the deployment. See [`models.md`](./models.md) for which models are trusted-only and for per-model prompt guidance. --- ## Response format Every MCP tool follows the same response contract. - **`response_format` argument.** Each tool takes `response_format`, which is `"markdown"` (the default) or `"json"`. `markdown` gives a human-readable summary; `json` returns the full structured payload as text. - **`structuredContent` is always present.** Regardless of `response_format`, the tool also returns a complete machine-readable `structuredContent` object, so clients with output-schema support always get the full data. - **Truncation.** Responses larger than about **25,000 characters** are truncated, with a hint to paginate (use `limit` / `offset` — see [Pagination](#pagination)) or switch to `response_format: "json"` and ask for fewer fields. - **Inline previews.** The asset preview tools can additionally attach the preview image **inline** as an MCP image content block, so it renders in the chat. Inline caps: **2 MB per image** and **8 MB total per call**. Anything over a cap falls back to a URL with an `inline_skipped` note instead of being inlined. --- ## Pagination List tools (`zencreator_list_tasks`, `zencreator_list_templates`, `zencreator_list_credit_transactions`, …) share one pagination convention: - Inputs: `limit` (1–100, default 20) and `offset` (≥ 0, default 0). - Output envelope: ```json { "total": 0, "count": 0, "offset": 0, "items": [], "has_more": false, "next_offset": 20 } ``` To page forward, pass the returned `next_offset` back in as the next request's `offset`. `next_offset` is only present when `has_more` is `true`. --- ## How the work is split It helps to know which side does what. - **Your AI client / the LLM** interprets the user's intent and orchestrates: it decides which generation tool and model fit the request, drafts prompts, chains steps (generate → fetch result → upscale → animate), and decides when to confirm cost or risk with the user. - **The MCP server** structures the request, enforces the input schemas, prices the work, talks to the ZenCreator backend on the user's behalf, and returns structured results. It owns no creative judgment — it validates, executes, and reports. In practice that means: let the agent reason about *what* to make, but lean on `zencreator_get_tool_schema` for the exact shape of the request, `zencreator_estimate_price` / `zencreator_compare_prices` for what it costs, and `zencreator_get_call_result` for what came back. --- ## Next steps - [Quickstart](./quickstart.md) — connect and run your first generation. - [Workflows](./workflows.md) — end-to-end recipes (text→image, edit, face-swap, video, lip-sync). - [Generation tools & models](./models.md) — the `tool_name` values and their models. - [Tool reference](./tools/generation.md) — every `zencreator_*` MCP tool. - [Troubleshooting](./troubleshooting.md) — auth, credits, and common errors. - Connect guides: [Claude Code](./connect/claude-code.md) · [Claude.ai](./connect/claude-ai.md) · [Cursor](./connect/cursor.md) · [ChatGPT](./connect/chatgpt.md). --- # Workflows Source: https://mcp.zencreator.pro/docs/workflows.md # Workflows End-to-end recipes for driving ZenCreator from your AI client. Each recipe gives the goal, an example natural-language ask you can give your agent, and the ordered MCP-tool chain — naming the **generation tool** (the `tool_name` value) it submits to `zencreator_create_task`. > **Two layers, kept distinct.** The `zencreator_*` names below are **MCP tools** your client calls. The lowercase names like `by_prompt`, `image_editor`, `videogen` are **generation tools** you pass as the `tool_name` argument *into* `zencreator_create_task`. See [Concepts](./concepts.md) for the full distinction and [Models](./models.md) for the models each generation tool supports. > **Prices in these examples are illustrative.** Credit cost varies by generation tool, model, resolution, and duration, and is backend-driven. Always call `zencreator_estimate_price` (or `zencreator_compare_prices`) and state the cost before you submit. Never trust a remembered number. Reference pages used below: [Generation tools](./tools/generation.md) · [Assets](./tools/assets.md) · [Templates](./tools/templates.md) · [Models](./models.md). --- ## 1. Text → image from scratch (`by_prompt`) **Goal:** Generate a brand-new image from a text prompt. **Ask your agent:** *"Generate a wide cinematic shot of a neon-lit Tokyo alley at night, photoreal."* **Tool chain:** 1. `zencreator_list_tools` — confirm `by_prompt` is available and not blocked, and see its models and prices at a glance. 2. `zencreator_get_tool_schema` (for `by_prompt`) — read the input/output JSON Schema, the prompt guide, and per-model guidance. **Call this before submitting** so you build a valid input. Optionally `zencreator_get_model_prompt_guide` for a specific model's prompt tips. 3. `zencreator_estimate_price` — get the exact credit cost of your candidate input. State it to the user before confirming. To shop across models, use `zencreator_compare_prices` (cheapest first; it sweeps resolutions where relevant). 4. **Submit and wait.** For a single image this turn, `zencreator_run_and_wait` is best: it submits *and* blocks until the task reaches a terminal status, then auto-fetches outputs and asset ids. - Alternatively, the explicit path: `zencreator_create_task` (returns a task id) → poll `zencreator_get_task` until terminal → `zencreator_get_call_result` to fetch the call's full output and asset ids. **`zencreator_get_call_result` is required to discover generated asset ids** — per-call output on `zencreator_get_task` is lazy/null. 5. **Show or download the result.** `zencreator_get_asset_preview_url` returns a web preview (and can attach the image inline so it renders in chat). `zencreator_get_asset_download_url` returns a presigned link to the original. Use the `_urls` (batch) variants for multiple assets. --- ## 2. Edit / composite with a reference (`image_editor`) **Goal:** Edit, restyle, or composite using one or more reference images. `image_editor` is the main, most flexible image tool. **Ask your agent:** *"Take this product photo and place the bottle on a marble countertop with soft window light."* **Tool chain:** 1. `zencreator_upload_asset` — upload each reference image (from a URL or base64). Returns an `asset_id` you pass into the generation input. 2. `zencreator_get_tool_schema` (for `image_editor`) — see how to wire the reference `asset_id`(s) and prompt into the input, plus model guidance. 3. `zencreator_estimate_price` — confirm the cost for your chosen model and resolution. 4. `zencreator_create_task` with `tool_name: "image_editor"` — submit. (Image edits are usually fast enough for `zencreator_run_and_wait` if you want it inline.) 5. Fetch the result: `zencreator_get_call_result` for the asset ids, then `zencreator_get_asset_preview_url` / `zencreator_get_asset_download_url`. > Need a similar image *from* a reference rather than an edit? The `by_ref` tool (explicit-request-only; Seedream 5 Pro scene recreation / person swap) exists, but prefer `image_editor`. --- ## 3. Animate a photo → video (`videogen`) **Goal:** Turn a still image into a short video (or generate video from text). **Ask your agent:** *"Animate this portrait — gentle head turn and blinking, 5 seconds."* **Tool chain:** 1. `zencreator_upload_asset` — upload the source photo → `asset_id`. 2. `zencreator_get_tool_schema` (for `videogen`) — read the input shape (first frame asset, prompt, duration/resolution) and model guidance. 3. `zencreator_estimate_price` — video cost scales with duration and resolution; estimate before submitting. 4. `zencreator_create_task` with `tool_name: "videogen"` — submit and keep the returned task id. 5. **Poll, don't block.** `zencreator_get_task` to check status (or `zencreator_get_processing_tasks` for a cheap "anything still running?"). When terminal, `zencreator_get_call_result` to fetch the video asset id, then `zencreator_get_asset_download_url` / `zencreator_get_asset_preview_url`. > **Use `zencreator_create_task` + polling for video — not `zencreator_run_and_wait`.** Videos take roughly 60–180s and can exceed your client's transport timeout if you block on them. `run_and_wait` is for images. --- ## 4. Use a template / preset **Goal:** Start from a ready-made preset instead of authoring an input by hand. (A template is also called a preset.) **Ask your agent:** *"Find a cyberpunk portrait template and run it on my uploaded face."* **Tool chain:** 1. **Find the template.** `zencreator_list_templates` (paginated) to browse, or `zencreator_search_templates` for semantic + keyword search **if your deployment has the search subsystem enabled** (it may not be available on every deployment). 2. `zencreator_get_template` — fetch the full template, including its ready-to-submit input, so you can see exactly what it will run. 3. `zencreator_use_template` — one-shot: fetch the template, merge any overrides you supply (e.g. swap in your own reference `asset_id` or tweak the prompt), and submit in a single call. 4. Fetch the result the usual way: `zencreator_get_call_result` → `zencreator_get_asset_preview_url` / `zencreator_get_asset_download_url`. > If you uploaded a reference to use in the template, do `zencreator_upload_asset` first and pass the returned `asset_id` as an override. See [Templates tools](./tools/templates.md) for the full reference. --- ## 5. Quick recipes All of these follow the same backbone: **`zencreator_get_tool_schema` → `zencreator_estimate_price` → `zencreator_create_task` → `zencreator_get_call_result` → preview/download.** Only the `tool_name` (and which assets you upload) changes. | Goal | Generation tool (`tool_name`) | Inputs to prepare | |---|---|---| | Swap a face onto a photo (image only) | `faceswap` | Upload the target photo and the face source via `zencreator_upload_asset`. | | Upscale an image to higher resolution | `upscaler` | Upload (or reuse) the source image `asset_id`. | | Talking-head lip-sync | `lipsync` | Upload audio + a first-frame image; produces a talking head. | | Text → video | `text_to_video` | A text prompt only (no source image needed). **Trusted-only tool** — needs `is_trusted`. | | Stitch 2–5 clips into one video | `video_merger` | Upload each clip via `zencreator_upload_asset`; pass them as `clips[]` (each with its `source_duration_sec`, optional trims), plus `transition` / `fps`. The final assembly step after generating clips with `videogen` / `text_to_video`. | Reminders: - **Face-swap and upscaler are image-only** — for video, use `video2video` (replace a character in a video) or `video_upscaler` instead. - **`lipsync`, `text_to_video`, and any video output take 60–180s** — submit with `zencreator_create_task` and poll `zencreator_get_task`, don't `run_and_wait`. - Always `zencreator_estimate_price` first; cost varies by model, resolution, and (for video) duration. See [Generation tools](./tools/generation.md) for every `tool_name` and [Models](./models.md) for the models each one supports. --- ## 6. NSFW workflow ZenCreator supports uncensored / NSFW generation, gated by two account flags. Be frank but factual. **Goal:** Generate adult content with an appropriate model. **Ask your agent:** *"I want to generate NSFW content — check my account is set up for it, then make this image."* **Tool chain:** 1. `zencreator_get_me` — check `nsfw_allowed` and `is_trusted`. - **`nsfw_allowed` must be `true`.** If it's `false`, the fix is: enable adult content in your ZenCreator account settings, then retry. - **`is_trusted`** (Trusted Status) is required for trusted-only models — marked **(trusted)** in the model lists — and for the trusted-only tools `flux_klein_lora` and `text_to_video`. Trusted Status is granted automatically after your first payment (any credit pack) and is permanent. 2. *(Optional)* `zencreator_craft_prompt` — delegate authoring of the explicit, model-specific prompt to an uncensored sidecar LLM. This exists precisely so an orchestrator that won't write explicit prompts itself can still drive NSFW workflows. It spends **no** ZenCreator credits. *(Available only when the prompt-agent sidecar is configured on your deployment.)* 3. **Pick a model.** Choose an NSFW-capable (and, if needed, trusted) model for your generation tool — for example `SDXL_NSFW`, `FLUX_KLEIN_NSFW`, or `wan@2.7-nsfw`. For garment removal on an existing photo, use `image_editor` with a targeted removal prompt and an NSFW model — `FLUX_KLEIN_NSFW` when the edit must render explicit anatomy, `GENERAL_NSFW` otherwise. See [Models](./models.md) for the full list and which are **(trusted)**. 4. `zencreator_get_tool_schema` + `zencreator_estimate_price` — validate the input and confirm cost. 5. `zencreator_create_task` (or `zencreator_run_and_wait` for images) → `zencreator_get_call_result` → preview/download. --- ## Credits and running out Generation spends credits. Before you commit, call `zencreator_estimate_price` (or `zencreator_compare_prices` to shop models) and state the cost to the user. If you run out mid-flight, generation returns HTTP **402** with a structured signal: ```json { "error_code": "insufficient_credits", "out_of_credits": true, "purchase_url": "...", "message": "..." } ``` The same `out_of_credits` + `purchase_url` also appear in `zencreator_get_me`, so "out of credits" reads identically whether you check ahead or hit it mid-generation. Top up at **https://app.zencreator.pro/billing**. --- ## See also - [Generation tools reference](./tools/generation.md) - [Assets tools reference](./tools/assets.md) - [Templates tools reference](./tools/templates.md) - [Generation tools & models](./models.md) - [Concepts](./concepts.md) · [Troubleshooting](./troubleshooting.md) --- # Generation tools & models Source: https://mcp.zencreator.pro/docs/models.md # Generation tools & models This page is the catalog of **generation tools** — the values you pass as the `tool_name` argument to [`zencreator_create_task`](./tools/generation.md) — and the **models** each generation tool offers. Keep two layers distinct (see [Concepts](./concepts.md)): - **MCP tools** are the `zencreator_*` tools your AI client sees. `zencreator_create_task` is one of them. - **Generation tools** are the `tool_name` values you pass *into* `zencreator_create_task` — e.g. `by_prompt`, `image_editor`, `videogen`, `faceswap`, `upscaler`, `lipsync`. Each generation tool exposes its own set of **models** (the `model` field). Plainly: `zencreator_create_task` is an MCP tool; `by_prompt` is a generation tool you pass to it; `SDXL_NSFW` is a model you pass to `by_prompt`. ## How to use this catalog 1. Pick a generation tool below for the task (text→image, edit, video, faceswap, …). 2. Pick a model from that tool's list. Models marked **(trusted)** require a trusted account for NSFW use. 3. Call [`zencreator_get_tool_schema`](./tools/generation.md) for the exact input/output JSON Schema, a prompt-writing guide, and model-selection guidance before submitting. 4. For per-model prompt conventions (Seedream prose vs. Qwen layout-first vs. Wan structured blocks, text-in-image rules, NSFW phrasing), call `zencreator_get_model_prompt_guide`. ## NSFW and trusted gating ZenCreator supports uncensored / NSFW generation. Two account gates apply: - **`nsfw_allowed`** — adult content enabled on the account (toggle in ZenCreator account settings). If `false`, enable adult content and retry — do not silently fall back to SFW. - **`is_trusted`** — whether the account has **Trusted Status**. It unlocks ZenCreator's extended capabilities (uncensored NSFW generation, 18+ templates and LoRAs, Face Swap tools, more flexible generation) and gates the **(trusted)** models below plus the trusted-only tools `flux_klein_lora` and `text_to_video`. Trusted status is granted **automatically after the account's first successful payment** (buying any credit pack in Billing) and is permanent; until then, submitting a trusted-only task fails and wastes credits. Check both proactively with [`zencreator_get_me`](./tools/account.md) before an NSFW workflow. See [Workflows](./workflows.md) for the full NSFW preflight. > The optional `zencreator_craft_prompt` sidecar (present on deployments that configure it) > can author NSFW / model-specific prompts when the orchestrator itself declines to — it > spends no ZenCreator credits. ## Choosing & comparing Credit cost varies by generation tool, model, resolution, and duration — and it is backend-driven, so it drifts. **Never hardcode credit numbers.** - [`zencreator_compare_prices`](./tools/generation.md) — shop across all models of a generation tool, cheapest-first (sweeps resolutions when relevant). Use this whenever the user wants the cheapest option. - [`zencreator_estimate_price`](./tools/generation.md) — get the exact credit cost of one candidate input. Call this and state the cost to the user before submitting. --- # Image generation tools ## by_prompt — Text-to-image Generate an image from a text prompt, with no input image. The entry point for creation: use it when the user has no source image and describes the picture in words — building a character or content from scratch, concepts, backgrounds, NSFW from a description, quick drafts and final hero shots. Supports fast/quality modes, batches, aspect ratios and body-shape LoRAs. Three content groups, pick by what you need: - **Top cloud models, censored** (`GENERAL_NSFW`, `NANO_BANANA`) — highest quality and realism, but block explicit content. - **Uncensored but not built for porn** (`WAN_2_7_IMAGE`, `QWEN_IMAGE`, `SEEDREAM_5`) — high quality and won't block, but won't create explicit content from scratch; they accurately **transform NSFW references** you provide. - **Local, built for explicit NSFW** (`SDXL_NSFW`, `FLUX_KLEIN_NSFW`) — slightly lower quality and more artifacts, but real explicit capability. **Models:** - `GENERAL_NSFW` *(default, trusted)* — General-purpose workhorse with a good quality/speed/price balance and strong facial likeness; the NSFW version is uncensored. Does not produce explicit anatomy from text alone (it covers it up). Older model — occasional hand/limb artifacts. - `GENERAL_SFW` — The same pipeline, SFW only. - `SDXL_NSFW` *(trusted)* — Best choice for explicit NSFW anatomy from text alone (it knows anatomy from training). Local model: slightly lower quality, more artifacts. Text-only — does **not** accept reference images. Renders a fixed ≈2:3 portrait (~1248×1824) and ignores `ratio`/`width`/`height`; pick `FLUX_KLEIN_NSFW` or `GENERAL_NSFW` when a specific aspect ratio matters. - `WAN` — Legacy WAN image model; prefer `WAN_2_7_IMAGE`. - `WAN_2_7_IMAGE` / `WAN_2_7_IMAGE_PRO` — Modern model with higher quality and detail (Pro = top consistency). Renders bodies, scenes and composition more aesthetically with fewer hand/limb artifacts. Weaker at in-image text. Uncensored, but transforms your NSFW references rather than inventing explicit content. - `QWEN_IMAGE` / `QWEN_IMAGE_PRO` — Aesthetic results with good facial likeness and few artifacts; great for stylized / illustrative / anime subjects. Pro adds realism. Uncensored; transforms NSFW references. - `SEEDREAM_5` — Newer generation: better prompt understanding, stronger stylization, better likeness, fewer artifacts. Uncensored; transforms NSFW references. - `NANO_BANANA` — Among the best for realism, and the only model that reliably renders legible in-image text (posters, signage, captions); strong real-world knowledge. Heavily censored — won't produce even mildly suggestive content. Weaker facial likeness. - `FLUX_KLEIN_NSFW` *(trusted)* — The most advanced local NSFW model: produces explicit content and also works with references — bring a character's face and create an action. Slightly lower quality, occasional artifacts. > by_prompt generates exactly one image per input. For N variants, pass N input objects in > the `inputs` array of one task (do not raise `batch_size`). ## image_editor — The main, most flexible image tool Edit and composite existing images by prompt. Bring references, edit and combine them; bring your character and dress them from a reference photo. It offers both SFW and NSFW models, and LoRA presets that extend NSFW capability. Use it to keep a product or object **exactly** (fabric, pattern, shape) while changing the scene. This is the most capable image tool — and the **default for all reference-based generation** (use it instead of `by_ref`). **Models:** - `GENERAL_NSFW` *(default, trusted)* — Universal default, uncensored, good facial likeness; general NSFW edits such as outfit or pose changes. Older model — occasional limb artifacts. - `NANO_BANANA` — High realism and the most precise prompt-driven edits; **required for any edit involving in-image text**. Heavily censored (no NSFW); weaker likeness. - `QWEN_IMAGE` / `QWEN_IMAGE_PRO` — Aesthetic, good likeness, few artifacts; Pro adds realism. Uncensored; transforms your NSFW references rather than creating explicit content from scratch. - `SEEDREAM_5` — Newer than the default: better prompt understanding, stronger stylization, better likeness, fewer artifacts. Uncensored; transforms NSFW references. - `WAN_2_7_IMAGE` / `WAN_2_7_IMAGE_PRO` — Aesthetic bodies and composition, few artifacts, precise editing; Pro = higher quality. Uncensored; transforms NSFW references. Weaker at in-image text. - `FLUX_KLEIN_NSFW` *(trusted)* — Local flagship for explicit NSFW with references: it knows anatomy and accepts a face reference. Slightly lower quality, occasional artifacts. - `FLUX_KLEIN_LORA` *(trusted)* — LoRA presets that extend NSFW capability and style templates; pass a `lora_id`. > `SDXL_NSFW` is intentionally **not** offered here — it is text-only and cannot accept > references. For explicit anatomy on a reference, use `FLUX_KLEIN_NSFW`. ## by_ref — Put your character into a reference photo's scene Bring a reference photo (the scene) and a photo of your character's face; the tool recreates the reference's scene — pose, outfit, composition, light — for **your** character. > *Explicit-request-only.* For most reference-based work `image_editor` is more flexible > (prompt-steerable edits, multiple references with roles) and is the recommended choice — > use `by_ref` only when explicitly asked for it by name. **Models:** only `SEEDREAM_5_PRO` is available through this MCP server — pass `model: "SEEDREAM_5_PRO"` explicitly (an omitted `model` falls back to the backend's `SDXL`, which — like `GENERAL` and `CHARACTER_SWAP` — is unavailable here and rejected at submit). - `SEEDREAM_5_PRO` — Two modes: **scene recreation** (default — the reference's scene is auto-described and regenerated for the character from `face_asset`, optionally plus `body_asset`; output follows the reference's aspect, or set `ratio` from 1:1, 1:2, 2:1, 1:3, 3:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 9:21, 21:9), or **person swap** (`keep_pose: true` — the reference's exact pose/outfit/lighting/background is kept and only the person is replaced; `body_asset`/`ratio` not usable). Prompts are ignored — the scene description is automatic. Exactly **one image per call** (`batch_size` ignored); flat price by `tier`: 1K = 2 credits, 2K = 3 credits. ## facegen — Create a face from scratch Generate a brand-new face from structured attributes: gender, age, origin/ethnicity, body type, eye/hair/beard color, hairstyle, beard and makeup. No reference image; returns several variants per request. Strength: full parametric control over appearance. There is no free-form prompt — required fields are `gender`, `age`, `origin`; the rest are optional appearance fields. Use it to **mint a new persona reference** (for likeness of a specific person, use `faceswap` or `by_ref`). Niche — used occasionally. ## photoshoot — Photoshoot from face + body references Bring a photo of the face and a photo of the body (without a face) of your character; the tool runs them through prepared prompt presets and returns a batch of images. Presets are grouped by type, so you can produce a set in a given style or action. The `prompt` describes the **scene** (wardrobe, location, pose, lighting, mood) — not the subject, which the references encode. Strength: reproducible, identity-preserving results with no manual prompting — and it honors a hard aspect ratio (pass `ratio` together with matching `width`/`height`). ## carousel — Multiple camera angles of one subject Bring an image and get the same subject from different camera angles (up to 10). Use it for social-media carousels and a "3D" / product overview of an object or character. There is no prompt — angle variation is automatic; the main dial is the number of images. Niche — used occasionally. ## collaber — Two characters in one frame Bring two characters and an optional background/location photo; the tool combines them into a single scene (1–4 images). The `prompt` describes their **interaction** and the joint scene, not their individual identities (those come from the two references). Strength: keeps both characters' likeness — a convenient preset for collabs and duets. ## faceswap — Swap a face on a photo Bring the photo where the face should be replaced plus a face photo, and the tool swaps the character. **Image only — there is no video face swap.** **Models:** - `SDXL` *(default)* — Lowest likeness of the set; fast/cheap baseline. - `GENERAL` — Better likeness, but not always stable. - `GENERAL_ADVANCED` — Improved general swap with the strongest identity preservation. - `FULL_HEAD` — Replaces the entire head, not just the face — use when the target's hairstyle or head shape differs strongly from the source. - `MULEROUTER_FACE` / `MULEROUTER_HEAD` — Cheapest and fastest option (1 credit flat). Output is delivered as-is from the provider, with no resolution control. `_FACE` swaps only the face, `_HEAD` replaces the whole head. No persona support. ## flux_klein_lora — Flux Klein with LoRA templates > **🔒 Trusted account required** — available only to trusted accounts (granted automatically > after your first credit purchase). Generate or edit images with Flux Klein driven by a LoRA style template. Inputs: `image_assets` (1–3 reference asset_ids), `lora_id` (**required** — the LoRA template id; browse via the templates catalog), an optional short `prompt` (the LoRA owns the style, so keep tweaks to scene/pose), and an optional `ratio` (1:1, 16:9, 9:16, 4:3, 3:4, 2:3, 3:2, 21:9). Base price 3 credits. > Standalone equivalent of `image_editor` with `model=FLUX_KLEIN_LORA`; prefer `image_editor` > unless you specifically want the dedicated entry point. ## upscaler — Increase image resolution Brings an image up to the resolution you choose and restores detail. Best for **low-resolution sources** that need to be cleaned up and improved; gains are limited on an already-sharp 4K image. There is no prompt — the only meaningful choice is the `version`. **Versions:** - `basic` / `basic_safe_face` — Baseline upscale; `*_safe_face` preserves the face. - `natural_clarity` — Cheap and natural-looking, any size. - `premium_realism` / `premium_safe_face` — Photorealistic detail; `*_safe_face` preserves the face. - `ultra_clarity` — Maximum detail. - `seedvr2_3b` — Adaptive resolution-aware upscale. Ignores `megapixels`/`creativity`; instead takes `detail` (`high`/`medium`/`low` — how much the source is pre-shrunk before upscaling, `high` preserves the most native detail) and `target_resolution` (`2k`/`4k`/`8k`). - `seedvr2_7b` — Premium diffusion-restoration upscale for 4K/6K output. Same `detail`/`target_resolution` controls as `seedvr2_3b`, but `target_resolution` only accepts `4k`/`6k` (sets a target megapixel budget — 4k≈16MP, 6k≈36MP — distributed per the source image's aspect ratio, not a fixed linear pixel size); also takes `noise_scale` (0-1, synthetic detail added during upscaling, default 0). > Use a `*_safe_face` version whenever the image contains a face you need kept faithful; the > other versions can subtly alter facial features while sharpening. ## upscaler_faceswap — Face swap + upscale (legacy) Swaps the face from `face_asset` onto the person in `ref_asset`, then upscales the result. Inputs: `ref_asset` + `face_asset` (both required) and an optional `upscaler_version` (`basic` / `premium_realism`; default `basic`). Output: one image. Base price 2 credits. > *Legacy combo — prefer `image_editor`*: the shared face-swap-then-upscale pipeline gives > insufficient face similarity. For better likeness, use `faceswap` (or `image_editor` with a > face reference) and chain `upscaler` for a real resolution bump. --- # Video generation tools ## videogen — Generate video Animate a photo into video (image→video). Cost depends on the model, duration (5–15 s) and resolution (480p–1080p). Supports prompt enhancement, fixed camera, LoRAs and optional audio. `videogen` is the **image-to-video** tool — a starting frame (`ref_asset`) is **required on every call**; for pure text-to-video (no starting image) use `text_to_video`. **Quick guide:** general content (best price/quality) → **Seedance**; NSFW / explicit content → `wan@2.7-nsfw` *(trusted)* or `wan@2.2-lora` (needs only `nsfw_allowed`); tasteful content with complex actions → **Kling** (censored). Each model declares its own duration and resolution capability — filter against the user's request before suggesting one, and price every candidate with `zencreator_compare_prices` (which can sweep resolutions cheapest-first). **Wan** — best prompt understanding and first-frame animation: - `wan@2.7` — Latest line; top prompt understanding and first-frame animation. Continuous 2–15 s, 720p/1080p. (Does **not** accept a `last_frame` keyframe — for that use `kling@2.1`, `seedance_pro`, or `seedance_v1_5_pro`; to go beyond 15 s, chain clips via `ref_asset`.) - `wan@2.7-nsfw` *(trusted)* — Wan 2.7 for NSFW; the best choice when you have a first frame (or a frame with an action) to animate. Uncensored. **Trusted-only** — requires `is_trusted`. - `wan@2.6` / `wan@2.6-flash` — Cheaper and older (`flash` is even cheaper and faster). Duration 5, 10, or 15 s; 720p/1080p. - `wan@2.5` — Sharper motion than 2.2; duration 5 or 10 s; 480p/720p/1080p. - `wan@2.2` — Frame-based duration; very flexible; uncensored NSFW base. **This is the backend's fallback default** when no model is passed (a factual fallback, not a recommendation — prefer Seedance for unspecified general content). - `wan@2.2-lora` — Presets with action-trained LoRAs that turn a first frame into a complex action. Includes "Blink" LoRAs: bring any photo of your character and the frame morphs into the desired NSFW action. The **easiest option for beginners** — no prompt needed, just a photo similar to the example's first frame. - `wan@2.7-lora` — The same preset idea at Wan 2.7 quality. Presets live in their **own catalog** (they are not interchangeable with `wan@2.2-lora`'s file-weight LoRAs): browse it with `zencreator_list_wan27_loras` — filter by `search`, `content_tags`, or `gender_tags`, whose valid values come from `zencreator_get_wan27_lora_tags`. Pass the preset's id as `loras: { "": {} }` — exactly one id, empty-object value, no scale weights. The model **cannot run without a preset**; `prompt` is optional (the preset's own default prompt is used when omitted). The catalog is filtered by your account's permissions, so NSFW and trusted-gated presets appear only once `nsfw_allowed` / `is_trusted` are set. **Kling** — censored, but animates a first frame well; newer versions cost more and understand prompts and complex actions better. Duration 5 or 10 s, 1080p: - `kling@2.6` — Latest Kling, top motion and physics, plus native audio (dialogue, effects). - `kling@2.5` — High quality, cheaper, consistent at volume. - `kling@2.1` — Stable motion. Supports a start+end keyframe (`last_frame`). - `kling@1.6` — Legacy, lowest cost. **Seedance** — uncensored; best price/quality balance for content: - `seedance_pro_fast` — Faster and cheaper, less "smart". Any integer duration 2–12 s. - `seedance_pro` — Pricier and smarter. Any integer duration 2–12 s. Supports a start+end keyframe (`last_frame`). - `seedance_v1_5_pro` — Best quality and result; joint audio+video, micro-expressions, first+last frame. Continuous 4–12 s. - `seedance_2_0` / `seedance_2_0_fast` *(`_fast` cheaper)* — Newest Seedance. Classic first(+last) frame animation, OR native multimodal references (up to 9 images / 3 videos / 3 audios via `ref_images`/`ref_videos`/`ref_audios`, mutually exclusive with `last_frame`). Durations 5/6/8/10/12/15 s; 480p/720p only (1080p rejected). Token-based price (≈1.35/3.02 credits/s at 480p/720p, ≈1.08/2.42 `_fast`) — use `zencreator_estimate_price` rather than eyeballing it. **Grok:** - `grok@4.1` — Censored; animates a first frame, top image-to-video, always emits native audio. Continuous 1–10 s. > Native audio: models that support it accept `generate_audio: true`; `grok@4.1` always > emits audio. Check each model's capabilities via `zencreator_get_tool_schema`. ## text_to_video — Text-to-video > **🔒 Trusted account required** — available only to trusted accounts (granted automatically > after your first credit purchase), regardless of whether the request is SFW or NSFW. Generates a first frame (on Flux Klein, Wan 2.2 or Wan 2.7) and then animates it. Use this when there is no starting image; if you already have a frame, use `videogen`. Durations are model-specific — an out-of-set duration bills a 1-credit no-op, so match them exactly: - `wan@2.7` *(default)* — Top quality. Durations **5 / 10 / 15 s** (not 8). 720p or 1080p (price ≈ 2.6 credits/s at 720p, ≈ 3.4 credits/s at 1080p — so 5 s = 13/17, 10 s = 26/34, 15 s = 39/51). - `wan@2.2` — Budget. Durations **5 / 8 s** (not 10/15). Resolution is ignored — flat 10 credits (5 s) / 13 credits (8 s). - `seedance_2_0` / `seedance_2_0_fast` *(`_fast` cheaper)* — Generates the video directly from the prompt in one pass (no separate first-frame step). Durations **5 / 6 / 8 / 10 / 12 / 15 s**. 480p or 720p only (1080p rejected). Token-based price (≈1.35/3.02 credits/s at 480p/720p, ≈1.08/2.42 `_fast`) — use `zencreator_estimate_price` rather than eyeballing it. ## video2video — Replace a character in a video Transfer motion / replace a character in a video using a reference video **or an Instagram/TikTok URL** (passed directly — no upload needed); the original soundtrack can be kept. SFW and NSFW variants. `resolution` (480p / 720p / 1080p) is required. **Modes:** - `kling_2_6_sfw` — Handles character replacement best (censored); billed per second. - `replace_sfw` / `replace_nsfw` — Same character-replacement logic; `replace_nsfw` is uncensored. - `animate_sfw` / `animate_nsfw` — Motion transfer / animation; `animate_nsfw` is uncensored. - `dreamactor_m2` *(trusted)* — Same character-replacement logic, uncensored. **Trusted-only** — requires `is_trusted`. - `seedance_2_0_sfw` / `seedance_2_0_nsfw` / `seedance_2_0_fast_sfw` / `seedance_2_0_fast_nsfw` *(`_fast` cheaper)* — ByteDance Seedance 2.0. **Different input contract from every mode above:** no Instagram/TikTok URL and no generic `video_asset` — the source video must be uploaded and passed via `ref_videos` (first entry is the main video, required), optionally alongside `ref_images`/`image_asset`/`ref_audios` for extra multimodal references (up to 9/3/3). `prompt` is required (unlike the other modes). `resolution` is 480p or 720p only — 1080p is rejected for these four modes. > The uncensored modes trade some quality and prompt understanding — you may need to change > the input (source video or character) to get a good result on the first try. Modes marked > **(trusted)** are available only to trusted accounts. ## lipsync — Talking head Bring an audio file and a first frame, and get a video in which the character speaks your audio. Up to 35 seconds; JPG/PNG under 5 MB. Use it to voice a character or avatar. Niche — used occasionally. **Models:** - `GENERAL_NSFW` *(default, trusted)* — Specialized lipsync pipeline. Note: this `GENERAL_NSFW` refers to a different underlying model than `GENERAL_NSFW` under `by_prompt` / `image_editor`; the shared name is a backend artifact. lipsync takes audio + a first-frame portrait image (no video source) and has no text prompt. ## video_upscaler — Upscale video Bring a medium-quality video and get a sharper, higher-resolution result via BytePlus vCube. Use it as a final polish or to restore low-quality footage. There is no prompt. Pick a quality tier (`mode`: `standard` — fast and affordable, default; or `pro` — premium model, ~10x the price) and a target output resolution (`resolution`: `1080p` default, `2k`, or `4k`). Output is always locked to 30fps. Priced per output second by tier x resolution x duration — check `zencreator_estimate_price` before submitting. ## video_merger — Concatenate clips Stitch 2–5 video clips into a single video, with a transition between each. No prompt, no model selection — it is the final assembly step after generating individual clips with `videogen` / `text_to_video`. Inputs: `clips` (2–5 items, each an uploaded video `asset_id` plus its `source_duration_sec`, with optional `trim_start_sec` / `trim_end_sec` to cut the clip), `transition` (`cut` / `dissolve` / `fade` / `slide`; default `cut`), `keep_audio` (default true), `fps` (24 or 30; default 30), and `width` / `height` (default 1280×720). Base price 1 credit. --- ## See also - [Generation MCP tools](./tools/generation.md) — `zencreator_create_task`, `zencreator_run_and_wait`, `zencreator_get_tool_schema`, `zencreator_estimate_price`, `zencreator_compare_prices`, and the rest of the task lifecycle. - [Concepts](./concepts.md) — tasks, calls, assets, the tool-vs-model split. - [Workflows](./workflows.md) — end-to-end recipes (image this turn, video, NSFW preflight). --- # Generation & tasks Source: https://mcp.zencreator.pro/docs/tools/generation.md # Generation tools This page is the API reference for the **generation-flow** MCP tools — the `zencreator_*` tools your AI client uses to discover what ZenCreator can do, price a job, submit it, and read back results. These are MCP tools. They are distinct from **generation tools** (the `tool_name` values like `by_prompt`, `image_editor`, `videogen`, `faceswap`, `upscaler`, `lipsync`) and the **models** you pass into them — those are documented in [models](../models.md). For the difference between a *task* and a *call*, see [concepts](../concepts.md). To turn the results of a task into viewable or downloadable files, see [assets](./assets.md). ## Typical flow 1. **Discover** — `zencreator_list_tools` to pick a `tool_name`, then `zencreator_get_tool_schema` to learn its input shape, model list, prompt guide, and the questions to ask the user. 2. **Price** — `zencreator_estimate_price` (one candidate input) or `zencreator_compare_prices` (all models, cheapest first). State the cost to the user before committing. 3. **Submit** — `zencreator_create_task` (async; returns a task id) or `zencreator_run_and_wait` (blocks until terminal, then auto-fetches outputs and asset ids — images only, not video). 4. **Poll & read** — `zencreator_get_task` to check status, then `zencreator_get_call_result` to read a completed call's full output and asset ids. 5. **Deliver** — hand the asset ids to the [asset tools](./assets.md) for preview or download URLs. > **Every** tool below also accepts `response_format` (`"markdown"` default, or > `"json"`) and always returns a full machine-readable `structuredContent` > object regardless of format. Responses over ~25,000 characters are truncated > with a hint to paginate or switch to `response_format: "json"`. --- ## Discovery ### zencreator_list_tools List every available generation tool with its base credit price and current availability. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `include_blocked` | boolean | no | `true` | If `false`, drops tools whose entire model set is blocked. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `count` — number of tools returned. - `tools[]` — each: `name` (the `tool_name` you pass to `zencreator_create_task`), `description`, `price` (base credits; final cost varies by inputs), `blocked` (boolean), and `blocked_models` (string array, present only when blocked; `["*"]` means all models disabled). The markdown view also embeds a tool-selection guide that maps common user intents to the right `tool_name` — read it before choosing a tool. **Errors** - Standard transport / auth errors only. Returns the full list otherwise. **Example** — "What tools can generate video?" Ask your agent to list tools and filter by name/description containing "video". ### zencreator_get_tool_schema Return the full input and output JSON Schema for a single generation tool, plus prompt-engineering guidance, model-selection criteria, and the standard questions to ask the user. Call this before submitting. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `tool_name` | string | yes | — | Tool identifier from `zencreator_list_tools`. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `name`, `description`, `price`. - `input_schema` — JSON Schema of expected inputs. Where the tool exposes `resolution` / `output_format`, they are promoted to **required** so they can't be silently defaulted. - `output_schema` — JSON Schema of the output. - `models[]` *(optional)* — every valid `model` value: `value`, `description`, optional `is_default`, `trusted_only`, `input_constraints`, `output_traits`, `modes`, `pricing`, `notes`. The `model` field in `input_schema` shows `type: str` with no enum — rely on this array for valid model values. - `prompt_guide` *(optional)* — rules for writing the `prompt` field. Treat it as a contract. - `model_selection_guide` *(optional)* — decision tree for picking `model`. - `format_questions[]` *(optional)* — questions to ask the user before submission (count, aspect ratio, NSFW vs SFW, model preference, etc.). **Errors** - `404` — `tool_name` not recognised. Call `zencreator_list_tools` for valid names. **Example** — "Edit this photo to replace the dress." Ask your agent to fetch the schema for `image_editor`; its `prompt_guide` explains the structure that produces better edits. ### zencreator_get_model_prompt_guide Return a focused, per-model prompt-engineering guide for a specific image model. Each supported model has very different conventions, and using the wrong style degrades output quality. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `model` | string | yes | — | A supported model value, case-sensitive, exactly as it appears in `models[].value`. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `model` — the echoed model value. - `prompt_guide` — multi-section markdown: template, length, key rules, anti-patterns, NSFW technique, and an example. **Errors** - `isError` if the model name has no dedicated guide. The message lists the models that do; for any other model, fall back to the tool-level `prompt_guide` from `zencreator_get_tool_schema`. When to call: after `zencreator_get_tool_schema` returns a model marked "has prompt guide" and you have picked which model to use — but before writing the prompt string you pass to `zencreator_create_task` / `zencreator_run_and_wait`. --- ## Pricing > Both pricing tools take **two separate top-level fields**: `tool_name` and > `params`. `params` is the **flat** shape of ONE element of > `zencreator_create_task`'s `inputs[]` array — do **not** wrap it in > `{ inputs: [...] }` or nest `tool_name` inside it. A malformed call returns a > corrected, ready-to-resend payload. Always price a job before committing the user's credits. Never print a fixed credit number from memory — costs are backend-driven and shift with model, resolution, duration, and batch size. ### zencreator_estimate_price Calculate exactly how many credits one candidate input will cost, before submitting. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `tool_name` | string | yes | — | Top-level tool identifier from `zencreator_list_tools`. | | `params` | object | yes | — | Flat object of generation fields (prompt, model, batch_size, etc.) — same shape as one element of `create_task`'s `inputs[]`. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `tool_name`. - `price` — best-effort total credits for ONE call with these params. - `raw` — verbatim backend response (varies per tool; may include `per_unit`, `units`, `total_price`). **Errors** - Unknown `tool_name` — error listing valid names. - `params` missing a required field, or carrying fields the tool's `input_schema` doesn't declare — error. The same payload would be rejected by `zencreator_create_task`; fix it via `zencreator_get_tool_schema` first. - Requested model blocked, or trusted-only while the account has `is_trusted=false` — the same access error submission would give, instead of a misleading price. - `422` — params do not satisfy the tool's `input_schema` (including values outside a field's enum); the backend message lists the exact violations. **Example** — "How much for one Seedream image?" Ask your agent to estimate the price for `by_prompt` with your prompt and `model: "SEEDREAM_5"`. ### zencreator_compare_prices For a given tool and base params, return the credit price for **every** available model, sorted cheapest-first. One call replaces N `zencreator_estimate_price` calls. Call this whenever the user wants to spend less — do not guess which model is cheapest, because the ranking shifts with resolution and other params. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `tool_name` | string | yes | — | Top-level tool identifier from `zencreator_list_tools`. | | `params` | object | yes | — | Flat object of generation fields **without** `model` — the tool injects each model automatically (a `model` in params is stripped). | | `resolutions` | string[] | no | — | Explicit resolutions to compare across (e.g. `["720p","1080p"]`). Omit to auto-sweep every supported resolution for resolution-priced tools. A single `resolution` inside `params` pins the comparison to that resolution. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `tool_name`. - `count` — how many model × resolution rows returned a valid price. - `compared_resolutions[]` *(optional)* — resolutions present in the result (omitted when resolution is irrelevant). - `prices[]` — sorted ascending: `model`, `description`, `price`, optional `resolution`, `is_default`, `trusted_only`. - `errors[]` *(optional)* — models that failed or can't produce a requested resolution: `model`, optional `resolution`, `reason`. **Errors** - Returns `isError` for tools with no known model catalog — use `zencreator_estimate_price` instead. Only works for tools with a model catalog (e.g. `by_prompt`, `image_editor`, `by_ref`, `faceswap`, `videogen`, `lipsync`, `text_to_video`). **Example** — "Make my video cheaper." Ask your agent to compare prices for `videogen` with your prompt and duration but no resolution; it sweeps every resolution and ranks them cheapest-first. Dropping resolution is often the biggest saving — surface it. --- ## Task lifecycle ### zencreator_create_task Submit one or more generation calls as a single task. Returns immediately with a task id; generation runs asynchronously. > **Not idempotent.** Calling it twice creates two tasks and charges credits > twice. Confirm with the user before resubmitting on errors. Always > `zencreator_estimate_price` first and state the cost. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `tool_name` | string | yes | — | Tool identifier from `zencreator_list_tools`. | | `inputs` | object[] | yes | — | 1..50 input objects, one per parallel call. Each must satisfy the tool's `input_schema`. | | `comment` | string | no | — | Free-form note attached to the task (max 500 chars). | | `retry_id` | string (UUID) | no | — | If retrying a previously-failed task, its id. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `id` — task UUID; pass to `zencreator_get_task`. - `unique_name`, `tool_name`. - `status` — `created` \| `processing` \| `partial` \| `completed` \| `failed`. - `total` — total calls; `done` — completed so far. - `created_at`, `comment`. **Errors** - `402` — insufficient credits. The error result carries a structured `out_of_credits` signal (`error_code: "insufficient_credits"`, `purchase_url`, `message`); relay it verbatim and have the user top up at [app.zencreator.pro/billing](https://app.zencreator.pro/billing). - `422` — an input element does not satisfy the tool's `input_schema`. This tool also rejects a submission that omits `resolution` on a resolution-priced tool (e.g. `videogen`) rather than letting the backend pick a silent default. - `429` — rate-limited. Back off. **Example** — "Generate 4 variations of this scene." Ask your agent to submit one task with 4 entries in `inputs` (one task, N calls — never N tasks). ### zencreator_run_and_wait Submit a task and **block** until it reaches a terminal status (`completed`, `failed`, `partial`), then auto-fetch each completed call's lazy output and extract asset ids. Collapses create → poll → get-result into one call. Best for images you want in the same turn. > **Not idempotent** — every successful submission charges credits. > **Not for video.** `videogen`, `video2video`, `lipsync`, and > `video_upscaler` routinely take 60-180 s, longer than most MCP client > transport timeouts. The transport hangs up before this tool returns, leaving > no task id to resume. Submit videos with `zencreator_create_task` and wait > with `zencreator_wait_for_task` as the next tool call in the same turn, > repeating on `timed_out=true` — never end the reply with just "task > submitted". **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `tool_name` | string | yes | — | Tool identifier from `zencreator_list_tools`. | | `inputs` | object[] | yes | — | 1..50 input objects (same shape as `create_task`). | | `comment` | string | no | — | Free-form note (max 500 chars). | | `retry_id` | string (UUID) | no | — | If retrying a failed task, its id. | | `timeout_s` | number (int) | no | `30` | 5..50. Internal wall-clock cap on the wait, kept short to stay under the Cloudflare/Traefik edge timeout (long-held requests get a 504). On `timed_out=true`, call `zencreator_wait_for_task` again, or poll `zencreator_get_task`. Under heavy load the server may refuse a blocking wait and ask you to poll instead. | | `poll_interval_s` | number (int) | no | `2` | 1..30. Initial polling interval; backs off 1.5x per poll, capped at 15s. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `task_id` — resume polling with `zencreator_get_task` if it timed out. - `tool_name`, `status`, `total`, `done`. - `timed_out` — `true` if the wall-clock cap hit before terminal status; the task is still running on the backend. - `duration_ms`, `polls`. - `calls[]` — each: `call_id`, `status`, `output` (already fetched for completed calls), `error` (null unless failed), `asset_ids`. - `asset_ids` — flat union across all completed calls. - `created_at`, `finished_at`, `comment`. **Errors** - `402` (create phase) — insufficient credits; same structured `out_of_credits` signal as `create_task`. - `422` (create phase) — an input does not satisfy the tool's `input_schema`. - `429` — rate-limited. Back off. - On timeout it returns cleanly with `timed_out: true` and the live `task_id`. Do **not** call this tool again with the same inputs — resume via `zencreator_get_task` (re-calling creates a new task and charges again). ### zencreator_get_task Fetch the full state of a single task — status, progress, inputs, and per-call entries. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `task_id` | string (UUID) | yes | — | Task UUID. | | `include_error` | boolean | no | `false` | Deprecated and ignored — error details are always included on failed calls. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `id`, `unique_name`, `tool_name`, `status`, `total`, `done`, `inputs`. - `calls[]` — each: `id`, `status`, `output` (lazy — usually `null` here; fetch with `zencreator_get_call_result` once `status="completed"`), `error` (null unless the call failed). - `created_at`, `finished_at`, `comment`, `owner_id`. **Errors** - `403` — the task belongs to a different user. - `404` — `task_id` not recognised or the task was deleted. Polling guidance: tasks typically complete in 5-60 seconds; wait at least 2s between polls. `status="partial"` means some calls finished — you can already fetch those assets. `status="failed"` is terminal; read `calls[].error` and do not retry without user confirmation. ### zencreator_get_call_result Return the structured output of one call. This is the **only** way to discover the asset ids produced by a completed generation — the task's own `calls[].output` is intentionally lazy and comes back null. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `call_id` | string (UUID) | yes | — | From a task's `calls[].id`. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `call_id`. - `output` — tool-specific, verbatim from the backend. - `asset_ids` — best-effort extraction of asset UUIDs from common output keys (e.g. `image_assets` for image tools; `video_asset` / `asset_id` for video). If extraction returns empty, inspect `output` directly. **Errors** - `404` — `call_id` not found or not owned by the user. List the parent task first. Hand the returned `asset_ids` to the [asset tools](./assets.md) for preview or download URLs. ### zencreator_list_tasks Return a paginated list of the user's tasks, optionally filtered by tool, status, or free-text search over the comment field. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `tool_name` | string | no | — | Filter by tool name (exact match). | | `status` | string | no | — | `created` \| `processing` \| `partial` \| `completed` \| `failed`. | | `query` | string | no | — | Substring search on the comment field. | | `order_by` | string | no | `"created_at"` | `created_at` \| `done` \| `total`. | | `direction` | string | no | `"desc"` | `asc` \| `desc`. | | `limit` | number | no | `20` | 1..100. | | `offset` | number | no | `0` | `>= 0`. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent` (the canonical paginated envelope): - `total`, `count`, `offset`. - `items[]` — each: `id`, `unique_name`, `tool_name`, `status`, `total`, `done`, `created_at`, `finished_at`, `comment`. - `has_more`, `next_offset` (present when there are more items). To page, pass `next_offset` back as `offset`. Use offsets that are multiples of `limit` for predictable boundaries. **Errors** - Standard transport / auth errors only. ### zencreator_get_processing_tasks Return, per tool, whether the user has at least one task currently in flight — a cheap "are any of my generations still running?" check. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `tools[]` — each: `tool_name`, `processing` (boolean). - `any_processing` — boolean. **Errors** - Standard transport / auth errors only. ### zencreator_delete_task Soft-delete a task and its associated generations. The user will no longer see it in their task list. > **Destructive.** Deleted tasks cannot be retrieved through normal endpoints. > Always confirm with the user before calling. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `task_id` | string (UUID) | yes | — | UUID of the task to delete. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `deleted_task_id`. **Errors** - `404` — `task_id` not found or not owned by the current user. --- ## Prompt helpers (optional) > These two tools are present **only when the prompt-agent sidecar is > configured**. They may not be available on every deployment. Neither spends > ZenCreator credits — they call an external LLM; credits are spent only when > you submit the resulting prompt via `zencreator_create_task` / > `zencreator_run_and_wait`. ### zencreator_craft_prompt Delegate prompt-writing to a dedicated uncensored LLM that knows the model-specific conventions for ZenCreator's image / video models. Returns a fully-formed prompt ready to drop into the generation's `positive_prompt` (or equivalent) field. The orchestrator pipes the user's brief through; it does not author the explicit text itself. This project does not use negative prompts. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `brief` | string | yes | — | The user's literal request, in English (translate first if needed; do not censor). Max 4000 chars. | | `tool_name` | string | yes | — | e.g. `by_prompt`, `image_editor`, `videogen`. | | `model` | string | yes | — | Exact model value from `zencreator_get_tool_schema` `models[]`. | | `nsfw` | boolean | no | `false` | Set `true` only if the user explicitly opted into adult content and the account allows it. | | `count` | number (int) | no | `1` | 1..4. Number of distinct prompt variations to draft. | | `references` | object[] | no | — | Already-uploaded asset ids the generation will use: each `{ asset_id (UUID), role?, description? }`. Include a factual `description` per reference (max 800 chars) — the agent has no visual access to the bytes; without it identity / wardrobe / pose are lost. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `prompts[]` — each: `prompt` (drop verbatim into the generation field), optional `rationale`. - `model_used` — echoes the model you asked for. - `agent_model` — which uncensored LLM answered. Generation settings (aspect ratio, image size, batch size, output format) are **not** in this output — you set them yourself when calling `zencreator_create_task` / `zencreator_run_and_wait`. **Errors** - `PROMPT_AGENT_API_KEY` not configured — the sidecar is disabled. - Upstream HTTP error (rate limit, model down) — retry once. - Agent returned non-JSON — rare transient glitch; retry. For any NSFW workflow, check `zencreator_get_me` first: the user needs both `nsfw_allowed: true` and `is_trusted: true`, or the downstream generation will refuse and waste credits. ### zencreator_describe_asset Generate a factual visual description of an `asset_id` via an uncensored multimodal LLM. Engineered for downstream prompt engineering — identity attributes, state of dress, pose, setting, lighting, camera framing. Descriptions are cached per `asset_id` in-process (assets are immutable). **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `asset_id` | string (UUID) | yes | — | The ZenCreator asset to describe. | | `force_refresh` | boolean | no | `false` | If `true`, ignore the cache and re-describe. | | `response_format` | string | no | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: - `asset_id`. - `description` — factual paragraph (~80-200 words). - `media_type` — e.g. `image/png`, `image/jpeg`. - `cached` — `true` if served from the in-process cache. - `vision_model` — which uncensored vision LLM answered. **Errors** - `PROMPT_AGENT_API_KEY` not configured — the vision agent is disabled. - Asset is video or audio — the vision model may produce a weak or generic description. - Vision model upstream error — retry once. You usually don't need to call this explicitly — `zencreator_craft_prompt` auto-calls it for any reference passed without a `description`. --- ## See also - [Models](../models.md) — the `tool_name` and `model` values you pass in. - [Concepts](../concepts.md) — tasks, calls, assets, credits. - [Asset tools](./assets.md) — turn asset ids into preview / download URLs. - [Account tools](./account.md) — credit balance and `out_of_credits` checks. --- # Assets Source: https://mcp.zencreator.pro/docs/tools/assets.md # Asset tools API reference for the ZenCreator MCP tools that **upload** media and **fetch URLs** for generated or uploaded assets. Every asset is identified by an `asset_id` (a UUID). You feed `asset_id`s into generation tools, and you read them back out of completed tasks. > **Where asset ids come from.** Generation output ids are discovered with `zencreator_get_call_result` after a task finishes — see [generation tools](../tools/generation.md). To turn user-supplied media into an `asset_id`, use `zencreator_upload_asset` below. For end-to-end recipes, see [workflows](../workflows.md). ## Download vs. preview — read this first Two different URLs come back from this tool group, and they are **not interchangeable**: | | `download_url` | `preview_url` | | --- | --- | --- | | What it is | The **full-resolution original** binary | A **downscaled, re-encoded web preview** (thumbnail) | | Format | The original's `media_type` (e.g. `image/png`, `video/mp4`) | The preview's own `preview_media_type` (commonly `image/webp`) — usually **differs** from the original | | Use it for | Downloading / saving the real file | Viewing / rendering in chat | | Tool | `zencreator_get_asset_download_url` / `_urls` | `zencreator_get_asset_preview_url` / `_urls` | Never present a `preview_url` as "the original" or "full resolution". When the user wants to save the file, call the download tool and label it with `media_type`. When you just want to show the image, call the preview tool and label it with `preview_media_type`. All URLs returned here are **signed and expire within a few minutes**. Do not cache them long-term; re-call the tool to get a fresh one. Every tool also accepts `response_format` (`"markdown"` default, or `"json"`) and always returns a full `structuredContent` object regardless of format. See [concepts](../concepts.md) for the shared response contract. --- ## zencreator_upload_asset Create a new ZenCreator asset from a URL or base64 bytes, returning an `asset_id` you can pass to generation tools that operate on user-supplied media (image-to-video, lipsync, face-swap, image editing, upscaler, photoshoot with reference, and so on). Without an upload, those generators cannot run on the user's own images. Provide **exactly one** of `source_url` or `data_base64`. - The user pasted a public `http(s)://` URL → use `source_url`. **Preferred:** the server fetches the full-resolution bytes itself, with no tool-argument size limit. - The user gave a local file path (Claude Code, CLI clients) → read the real bytes yourself and use `data_base64`. - The user pasted a small RFC 2397 `data:` URL → use `source_url`. The base64 rides in the request body, so this works only for small images. - The user attached media to the chat (Claude.ai web / mobile app, ChatGPT, Cursor, Claude Desktop) → this usually **cannot** be uploaded via `data_base64`. The attachment is a vision block, not copyable bytes; `data_base64` only fits tiny images, and the request body is capped (~25 MB over the HTTP transport). **Never resize, downscale, crop, or re-encode the user's image to squeeze it into a tool argument — that silently destroys their photo.** Instead ask the user for a public `http(s)://` URL, or to upload the file in the ZenCreator web app and supply the `asset_id`. Chat-attachment URLs are session-bound and unreachable from the server — do not try to refetch them. **Parameters** | Parameter | Type | Required | Default | Description | | --- | --- | --- | --- | --- | | `source_url` | string | one of `source_url`/`data_base64` | — | `http(s)://` URL or RFC 2397 `data:` URL. The server fetches the bytes and forwards them as a multipart upload (max 50 MB, 30 s fetch timeout). `file://`, `blob:`, `javascript:` and other schemes are rejected. | | `data_base64` | string | one of `source_url`/`data_base64` | — | Raw file bytes as a base64 string. Use for **local file paths** (Claude Code / CLI). Inline base64 rides in the request body (capped at ~25 MB over the HTTP transport — roughly an ≤18 MB image after base64 inflation), so it is not viable for large files or for chat attachments. Prefer `source_url` whenever a URL exists. | | `filename` | string | No | — | Up to 255 chars. Used to detect the media type via extension and as the multipart `filename`. Auto-derived from a `source_url` path when absent. | | `media_type` | enum | No | — | Explicit override; required only when auto-detection fails. One of the [allowed media types](#allowed-media-types) below. | | `response_format` | string | No | `"markdown"` | `"markdown"` or `"json"`. | **Media-type detection precedence** (first match wins): explicit `media_type` arg → HTTP `Content-Type` from `source_url` → media type from the `data:` URL header → `filename` / URL pathname extension. If none yields an allowed value, the tool errors and asks you to pass `media_type` explicitly. **Returns** — `structuredContent`: ```json { "asset_id": "string", // pass to generation tools as image_asset_id / video_asset_id / etc. "media_type": "string", // one of the allowed list "size_bytes": 0 // local byte count before upload } ``` **Limits** - 50 MB per upload (applied locally to all media types). This full cap is reachable via `source_url` (fetched server-side); for inline `data_base64` over the HTTP transport the effective ceiling is the ~25 MB request-body cap (roughly an ≤18 MB image after base64 inflation). - For `image/*` the backend additionally validates that the bytes are a real, decodable image and may reject with a 400 even if the mime passes. **Not idempotent** — every call creates a new asset row. Calling twice with the same bytes produces two distinct `asset_id`s. **Errors** - `pass exactly one of 'source_url' or 'data_base64'` — provide one input mode, not zero or both. - `unsupported scheme` / scheme blocked — use `http(s)://` or `data:` only. - `malformed data: URL` — the `data:` URL could not be parsed. - `data_base64 is not valid base64` / `decoded to zero bytes` — fix the encoding. - payload `> 50 MB cap` — resize or compress before uploading. - `could not determine an allowed media_type` — pass an explicit `media_type`. - 400 from backend — corrupt image, oversized image, or a mime that doesn't match the bytes. - 401 — the caller must re-authorize. **Example** > "Here's a photo at this URL — upload it and use it as the reference for the next generation." (The client calls `zencreator_upload_asset` with `source_url`; the server fetches the full-resolution bytes.) For a raw chat attachment with no URL, ask the user for a public link or to upload it in the ZenCreator web app — never downscale it to fit a tool argument. ### Allowed media types `zencreator_upload_asset`'s `media_type` enum and the upload validator accept exactly: ``` image/png image/jpeg image/jpg image/webp image/heic image/heif video/mp4 video/mov video/quicktime audio/mpeg audio/mp3 audio/wav audio/x-wav audio/x-m4a ``` Anything else is rejected. --- ## zencreator_get_asset Return an asset's media type so you know how to handle it before fetching the binary. **Parameters** | Parameter | Type | Required | Default | Description | | --- | --- | --- | --- | --- | | `asset_id` | string (UUID) | Yes | — | The asset UUID. | | `response_format` | string | No | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: ```json { "id": "string", "media_type": "string" // RFC 6838 media type, e.g. 'image/png' } ``` **Errors** - 404 — `asset_id` not recognised or not owned by the user. --- ## zencreator_get_asset_download_url Return a short-lived presigned URL for the **full-resolution original** binary, plus the asset's media type so you can state the file format to the user. Always tell the user the format — never hand over a bare URL. For 2+ assets, prefer the batch variant `zencreator_get_asset_download_urls`. **Parameters** | Parameter | Type | Required | Default | Description | | --- | --- | --- | --- | --- | | `asset_id` | string (UUID) | Yes | — | The asset UUID. | | `response_format` | string | No | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: ```json { "asset_id": "string", "download_url": "string", // signed; expires within minutes "media_type": "string" // RFC 6838 type of the original, e.g. 'image/png', 'video/mp4' } ``` **Errors** - 404 — `asset_id` not recognised or not owned by the user. - The URL expires shortly — if it's stale, re-call to get a fresh one. **Example** > "Give me the download link for that image." → returns `download_url` + `media_type` to surface as "Here's your image (PNG): <url>". --- ## zencreator_get_asset_download_urls Batch version of `zencreator_get_asset_download_url`: fetch full-resolution download URLs and media types for **1..50** assets in one round-trip. Use whenever a task produced 2+ assets. Per-asset failures do not abort the batch. **Parameters** | Parameter | Type | Required | Default | Description | | --- | --- | --- | --- | --- | | `asset_ids` | array<string UUID> | Yes | — | 1 to 50 asset UUIDs. | | `response_format` | string | No | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: ```json { "count": 0, "succeeded": 0, "failed": 0, "items": [ { "asset_id": "string", "download_url": "string", // present iff succeeded; signed and expires shortly "media_type": "string", // RFC 6838; present iff succeeded "error": "string" // present iff failed (e.g. backend 404) } ] } ``` **Errors** - Per-asset: each failed item carries an `error` string; the rest still succeed. - URLs are signed and expire within a few minutes — surface them promptly or re-call. --- ## zencreator_get_asset_preview_url Return a short-lived URL to a **reduced-size, re-encoded web preview** (a downscaled thumbnail — commonly WebP, **not** the original), the original asset's media type, and — by default — the preview bytes **inline** as an MCP image content block so sandboxed clients (e.g. Claude.ai web) can render the image without reaching storage directly. `preview_url` is for **viewing**, not downloading. Label it with `preview_media_type` and state the original's `media_type` separately. For the full-resolution original, use `zencreator_get_asset_download_url`. For 2+ assets, prefer `zencreator_get_asset_preview_urls`. **Parameters** | Parameter | Type | Required | Default | Description | | --- | --- | --- | --- | --- | | `asset_id` | string (UUID) | Yes | — | The asset UUID. | | `inline` | boolean | No | `true` | When `true`, fetch the preview bytes and attach them as an image content block. Per-image inline cap is 2 MB; over that it falls back to URL-only with an `inline_skipped` note. Set `false` for a smaller response or when the client renders URLs natively. | | `response_format` | string | No | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: ```json { "asset_id": "string", "preview_url": "string", // reduced-size web preview — NOT the original "preview_media_type": "string", // RFC 6838 type of preview_url itself, e.g. 'image/webp' (omitted if undeterminable) "media_type": "string", // RFC 6838 type of the ORIGINAL asset, e.g. 'image/png' "inline_skipped": "string" // present only when inline was requested but skipped } ``` When inlining succeeds, the response also carries an extra `{ type: "image", mimeType, data }` content block, which most clients render as an inline thumbnail. **Errors** - 404 — `asset_id` not recognised or not owned by the user. - `inline_skipped` is informational (e.g. image > 2 MB, or a network error fetching the preview) — the URL is still returned. **Example** > "Show me that result in the chat." → returns `preview_url` + inlined thumbnail; tell the user "Preview (WebP), shown inline; original is PNG — say the word for the full-res link." --- ## zencreator_get_asset_preview_urls Batch version of `zencreator_get_asset_preview_url`: fetch reduced-size web preview URLs plus each original's media type for **1..50** assets in one round-trip, and — by default — inline the preview bytes as image content blocks. Use whenever a task produced 2+ assets. Per-asset failures do not abort the batch. These URLs are for **viewing**, not downloading. For full-resolution originals use `zencreator_get_asset_download_urls`. **Parameters** | Parameter | Type | Required | Default | Description | | --- | --- | --- | --- | --- | | `asset_ids` | array<string UUID> | Yes | — | 1 to 50 asset UUIDs. | | `inline` | boolean | No | `true` | Attach preview bytes as image content blocks. Per-image cap 2 MB; per-call total cap 8 MB. Assets exceeding either cap fall back to URL-only with an `inline_skipped` note. Set `false` to keep the response small. | | `response_format` | string | No | `"markdown"` | `"markdown"` or `"json"`. | **Returns** — `structuredContent`: ```json { "count": 0, // input count "succeeded": 0, // URL fetched "failed": 0, // URL fetch failed (no preview_url, has error) "inlined": 0, // bytes also attached as image content blocks "items": [ { "asset_id": "string", "preview_url": "string", // web preview — NOT the original; present iff URL fetch succeeded "preview_media_type": "string", // RFC 6838 type of preview_url itself (omitted if undeterminable) "media_type": "string", // RFC 6838 type of the ORIGINAL asset; present iff succeeded "inline_skipped": "string", // present iff URL ok but inlining was skipped "error": "string" // present iff URL fetch failed } ] } ``` The response carries one `{ type: "image", mimeType, data }` content block per successfully inlined asset, in the same order as `items`. **Errors** - Per-asset: failed items carry an `error`; inlining failures carry `inline_skipped`. The rest still succeed. - The per-call 8 MB inline budget: once reached, remaining assets fall back to URL-only with `inline_skipped: "batch ... cap reached"`. --- ## See also - [Generation tools](../tools/generation.md) — submit generations and discover output `asset_id`s with `zencreator_get_call_result`. - [Workflows](../workflows.md) — end-to-end upload → generate → fetch recipes. - [Concepts](../concepts.md) — the shared response, pagination, and credits contracts. --- # Templates Source: https://mcp.zencreator.pro/docs/tools/templates.md # Template tools Templates (a.k.a. presets) are pre-built input bundles for ZenCreator generation. Each template pairs a specific generation tool (the `tool_name` you pass to [`zencreator_create_task`](../tools/generation.md)) with a ready-to-submit `input` object plus tags describing the use case. Recommending a template is usually faster and more reliable than asking the user to fill out a raw tool input from scratch. There are two ways to find a template: - **List + filter** — [`zencreator_list_templates`](#zencreator_list_templates), when the user's intent maps to a tool or a tag. - **Semantic search** — [`zencreator_search_templates`](#zencreator_search_templates), when the user describes what they want in free-form language. This is part of an **optional** subsystem that may not be enabled on every deployment. Either way, the recommended chain is the same: > **search / list → `get_template` (or `get_template_card`) → `use_template`** All tools accept a `response_format` argument (`"markdown"` default, or `"json"`) and always return a full machine-readable `structuredContent` object. List tools use the standard pagination envelope. See [Workflows](../workflows.md) for end-to-end examples. --- ## zencreator_list_templates Return a paginated list of public generation templates, summary fields only (no `input`/`output` payloads — fetch those with [`zencreator_get_template`](#zencreator_get_template)). **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `tool_name` | string | no | — | Filter to templates for one generation tool (e.g. `flux`). Use [`zencreator_list_tools`](../tools/generation.md) for valid names. | | `tags` | string[] | no | — | Filter by tag overlap. Matches against BOTH `tool_tags` (model/tech tags like `flux`, `sdxl`, `kling`) AND `purpose_tags` (use-case tags like `avatar`, `product`, `anime`, `photoreal`, `video`, `lipsync`). Logical OR — any template touching any provided tag is returned. Tags are free-form strings, not a fixed enum. | | `sort_by` | string | no | `popularity` | One of `default`, `popularity`, `new_first`, `new_first_popularity`. `popularity` surfaces battle-tested presets first; `new_first_popularity` is best when the user wants something fresh. | | `is_nsfw` | boolean | no | — | Filter by the NSFW flag. Omit unless the user has explicitly opted in to NSFW content. | | `limit` | number | no | `20` | Page size, 1–100. | | `offset` | number | no | `0` | Items to skip, ≥0. Prefer offsets that are multiples of `limit` for clean page boundaries. | | `response_format` | string | no | `markdown` | `markdown` or `json`. | **Returns** — the standard pagination envelope; each item is a template summary. ```jsonc { "total": number, "count": number, "offset": number, "items": [ { "id": string, // pass to get_template / use_template "name": string|null, "tool_name": string, // the generation tool the template drives "version": string, // template version (NOT tool version) "tool_tags": string[]|null, "purpose_tags": string[]|null, "uses_count": number, // popularity signal "likes_count": number, "is_new": boolean, // freshly added in the last week "is_nsfw": boolean } ], "has_more": boolean, "next_offset": number // present only when has_more is true } ``` To page, pass `next_offset` back as `offset`. **Errors** - No matches: returns an empty `items` list (not an error) — relax `tags`, drop `tool_name`, or try [`zencreator_search_templates`](#zencreator_search_templates). - Unsure which tags exist: call with `sort_by="popularity"` and inspect the tags on the top results to discover live vocabulary. **Example** — "Show me the most popular anime avatar presets." → the agent calls `zencreator_list_templates` with `tags: ["anime", "avatar"]` and `sort_by: "popularity"`. --- ## zencreator_get_template Return the full template by id, including the ready-to-submit `input` payload and an example `output`. The `input` field is a complete payload for the template's `tool_name`. Pass it (optionally merged with user overrides) as `inputs[0]` to [`zencreator_create_task`](../tools/generation.md), or let [`zencreator_use_template`](#zencreator_use_template) do it in one shot. The `output` field is an EXAMPLE of what generation returns — useful for showing the user a reference before they commit credits. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `template_id` | string (UUID) | yes | — | Template UUID, e.g. from `zencreator_list_templates` or `zencreator_search_templates`. | | `response_format` | string | no | `markdown` | `markdown` or `json`. | **Returns** — the full template: ```jsonc { "id": string, "name": string|null, "tool_name": string, // pass to zencreator_create_task "version": string, // template version, NOT tool version "input": object, // ready-to-submit payload (see above) "output": unknown, // example output (asset ids, urls, etc.) "tool_tags": string[]|null, "purpose_tags": string[]|null, "uses_count": number, "likes_count": number, "is_liked": boolean, "is_new": boolean, "is_nsfw": boolean, "registered_only": boolean, "website_only": boolean, "new_badge_set_at": string|null, "trust_access": string } ``` **Errors** - `404` — `template_id` not found, not public, or the user lacks access (NSFW / trusted gating). List with [`zencreator_list_templates`](#zencreator_list_templates) first. - `401` — an NSFW template was requested by a user whose account has `nsfw_allowed` off. Enable adult content in ZenCreator account settings, then retry. - Stale version: if the template's `version` is older than the current tool schema, a later `zencreator_create_task` may return `422`. Fall back to [`zencreator_get_tool_schema`](../tools/generation.md) and ask the user which fields to update. **Example** — "What does template `…` actually do, and what will it cost?" → the agent calls `zencreator_get_template` to inspect the `input`, then [`zencreator_estimate_price`](../tools/generation.md) on that input before confirming the cost. --- ## zencreator_use_template One-shot: fetch a template, shallow-merge optional overrides into its `input`, submit a single-call generation task with the template's `tool_name`, and bump the template's `uses_count`. This is the "generate me something like THIS" shortcut — prefer it over manually orchestrating `get_template` → `create_task` when the user has picked a template. What it does, in order: 1. Fetch the template (read its `tool_name` + `input`). 2. Shallow-merge `overrides` over `template.input` (overrides win on top-level keys). 3. Submit a single-call task with `tool_name = template.tool_name`. 4. Increment the template's use counter (best-effort; a failure here does NOT fail the call). 5. Return the task id — poll with [`zencreator_get_task`](../tools/generation.md). **Overrides are a SHALLOW merge.** Top-level fields in `overrides` REPLACE the matching top-level fields in `template.input`; nested objects are replaced wholesale, not deep-merged. If you need a deep edit, fetch with [`zencreator_get_template`](#zencreator_get_template), edit the input client-side, and call [`zencreator_create_task`](../tools/generation.md) directly. **This tool is NOT idempotent** — every call creates a new task and spends credits. Confirm with the user before retrying on a transient error, and estimate the cost first (see [Credits](../workflows.md)). **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `template_id` | string (UUID) | yes | — | Template UUID to run. | | `overrides` | object | no | — | Top-level fields that REPLACE the matching fields in `template.input`. Shallow merge. Common use: `{ "prompt": "…" }` or `{ "num_images": 4 }`. | | `comment` | string | no | `via template ` | Free-form note attached to the task. Max 500 characters. | | `response_format` | string | no | `markdown` | `markdown` or `json`. | **Returns** ```jsonc { "template_id": string, "task_id": string, // poll with zencreator_get_task "tool_name": string, "status": "created" | "processing" | "partial" | "completed" | "failed", "total": number, "done": number, "created_at": string, "comment": string|null, "overrides_applied": string[] // top-level override keys that were merged } ``` **Errors** - `404` (fetch phase) — `template_id` not found / not public / NSFW gated. List with [`zencreator_list_templates`](#zencreator_list_templates). - `402` (submit phase) — insufficient credits. The error result carries a structured `out_of_credits` signal (`error_code: "insufficient_credits"`, `purchase_url`, `message`). Relay the message and link to the user verbatim, then have them top up at . - `422` (submit phase) — the merged input does not satisfy the tool's current `input_schema` (the template version may be stale). Inspect with [`zencreator_get_template`](#zencreator_get_template) + [`zencreator_get_tool_schema`](../tools/generation.md). - `429` — rate-limited. Back off and retry. **Example** — "Use that product-photo preset but with my prompt 'matte black headphones on concrete'." → the agent calls `zencreator_use_template` with `overrides: { "prompt": "matte black headphones on concrete" }`, then polls the returned `task_id`. --- ## Optional: template search (not enabled on every deployment) The three tools below belong to the optional preset-search subsystem. They are only registered when the server is configured for it; on deployments without it, these tools are simply absent from the tool list. Everything above (`list` / `get` / `use`) is always available. If a search tool isn't present, fall back to [`zencreator_list_templates`](#zencreator_list_templates). These tools read a synthesized catalog directly and bypass the live ZenCreator API. Use them to find and understand templates; then continue with the always-available [`zencreator_get_template`](#zencreator_get_template) / [`zencreator_use_template`](#zencreator_use_template) to submit. Recommended chain when search is available: > `search_templates` → `get_template_card` (understand) and/or `get_template` (raw payload) → `use_template` (submit) --- ### zencreator_search_templates Semantic + keyword hybrid search over the synthesized template catalog. Use this when the user describes what they want in free-form language and the intent is too fuzzy for tag-based filtering with [`zencreator_list_templates`](#zencreator_list_templates). **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `query` | string | yes | — | Free-form natural-language description of what to produce. | | `available_inputs` | string[] | no | — | Assets the user already has. Allowed values: `face_photo`, `body_photo`, `image`, `audio_clip`, `video_clip`. Templates whose `input_requirements` aren't satisfied are filtered out (e.g. lipsync templates need `audio_clip`). | | `output_type` | string | no | inferred from query | Override the auto-detected output type. One of `image`, `image_set`, `video`. | | `max_nsfw` | string | no | `explicit` | NSFW ceiling. One of `none`, `suggestive`, `explicit`. Lower this if the user hasn't opted into adult content. | | `top_k` | number | no | `6` | How many top hits to return after rerank, 1–24. | | `response_format` | string | no | `markdown` | `markdown` or `json`. | **Returns** ```jsonc { "hits": [ { "template_id": string, // pass to get_template / get_template_card / use_template "name": string|null, "tool_name": string|null, // which generation tool this drives "output_type": string|null, "nsfw_level": "none"|"suggestive"|"explicit", "input_requirements": string[], "what_it_creates": string, "what_you_provide": string, "best_for": string, "style_tags": string[], "uses_count": number, "previews": [{ "url": string, "kind": string }], "cosine": number // raw cosine similarity (0..1, higher = closer) } ], "top_score": number, // best cosine in the result set "confident": boolean, // true iff top cosine is strong enough "detected_output_type": string|null, "intended_tools": string[], // tools the query implies via intent rules "requested_acts": string[], // adult-act tags the query mentioned (if any) "act_coverage": { "": number } // how many surviving hits cover each requested act } ``` When `confident` is `false`, the catalog has no strong match — be honest with the user. Ask a clarifying question or surface the closest one or two hits as approximate rather than overselling weak results. **Errors** - Not registered: if the search subsystem isn't configured on this deployment, the tool is absent from the tool list — use [`zencreator_list_templates`](#zencreator_list_templates) instead. - Empty / weak results: check the index with [`zencreator_search_index_status`](#zencreator_search_index_status), or relax `max_nsfw` / `available_inputs`. **Example** — "Find me a preset that animates my photo into a short dancing clip." → the agent calls `zencreator_search_templates` with `query: "animate my photo into a short dancing video"` and `available_inputs: ["image"]`. --- ### zencreator_get_template_card Return one template's synthesized card — the distilled semantic representation used by search. This complements (does NOT replace) [`zencreator_get_template`](#zencreator_get_template), which returns the raw `input`/`output` JSON. Use the card to UNDERSTAND a template before deciding to fetch and submit it. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `template_id` | string (UUID) | yes | — | Template / preset UUID. | | `response_format` | string | no | `markdown` | `markdown` or `json`. | **Returns** ```jsonc { "template_id": string, "name": string|null, "tool_name": string|null, "output_type": string|null, "nsfw_level": "none"|"suggestive"|"explicit", "meaning": string, // what the preset is, in plain language "what_it_creates": string, "what_you_provide": string, "best_for": string, "searchable_paragraph": string, // longer prose used by the index "tags": string[], "input_requirements": string[], // slot names like 'face_photo', 'audio_clip' "uses_count": number, "public": boolean, "previews": [{ "url": string, "kind": string }], "status": "ready"|"described", // 'described' = present but not yet indexed "described_at": string|null, "embedded_at": string|null } ``` **Errors** - `template_id` not in the synthesized catalog (e.g. brand new or never ingested): returns an error result. Fall back to [`zencreator_get_template`](#zencreator_get_template), which reads the live ZenCreator API and always works. - Not registered: tool absent when the search subsystem isn't configured. **Example** — "Explain what template `…` does before I run it." → the agent calls `zencreator_get_template_card` to read `meaning`, `what_you_provide`, and `best_for`. --- ### zencreator_search_index_status Diagnostic. Report the current state of the search index: how many templates are indexed, when it was last refreshed, embedding dimensionality, the configured embedding model, and whether rerank is enabled. Use it when [`zencreator_search_templates`](#zencreator_search_templates) returns weak or empty results to confirm the index has data and is configured as expected. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `response_format` | string | no | `markdown` | `markdown` or `json`. | **Returns** ```jsonc { "n_ready": number, // indexed templates (status='ready' AND embedding present) "vectors_built": string|null, // timestamp of the latest 'ready' row's update "dim": number, // embedding vector dimensionality "embed_model": string, // configured embedding model (must match the index) "rerank_enabled": boolean } ``` **Errors** - Not registered: tool absent when the search subsystem isn't configured. **Example** — "Search keeps coming back empty — is the index actually loaded?" → the agent calls `zencreator_search_index_status` and checks `n_ready` and `vectors_built`. --- ## See also - [Generation tools](../tools/generation.md) — `zencreator_create_task`, `zencreator_use_template`'s downstream tool, plus `zencreator_estimate_price`, `zencreator_get_tool_schema`, `zencreator_get_task`. - [Workflows](../workflows.md) — end-to-end examples that wire templates into a full generation flow. --- # Account Source: https://mcp.zencreator.pro/docs/tools/account.md # Account & Credits Tools API reference for the MCP tools that report on the signed-in ZenCreator account: profile, credit balance, and the credit-spend ledger. These tools never spend credits — they are read-only. There are two tools in this group: - [`zencreator_get_me`](#zencreator_get_me) — profile + current credit balance + account flags. - [`zencreator_list_credit_transactions`](#zencreator_list_credit_transactions) — paginated history of credit movements. > Identity is bound to your MCP session by OAuth — there is no `user_id` argument to pass. > Both tools always report on *you*, the authenticated user. See [Concepts](../concepts.md) > for how the session is established. ## Standard response contract Every tool in this group takes a `response_format` argument (`"markdown"` default, or `"json"`) and always returns a full machine-readable `structuredContent` object in addition to the text payload. `"markdown"` gives a human-readable summary; `"json"` returns the raw payload as text. Clients with output-schema support get the complete `structuredContent` either way. Responses over ~25,000 characters are truncated with a hint to paginate or switch to `response_format:"json"`. --- ## zencreator_get_me Return the authenticated user's profile and current credit balance. Use it to check available credits before submitting a generation, to confirm the account is active and allowed adult content, and to read the stable `out_of_credits` flag. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `response_format` | string | No | `"markdown"` | Output format: `"markdown"` (human-readable summary) or `"json"` (raw payload as text). `structuredContent` is returned either way. | **Returns** — `structuredContent` shape: ```json { "id": "string", "email": "string | null", "credits": 0, "role": "string", "is_blocked": false, "nsfw_allowed": false, "active": false, "is_paying": false, "is_trusted": false, "out_of_credits": false, "purchase_url": "string | null" } ``` Field notes: - `id` — your account UUID. Internal; do not surface it in normal replies. - `email` — account email, or `null`. - `credits` — current credit balance (integer). - `role` — account role (e.g. `user`, `admin`). Internal/diagnostic. - `is_blocked` — `true` if the account is blocked; all generations fail until lifted. Internal/diagnostic. - `nsfw_allowed` — whether adult content is enabled on the account. **User-actionable** (see below). - `active` — whether the account is active. Internal/diagnostic. - `is_paying` — whether the account is a paying account. Internal/diagnostic. - `is_trusted` — whether the account may use the trusted-only models (models marked **(trusted)** in [Models](../models.md)). Internal/diagnostic. - `out_of_credits` — `true` when the balance is exhausted. A stable flag to branch on instead of parsing prose. - `purchase_url` — billing link, populated **only** when `out_of_credits` is `true`; otherwise `null`. The default surfaced answer is just **email and credits**. The fields tagged internal/diagnostic are decision flags for the agent, not facts to read back to the user verbatim — don't print "Role: …" / "Status: …" / "Flags: …" unless the user explicitly asks for that exact field. `nsfw_allowed` is the exception — it is user-actionable. If `nsfw_allowed` is `false` and the user is asking for an NSFW generation, tell them: "Adult content is disabled on your ZenCreator account; enable it in account settings, then retry." Do not silently downgrade an NSFW request to SFW — that hides the real reason and wastes credits. If `nsfw_allowed` is `true`, say nothing about it. The `"markdown"` response already surfaces this warning automatically when the flag is `false`; pass it through as-is. The markdown form likewise surfaces automatic warnings when `out_of_credits` or `is_blocked` is `true`. **Out of credits.** When `out_of_credits` is `true`, tell the user their balance is empty and give them the `purchase_url` link to top up at . This is the **same** structured signal (`out_of_credits` + `purchase_url`) that any generation tool attaches when it fails with insufficient credits (see [The out-of-credits signal](#the-out-of-credits-signal)), so the message reads identically whether you check ahead or hit it mid-generation. Surface it as-is rather than rephrasing. **Errors** - `401` — the MCP session is no longer authorized. The user must re-authorize the server (re-run the OAuth login in their client). See [Troubleshooting](../troubleshooting.md). **Example** > "How many credits do I have?" — the agent calls `zencreator_get_me` and reports the `credits` field. > Before a generation, the agent calls `zencreator_get_me` and compares `credits` against the > price from [`zencreator_estimate_price`](../tools/generation.md) before confirming the cost with you. --- ## zencreator_list_credit_transactions Return a paginated list of the current user's credit transactions, newest first. Use it to audit how credits were spent, to find the cost of a specific past task, or to confirm that a top-up was credited. **Parameters** | Parameter | Type | Required | Default | Description | |---|---|---|---|---| | `limit` | number | No | `20` | Page size, `1`–`100`. | | `offset` | number | No | `0` | Number of items to skip, `≥ 0`. To page, pass the previous response's `next_offset` back as `offset`. | | `response_format` | string | No | `"markdown"` | Output format: `"markdown"` or `"json"`. `structuredContent` is returned either way. | **Returns** — the canonical paginated envelope as `structuredContent`: ```json { "total": 0, "count": 0, "offset": 0, "items": [ { "id": "string", "amount": 0, "resulting_amount": 0, "source": "string", "created_at": "string", "meta": null } ], "has_more": false, "next_offset": 0 } ``` Envelope keys: - `total` — total number of transactions for the account. - `count` — number of items in this page. - `offset` — the offset this page was fetched at. - `items` — the transactions on this page (see below). - `has_more` — `true` if more pages remain. - `next_offset` — offset to pass back to fetch the next page; present only when `has_more` is `true`. Per-item fields: - `id` — transaction UUID. - `amount` — signed credit movement: **positive = credit added** (top-up, refund, promo), **negative = debit** (a charge for a generation). - `resulting_amount` — the account balance immediately after this transaction. - `source` — what produced the transaction, e.g. `task`, `call`, `stripe`, `airdrop`, `refund`. - `created_at` — ISO 8601 timestamp. - `meta` — free-form object or `null`. For charges it usually carries the originating `task_id` or `call_id`, which lets you map a debit back to a specific generation. **Errors** - `401` — the MCP session is no longer authorized. The user must re-authorize the server. See [Troubleshooting](../troubleshooting.md). **Example** > "Show my last 5 charges" — the agent calls with `limit=5` and reports the items where `amount` is negative. > "Did my top-up go through?" — the agent scans recent items for a positive `amount` with `source` `stripe`. --- ## The out-of-credits signal ZenCreator surfaces "out of credits" the same way everywhere, so it reads identically whether you check ahead with `zencreator_get_me` or run into it mid-generation. When a generation runs out of credits, the backend returns **HTTP 402** and the tool result carries this structured payload: ```json { "error_code": "insufficient_credits", "out_of_credits": true, "purchase_url": "https://app.zencreator.pro/billing", "message": "You're out of ZenCreator credits. Top up at https://app.zencreator.pro/billing to keep generating." } ``` `zencreator_get_me` exposes the same flag proactively: when the balance is exhausted it sets `out_of_credits: true` and populates `purchase_url` with the same billing link (and `null` while the account is in credit). Branch on `out_of_credits` rather than parsing the message text, and when it is `true`, direct the user to top up at . To avoid hitting a 402 at all, estimate cost first with `zencreator_estimate_price` (or shop models with `zencreator_compare_prices`) and state the cost before submitting — see [Generation tools](../tools/generation.md). For deeper diagnosis of credit and NSFW issues, see [Troubleshooting](../troubleshooting.md). ## See also - [Concepts](../concepts.md) — sessions, tasks, calls, assets, and credits. - [Troubleshooting](../troubleshooting.md) — out of credits, NSFW disabled, re-authorization. - [Generation tools](../tools/generation.md) — pricing, estimation, and task submission. --- # Troubleshooting Source: https://mcp.zencreator.pro/docs/troubleshooting.md # Troubleshooting Common problems and how to fix them. Each entry follows the same shape: **symptom -> cause -> fix.** Errors from ZenCreator tools come back as tool results, not crashes — your client sees a short, actionable message telling it what to try next. The notes below explain what each one means and how to recover. --- ## "Out of credits" (HTTP 402) **Symptom.** A generation tool fails and the result says you're out of ZenCreator credits, or a tool returns a `structuredContent` payload like: ```json { "error_code": "insufficient_credits", "out_of_credits": true, "purchase_url": "https://app.zencreator.pro/billing", "message": "You're out of ZenCreator credits. Top up at https://app.zencreator.pro/billing to keep generating." } ``` **Cause.** Generation spends credits, and your balance reached zero. The backend returns HTTP 402 with the structured signal above. **Fix.** Top up at [https://app.zencreator.pro/billing](https://app.zencreator.pro/billing), then retry the generation. **Avoid it next time.** The same `out_of_credits` flag and `purchase_url` also appear in `zencreator_get_me`, so you can check your balance proactively before submitting work. And always price a job before you commit to it: call `zencreator_estimate_price` for one candidate, or `zencreator_compare_prices` to shop across a generation tool's models (cheapest first). See [./tools/account.md](./tools/account.md). --- ## "Adult content is disabled" / NSFW request refused **Symptom.** An NSFW generation is rejected, or a model you asked for isn't allowed on your account. **Cause.** Two account gates control uncensored generation: - `nsfw_allowed` — adult content must be enabled on the account. - `is_trusted` — required for models marked **(trusted)**. Both are reported by `zencreator_get_me`. If `nsfw_allowed` is `false`, the request is refused before any credits are spent. **Fix.** - If `nsfw_allowed` is `false`: enable adult content in your ZenCreator account settings at [https://app.zencreator.pro](https://app.zencreator.pro), then retry. - If the tool or model is **(trusted)** / 🔒 and you aren't trusted yet: Trusted Status is granted **automatically after your first successful payment** (buy any credit pack in Billing) and is permanent — make that first payment, or pick a non-trusted model for the same generation tool. Use `zencreator_get_tool_schema` to see which models a generation tool offers. If your orchestrating client refuses to author explicit prompts, the optional `zencreator_craft_prompt` helper (present only on deployments with the prompt-agent sidecar) can write model-specific NSFW prompts for you — it spends no ZenCreator credits. See [./tools/generation.md](./tools/generation.md). --- ## Connector shows "disconnected" or returns 401 **Symptom.** The ZenCreator connector reads as disconnected, tools stop appearing, or a call comes back with an authentication failure ("re-authorize with the ZenCreator MCP server"). **Cause.** Your access token expired and couldn't be refreshed, or the authorization was revoked. The MCP server is OAuth-only — every request needs a valid, audience-bound token. **Fix.** Re-run the OAuth login. Tokens normally refresh automatically; you only need to do this when the grant was revoked or refresh failed. - **Claude Code:** start `claude`, run `/mcp`, pick `zencreator`, choose **Authenticate**, approve in the browser. Check state with `claude mcp list` (shows "Needs authentication" until you log in). See [./connect/claude-code.md](./connect/claude-code.md). - **Claude Desktop / Claude.ai (web):** reconnect the custom connector in **Settings -> Connectors** and complete the browser login again. See [./connect/claude-ai.md](./connect/claude-ai.md). - **Cursor:** trigger the server again so it re-runs the browser OAuth login. See [./connect/cursor.md](./connect/cursor.md). - **ChatGPT:** reconnect the connector under **Settings -> Connectors** and complete the OAuth login. See [./connect/chatgpt.md](./connect/chatgpt.md). There are no API keys to rotate — the whole flow happens in your browser. --- ## Video generation times out **Symptom.** A video job (e.g. `videogen`, `text_to_video`, `video2video`, `lipsync`, `video_upscaler`) hangs or the request aborts before finishing. **Cause.** Video takes far longer than images (typically ~60-180s). `zencreator_run_and_wait` blocks until the job reaches a terminal status — fine for images this turn, but too slow for video, so the call can time out. **Fix.** Don't wait synchronously for video. Instead: 1. Submit with `zencreator_create_task` — it returns a task id immediately. 2. Poll `zencreator_get_task` until the call reaches a terminal status (space your polls — see the rate-limit note below). 3. Fetch the result with `zencreator_get_call_result` to get the full output and the generated `asset_id`s (per-call output is lazy and is `null` while polling). Reserve `zencreator_run_and_wait` for images. See [./tools/generation.md](./tools/generation.md). --- ## Rate limited (HTTP 429) **Symptom.** A tool result says the rate limit was exceeded and to back off. **Cause.** Too many requests in a short window — most often tight polling loops on `zencreator_get_task` or `zencreator_get_processing_tasks`. **Fix.** Back off and retry after a few seconds. Space out polling — wait at least **2 seconds** between polls — and prefer `zencreator_get_processing_tasks` as a cheap "is anything still running?" check instead of hammering `zencreator_get_task`. --- ## Images don't show up in the chat **Symptom.** A generation succeeds but no image appears in the conversation. **Cause.** Some clients only render MCP images inside the tool-result panel, which can be collapsed by default — the image is there, just hidden. **Fix.** - Expand the tool-result panel to view the inline image. - Or call `zencreator_get_asset_preview_url` with the inline option, which attaches the preview image as an image content block so it renders directly in chat. Inline previews are capped at **2 MB per image** and **8 MB total per call**; above that the tool falls back to returning a URL with a note. - Or open the original via `zencreator_get_asset_download_url` (presigned). For many assets at once, use the batch variants (`zencreator_get_asset_preview_urls` / `zencreator_get_asset_download_urls`). See [./tools/assets.md](./tools/assets.md). --- ## Response got truncated **Symptom.** A long tool response ends with a truncation note saying to paginate or switch format. **Cause.** Text responses larger than ~25,000 characters are trimmed to keep the payload manageable. **Fix.** - For list tools, paginate: pass `limit` (1-100, default 20) and `offset` (default 0), then feed the returned `next_offset` back as `offset` for the next page. - Or set `response_format: "json"` for a more compact raw payload. - Either way, the full data is always in the `structuredContent` object, so clients with output-schema support already have everything regardless of the text format. --- ## Validation error (HTTP 422) **Symptom.** A tool result says validation failed — commonly on `zencreator_create_task` or `zencreator_run_and_wait`. **Cause.** Your input didn't match the generation tool's schema (wrong field name, missing required field, an out-of-range value, or an invalid model/enum). **Fix.** Re-check your input against the schema. Call `zencreator_get_tool_schema` for the generation tool you're submitting (e.g. `by_prompt`, `image_editor`, `faceswap`) — it returns the full input/output JSON Schema plus prompt and model guidance. Fix the offending fields and resubmit. See [./tools/generation.md](./tools/generation.md). A related **HTTP 400 (Bad request)** has the same remedy: check the input fields against the tool's input schema. --- ## See also - [./tools/account.md](./tools/account.md) — credits, balance, `zencreator_get_me`, transaction history. - [./tools/generation.md](./tools/generation.md) — submitting jobs, polling, schemas, models. - [./tools/assets.md](./tools/assets.md) — previews, downloads, inline images. - Connect guides: [Claude Code](./connect/claude-code.md) · [Claude.ai / Desktop](./connect/claude-ai.md) · [Cursor](./connect/cursor.md) · [ChatGPT](./connect/chatgpt.md).