Generate images and videos from Claude, Cursor, or any MCP-compatible client — using your Visiojoy account and credits.
generate_image, generate_video, remove_background, upscale_image) and three free, read-only ones (get_task_result, list_models, get_credit_balance).https://mcp.visiojoy.comSettings → Connectors → Add custom connector, paste the URL above, then click Connect and sign in to Visiojoy.
claude mcp add --transport http visiojoy https://mcp.visiojoy.comThen run /mcp inside Claude Code and choose visiojoy to sign in.
{
"mcpServers": {
"visiojoy": {
"url": "https://mcp.visiojoy.com/mcp"
}
}
}The client opens a browser window to sign in the first time a tool is used. Both https://mcp.visiojoy.com and /mcp work as the endpoint.
You normally just ask your assistant in plain language and it fills in the tool call. These are the calls it sends, with the credits each one costs today.
“What's the cheapest video model, and can I afford a 10-second clip?” — the assistant calls list_models with {"category": "video"} and get_credit_balance, both free, then answers before spending anything.
“Make a 16:9 2K hero image of a ceramic coffee mug on a sunlit wooden table with Nano Banana 2.1.” — 5 credits
{
"prompt": "A ceramic coffee mug on a sunlit wooden table, soft morning light, product photo",
"model": "nano-banana-2-1",
"size": "16:9",
"quality": "2K"
}“Put this product on a marble kitchen counter.” — 3 credits
{
"prompt": "Place the product on a white marble kitchen counter, keep the label unchanged",
"images": [
"https://example.com/product.jpg"
],
"model": "nano-banana-2-1-edit",
"quality": "1K"
}“Cut out the person in this photo.” — calls remove_background, 1 credit
{
"image": "https://example.com/portrait.png"
}“Make a 5-second 720p clip of waves rolling onto a beach at sunset with Seedance 2.0 Fast.” — 125 credits
{
"prompt": "Slow waves rolling onto a sandy beach at sunset, gentle camera push-in",
"model": "bytedance/seedance-2-fast",
"resolution": "720p",
"duration": 5,
"aspectRatio": "16:9"
}“Turn this product photo into a slow 360° turntable video.” — 40 credits
{
"prompt": "The product rotates slowly on a turntable, soft studio lighting",
"images": [
"https://example.com/product.jpg"
],
"model": "wan/3-0-video",
"resolution": "480p",
"duration": 5
}Generation complete (text-to-image / nano-banana-2-1), 1 image(s) total.
resource_link image-1 https://…/generations/…/0.pngOr, if the image is not ready within about 16 seconds:
Task is still processing (taskId: …). You can use the get_task_result tool with this taskId to check again.generate_video always returns a taskId right away:
Video task submitted (taskId: …). Seedance 2.0 Fast, text-to-video, 720p, 5s — 125 credits reserved, charged only if the video is delivered. Videos usually take a few minutes: call get_task_result with this taskId to fetch it.Then, from get_task_result:
Generation complete (text-to-video / bytedance/seedance-2-fast), 1 video(s) total.
resource_link video-1 https://…/generations/…/0.mp4Generate an image from text, or edit/transform an existing image. Consumes Visiojoy credits.
| Parameter | Type | Description |
|---|---|---|
| prompt | string | What to generate, or how to change the input image. Required for text-to-image. |
| images | string[], up to 4 | Input image(s) as public http(s) URLs or base64 data URLs. Providing this switches to image editing / image-to-image and uses the image editing model list; omitting it runs text-to-image. Some models accept fewer images (see Max inputs below). |
| model | string | Model ID from list_models or the tables below. Defaults to gpt-image-1.5 for text-to-image and gpt-image-1.5-edit for editing. |
| size | string | Aspect ratio, e.g. 1:1, 16:9. Use one of the ratios listed for the model; a missing or unsupported value falls back to the model's default ratio. |
| quality | string | Quality or resolution tier, e.g. high or 2K. Use one of the values listed for the model; defaults to the first value listed. This value decides the credit cost. |
| nVariants | 1 | 2 | 4 | Kept for compatibility. Every current model returns one image per call and values above 1 are treated as 1, so you are only charged for one image. Call the tool again for more variations. |
| isPublic | boolean | Whether the result appears in the Visiojoy public gallery. Defaults to false. |
| copyProtection | boolean | Whether to hide the prompt and source image when the result is public. Defaults to false. |
Start a video from text, or animate an image. Returns a taskId right away; fetch the video with get_task_result. Charged per second of video — see Video costs.
| Parameter | Type | Description |
|---|---|---|
| prompt | string | What happens in the video. Required for text-to-video (3–2500 characters) and for most models when animating an image. |
| images | string[], up to 7 | Image to animate, as a public http(s) URL or base64 data URL. Providing it switches to image-to-video. Most models take one image as the first frame; Grok Imagine takes several reference images. |
| lastFrame | string | Optional end frame, on models marked “+ optional lastFrame”. Requires images. |
| model | string | Video model ID from list_models or the table below; the same ID works with or without images. Defaults to bytedance/seedance-2. |
| resolution | string | Output resolution, e.g. 480p or 720p. Defaults to the model's cheapest resolution, not the website default. |
| aspectRatio | string | Aspect ratio, e.g. 16:9 or 9:16. Must be one the model lists; defaults to the model's default. |
| duration | integer | Length in seconds, within the model's range. Defaults to the model's default length. Cost scales with every second. |
| generateAudio | boolean | Generate a soundtrack, on models that support it. Defaults to the model's default. |
| maxCredits | integer | Spending cap for this call. If the video would cost more, nothing is submitted or charged and the error states the exact cost. Defaults to 300. |
| isPublic | boolean | Whether the result appears in the Visiojoy public gallery. Defaults to false. |
| copyProtection | boolean | Whether to hide the prompt and source image when the result is public. Defaults to false. |
One image in, one processed image out: a transparent-background cutout, or a sharper higher-resolution copy. No prompt or model to choose. See prices and access.
| Parameter | Type | Description |
|---|---|---|
| image | string | The image to process, as a public http(s) URL or a base64 data URL. |
| isPublic | boolean | Whether the result appears in the Visiojoy public gallery. Defaults to false. |
Free. With no arguments it returns a one-line summary per model — ID, price range and whether your account can use it — so it stays small in your assistant's context. Pass a category or a model ID for the full options; the data matches the tables below.
| Parameter | Type | Description |
|---|---|---|
| category | string | Optional: text-to-image, image-edit, video or utility. Returns pricing and main options for that category. |
| model | string | Optional: one model ID. Returns every option for that model, including aspect ratios and input limits. |
Free, no parameters. Returns the credits you can spend right now (split into subscription, free and credit pack credits) and your access level, so the assistant can check you can afford a generation before starting it.
Fetch a video, or an image that was still processing when generate_image returned. Calling it again is free and never charges twice.
| Parameter | Type | Description |
|---|---|---|
| taskId | string | The taskId returned by generate_video, or by generate_image when the image was still processing. |
Pass the model ID as model. For images, pass one of its listed values as quality; prices are per image. Videos are priced per second. All prices match the Visiojoy website. New accounts get 12 free credits; see pricing for plans and credit packs. Your assistant can fetch the same data with list_models.
size: 1:1, 4:3, 3:2, 2:3, 3:4, 9:16, 16:9, 21:9, 9:21
size: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, auto
size: 1:1, 2:3, 3:2
size: Not supported; describe the framing in the prompt
size: 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9, auto
size: 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9, auto
size: 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto
size: 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto
size: 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto
size: 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9
size: 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9
size: 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9
| Model ID | Access | quality → credits | size |
|---|---|---|---|
flux-2/pro-text-to-image Flux 2 Pro | After any purchase |
| 1:1, 4:3, 3:2, 2:3, 3:4, 9:16, 16:9, 21:9, 9:21 |
nano-banana-pro Nano Banana Pro | Active subscription |
| 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, auto |
gpt-image-1.5 GPT Image 1.5 · default | All accounts |
| 1:1, 2:3, 3:2 |
gpt-image-2-text-to-image GPT Image 2 | After any purchase |
| Not supported; describe the framing in the prompt |
gpt-image-2-5-flare-text-to-image GPT Image 2.5 Flare | Active subscription |
| 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9, auto |
gpt-image-2-5-sunburst-text-to-image GPT Image 2.5 Sunburst | Active subscription |
| 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9, auto |
nano-banana-2-1 Nano Banana 2.1 | All accounts |
| 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto |
nano-banana-2 Nano Banana 2 | After any purchase |
| 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto |
nano-banana-2-lite Nano Banana 2 Lite | All accounts |
| 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto |
seedream/5-pro-text-to-image Seedream 5 Pro | Active subscription |
| 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9 |
seedream/5-lite-text-to-image Seedream 5 Lite | All accounts |
| 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9 |
seedream-4.5 Seedream 4.5 | After any purchase |
| 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9 |
Max inputs: 4 · size: 1:1, 4:3, 3:2, 2:3, 3:4, 9:16, 16:9, 21:9, 9:21
Max inputs: 4 · size: 1:1, 2:3, 3:2
Max inputs: 4 · size: Not supported; describe the framing in the prompt
Max inputs: 4 · size: 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9, auto
Max inputs: 4 · size: 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9, auto
Max inputs: 4 · size: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, auto
Max inputs: 4 · size: 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto
Max inputs: 4 · size: 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto
Max inputs: 4 · size: 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto
+0.5 per input image after the first 1, rounded up once
Max inputs: 4 · size: 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9
Max inputs: 4 · size: 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9
Max inputs: 4 · size: 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9
| Model ID | Access | quality → credits | Max inputs | size |
|---|---|---|---|---|
flux-2/pro-image-to-image Flux 2 Pro | After any purchase |
| 4 | 1:1, 4:3, 3:2, 2:3, 3:4, 9:16, 16:9, 21:9, 9:21 |
gpt-image-1.5-edit GPT Image 1.5 · default | All accounts |
| 4 | 1:1, 2:3, 3:2 |
gpt-image-2-image-to-image GPT Image 2 | After any purchase |
| 4 | Not supported; describe the framing in the prompt |
gpt-image-2-5-flare-image-to-image GPT Image 2.5 Flare | Active subscription |
| 4 | 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9, auto |
gpt-image-2-5-sunburst-image-to-image GPT Image 2.5 Sunburst | Active subscription |
| 4 | 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9, auto |
nano-banana-pro-edit Nano Banana Pro | Active subscription |
| 4 | 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, auto |
nano-banana-2-1-edit Nano Banana 2.1 | All accounts |
| 4 | 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto |
nano-banana-2-edit Nano Banana 2 | After any purchase |
| 4 | 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto |
nano-banana-2-lite-edit Nano Banana 2 Lite | All accounts |
| 4 | 1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto |
seedream/5-pro-image-to-image Seedream 5 Pro | Active subscription |
+0.5 per input image after the first 1, rounded up once | 4 | 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9 |
seedream/5-lite-image-to-image Seedream 5 Lite | All accounts |
| 4 | 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9 |
seedream-4.5-edit Seedream 4.5 | After any purchase |
| 4 | 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9 |
Default call: 480p, 5s = 95 credits
Images: First frame + optional lastFrame
4–15s · 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive
Default call: 480p, 5s = 60 credits
Images: First frame + optional lastFrame
4–15s · 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive
Default call: 480p, 5s = 140 credits
Images: First frame + optional lastFrame
4–30s · 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive
Default call: 768p, 5s = 40 credits
Images: First frame + optional lastFrame
4–15s · 21:9, 16:9, 4:3, 1:1, 3:4, 9:16
With images: 16:9
Default call: 480p, 5s = 65 credits
Images: First frame + optional lastFrame
2–30s · adaptive, 16:9, 4:3, 1:1, 3:4, 9:16
Default call: 480p, 5s = 40 credits
Images: First frame + optional lastFrame
2–30s · adaptive, 16:9, 4:3, 1:1, 3:4, 9:16
Default call: 480p, 6s = 18 credits
Images: Up to 7 reference images (1 at 1080p)
6–30s · 2:3, 3:2, 1:1, 16:9, 9:16
| Model ID | credits / second | Default call | Images |
|---|---|---|---|
bytedance/seedance-2 Seedance 2.0 · default 4–15s · 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive |
| 480p, 5s 95 credits | First frame + optional lastFrame |
bytedance/seedance-2-fast Seedance 2.0 Fast 4–15s · 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive |
| 480p, 5s 60 credits | First frame + optional lastFrame |
bytedance/seedance-2-5 Seedance 2.5 4–30s · 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive |
| 480p, 5s 140 credits | First frame + optional lastFrame |
minimax-h3/text-to-video MiniMax H3 4–15s · 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 With images: 16:9 |
| 768p, 5s 40 credits | First frame + optional lastFrame |
wan/3-0-video-prime Wan 3.0 Prime 2–30s · adaptive, 16:9, 4:3, 1:1, 3:4, 9:16 |
| 480p, 5s 65 credits | First frame + optional lastFrame |
wan/3-0-video Wan 3.0 2–30s · adaptive, 16:9, 4:3, 1:1, 3:4, 9:16 |
| 480p, 5s 40 credits | First frame + optional lastFrame |
grok-imagine/text-to-video Grok Imagine 6–30s · 2:3, 3:2, 1:1, 16:9, 9:16 |
| 480p, 6s 18 credits | Up to 7 reference images (1 at 1080p) |
| Tool | Credits | Access | Max file size |
|---|---|---|---|
remove_background Remove Background | 1 per image | All accounts | 5 MB |
upscale_image Crisp Upscale | 1 per image | All accounts | 10 MB |
A video costs seconds × the per-second rate of the chosen resolution. That adds up quickly: Seedance 2.5 at 1080p for 30 seconds costs 4,740 credits. Because an assistant can call tools on its own, generate_video is built to avoid surprise spending:
maxCredits.generate_image waits about 16 seconds for the result before returning. There are two outcomes:
You get the image(s) directly, as downloadable links.
You get a taskId instead. This is normal for slower models or higher-resolution requests — it doesn't mean anything failed. Call get_task_result with that taskId to fetch the result once it's ready.
generate_video returns a taskId immediately — videos usually take a few minutes. Call get_task_result with it; while the video is still rendering it says so, and you can simply ask again a little later.
Errors come back as a tool result with isError: true and a readable message, so your assistant can explain the problem or retry with different settings.
Insufficient credits: this generation requires N credits
Your balance is lower than the cost of this call. Nothing was charged.
Fix: Pick a cheaper model or quality tier, or top up with a plan or credit pack.
Model "…" requires an active Visiojoy subscription.
The model is subscription-only.
Fix: Subscribe, or switch to a model available to your account.
Model "…" requires a Visiojoy subscription or a credit pack purchase.
The model unlocks after any purchase.
Fix: Buy a credit pack or subscribe, or use a model marked All accounts.
This video would cost N credits, above the maxCredits limit of 300. Nothing was charged.
The requested resolution or length costs more than the cap you set (or the default cap).
Fix: Confirm the cost, then call again with maxCredits of at least N, or lower the resolution or duration.
Unknown model "…". Supported models for …: …
The model ID is misspelled, or belongs to the other capability (for example a text-to-image ID sent together with images, or an image model sent to generate_video).
Fix: Copy the ID from the matching table below. The error lists every valid ID.
Invalid resolution / Invalid aspectRatio / Invalid duration. Allowed values: …
generate_video was given a value the chosen video model does not support.
Fix: Use a value from the error message or the video model table. Nothing was charged.
Model "…" does not accept images. / Model "…" takes one image as the first frame.
The video model is text-only, or more than one image was sent to a first-frame model.
Fix: Drop the images, send a single image (plus lastFrame if supported), or pick a model that takes images.
Missing required field: prompt
The video model needs a description of the motion, including when animating an image.
Fix: Add a prompt describing what should happen in the video.
text-to-image requires a prompt
No prompt and no images were sent.
Fix: Add a prompt, or pass images to edit.
An item in images is neither an http(s) URL nor a base64 data URL
An image was sent as a local file path or plain base64 without the data: prefix.
Fix: Send a public URL, or a full data URL such as data:image/png;base64,….
Generation failed: …
The model provider rejected or failed the task, for example a content policy block or an unsupported size or quality value.
Fix: Reserved credits are returned automatically. Adjust the prompt or parameters and try again.
No task found for taskId … / You do not have access to this task
The taskId is wrong, or it belongs to another account.
Fix: Use the exact taskId returned by generate_image or generate_video on the same account.
HTTP 401 Unauthorized
The connection was never authorized, or the sign-in has expired.
Fix: Reconnect the server in your client and sign in again.