2dai-mcp-server
MCP server for 2DAI — let Claude, Cursor, Cline and Windsurf generate images and video, upload references and organise your cloud drive on your own 2DAI account.
npm · fingerprint fa339ec4210a26ecb6cd40f9 · repository · RSS
What changed
Changed 2026-10-15 11:32 UTC
2 descriptions rewritten.
--- pinned/generate_in_artistic_style +++ observed/generate_in_artistic_style { "annotations": { "destructiveHint": false, - "description": "Artist Painter: render the prompt as a NEW work in a curated artistic style. This SPENDS the account's credit (billed like style-transfer). The subject is painted in the chosen style — unsigned unless the prompt asks for a signature. artisticStyleId comes from list_artistic_styles, or \"auto\" (default) lets the server pick the best-matching style for the prompt. Up to 3 optional subject images can anchor what gets painted. Needs a prompt OR at least one subject ref. Returns the finished creation within the wait budget, else a queueId for check_generation.", + "description": "Artist Painter: render the prompt as a NEW work in a curated artistic style. This SPENDS the account's credit (billed like style-transfer). The subject is painted in the chosen style — unsigned unless the prompt asks for a signature. artisticStyleId comes from list_artistic_styles, or \"auto\" (default) lets the server pick the best-matching style for the prompt. Up to 6 optional subject images can anchor what gets painted; the work renders on the Gen8 image engine. Needs a prompt OR at least one subject ref. Returns the finished creation within the wait budget, else a queueId for check_generation.", "execution": { "taskSupport": "forbidden" }, - "description": "Up to 3 subject images (creation ids) to place into the artistic style.", + "description": "Up to 6 subject images (creation ids) to place into the artistic style.", "items": { "maxLength": 32, "minLength": 32, - "maxItems": 3, + "maxItems": 6, "type": "array" }, "wait": {
--- pinned/generate_with_refs +++ observed/generate_with_refs { "annotations": { "destructiveHint": false, - "description": "Generate an image conditioned on existing creations. This SPENDS the account's credit. Four tools: \"face-ref\" keeps a face identity across new scenes (1-6 refs), \"character-ref\" keeps a whole character consistent (1-6 refs), \"style-transfer\" extracts the STYLE of the refs (1-3) and applies it to the prompt, \"smart-edit\" EDITS refs[0] following the prompt as the edit instruction (up to 3 extra support refs, 4 total). Reference ids come from earlier generations, upload_image or list_creations. Returns the finished creation within the wait budget, else a queueId for check_generation.", + "description": "Generate an image conditioned on existing creations. This SPENDS the account's credit. Three tools: \"character-ref\" keeps a character consistent across new scenes (1-6 refs: face shots, full-body shots or a character sheet; face photos lock the exact same face, the prompt drives outfit, pose and scene), \"style-transfer\" extracts the STYLE of the refs (1-6) and applies it to the prompt, \"smart-edit\" EDITS refs[0] following the prompt as the edit instruction (up to 5 extra support refs, 6 total). All three render on the Gen8 image engine. Reference ids come from earlier generations, upload_image or list_creations. Returns the finished creation within the wait budget, else a queueId for check_generation.", "execution": { "taskSupport": "forbidden" }, - "description": "Creation ids to condition on. face/character-ref: 1-6 identity shots. style-transfer: 1-3 style sources. smart-edit: refs[0] = the image to EDIT, plus up to 3 support refs.", + "description": "Creation ids to condition on. character-ref: 1-6 shots of the same character (face photos lock the face). style-transfer: 1-6 style sources. smart-edit: refs[0] = the image to EDIT, plus up to 5 support refs.", "items": { "maxLength": 32, "minLength": 32, - "face-ref", "character-ref", "style-transfer", "smart-edit"
Changed 2026-10-14 11:59 UTC
1 description rewritten.
--- pinned/upload_image +++ observed/upload_image { "annotations": { "destructiveHint": false, - "description": "Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation (\"use THIS image\"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_FILE_ACCESS=any. An MP3 for a Gen8 Preview video audio reference goes through upload_audio instead.", + "description": "Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation (\"use THIS image\"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp/gif, or an mp4/m4v video clip (stored as mp4; accounts allowed to upload videos only — a DRM-protected file is refused with PROTECTED_MEDIA). Paths must stay inside the working directory unless the server was started with TWODAI_FILE_ACCESS=any. An MP3 for a Gen8 Preview video audio reference goes through upload_audio instead.", "execution": { "taskSupport": "forbidden" },
Changed 2026-10-12 15:32 UTC
5 descriptions rewritten.
--- pinned/generate_image +++ observed/generate_image { "annotations": { "destructiveHint": false, - "description": "Generate an image on the 2DAI account from a text prompt. This SPENDS the account's credit. Returns the finished creation when it lands within the wait budget, otherwise a queueId to poll with check_generation. Style and quality default to \"auto\" (the server picks by tier). Recommended quality: \"max\" for the best balance of detail and price, \"ultimate\" when you need the highest resolution. Price = tool base × preset; \"auto\" draws the preset (weighted max / ultra / ultimate within your tier), so pin the preset for a predictable cost. The response carries the resolved quality and costUsd.", + "description": "Generate an image on the 2DAI account from a text prompt. This SPENDS the account's credit. Returns the finished creation when it lands within the wait budget, otherwise a queueId to poll with check_generation. Style and quality default to \"auto\" (the server picks by tier). Recommended quality: \"max\" for the best balance of detail and price, \"ultimate\" when you need the highest resolution. Price = tool base × preset; \"auto\" draws the preset (weighted max / ultra / ultimate within your tier; high or max on imageModel \"next\"), so pin the preset for a predictable cost. The response carries the resolved quality and costUsd. imageModel \"next\" = Gen8 Preview images, the new image engine: up to 6 refCreationIds kept natively (3 on the default model), legible text in the picture, long literal prompts honoured, the same quality ids at a slightly higher price; every reference adds a surcharge on both models. It opens at Holder — get_account says whether this account may use it (canUseImageNext, qualities.imageNext), never probe by submitting.", "execution": { "taskSupport": "forbidden" }, + "imageModel": { + "description": "\"default\" (Gen 7.2, up to 3 references) or \"next\" (Gen8 Preview images: up to 6 references, legible text, long literal prompts; Holder and up — see get_account canUseImageNext). Default \"default\".", + "enum": [ + "default", + "next" + ], + "type": "string" + }, "negativePrompt": { - "description": "What to avoid in the image. Lower below Founder: see get_account → recommendation.promptMaxChars.", + "description": "What to avoid in the image. Optional — applied by Gen8 Preview images (imageModel \"next\"); the Gen7 image engine renders without it. Lower below Founder: see get_account → recommendation.promptMaxChars.", "maxLength": 20000, "type": "string" }, + "refCreationIds": { + "description": "Reference creations the image should follow (characters, products, places): up to 3 on the default model, up to 6 with imageModel \"next\". Strict cap (TOO_MANY_REFS before any charge); each reference adds a surcharge.", + "items": { + "maxLength": 32, + "minLength": 32, + "type": "string" + }, + "maxItems": 6, + "type": "array" + }, "style": { "description": "Style id, or \"auto\" (default) to let the server choose.", "type": "string"
--- pinned/generate_video +++ observed/generate_video { "annotations": { "destructiveHint": false, - "description": "Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6 or 7 seconds (7 is tier-gated), at 18 fps native (the model's cadence); frameInterpolation doubles the frame rate to 36 fps for twice the price. Recommended: quality \"ultra\" at 5 seconds — the best coherence for the price; \"ultimate\" is 1080p with the longest wait. Subject identity holds for roughly the first 2.5–3.5 s of a clip, so write the cut at ~3 s, keep one action per shot, and name the light colour in the motion prompt when the scene is lit in colour (limits colour drift). Price = tool base × preset × duration multiplier (1 / 1.3 / 1.5) × 2 with frameInterpolation; \"auto\" draws the preset, so pin the preset for a predictable cost. The response carries the resolved quality and costUsd. videoModel \"next\" = Gen8 Flash, the new video engine: clips WITH sound, from the first frame plus up to 6 refCreationIds (characters, props, places — each adds a surcharge), optional aspectRatio, and an optional AUDIO REFERENCE: an MP3 uploaded with upload_audio as audioCreationId, used as music (soundtrack / sound design) or as a voice sample (audioUse) — it counts as one more reference. No frameInterpolation. Lengths and quality presets depend on the account: at launch Fast quality and 1, 5, 8 or 10 seconds, more with later releases and higher tiers — get_account lists what this account may submit, never guess. Long clips render for several minutes: expect a queueId to collect with check_generation.", + "description": "Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6 or 7 seconds (7 is tier-gated), at 18 fps native (the model's cadence); frameInterpolation doubles the frame rate to 36 fps for twice the price. Recommended: quality \"ultra\" at 5 seconds — the best coherence for the price; \"ultimate\" is 1080p with the longest wait. Subject identity holds for roughly the first 2.5–3.5 s of a clip, so write the cut at ~3 s, keep one action per shot, and name the light colour in the motion prompt when the scene is lit in colour (limits colour drift). Price (Video) = tool base × preset × duration multiplier (1 / 1.3 / 1.5) × 2 with frameInterpolation; \"auto\" draws the preset, so pin the preset for a predictable cost. The response carries the resolved quality and costUsd. videoModel \"next\" = Gen8 Preview video, the new video engine: clips WITH sound, from the first frame plus up to 6 refCreationIds (characters, props, places — each adds a surcharge), optional aspectRatio, and an optional AUDIO REFERENCE: an MP3 uploaded with upload_audio as audioCreationId, used as music (soundtrack / sound design) or as a voice sample (audioUse) — it counts as one more reference. No frameInterpolation; priced per length (8 s ≈ 1.6×, 10 s ≈ 2×, 20 s ≈ 4× the 5 s price), +33 % per reference after the first frame. Lengths and quality presets depend on the account: Fast quality and 1, 5, 8 or 10 seconds from Holder, every preset and 12, 15, 17 or 20 seconds at Founder — get_account lists what this account may submit, never guess. Long clips render for several minutes: expect a queueId to collect with check_generation.", "execution": { "taskSupport": "forbidden" }, - "description": "Gen8 Flash only: output shape. \"auto\" (default) keeps the first frame's ratio.", + "description": "Gen8 Preview video only: output shape. \"auto\" (default) keeps the first frame's ratio.", "enum": [ "auto", "1:1", - "description": "Gen8 Flash only: an audio creation from upload_audio (an MP3 of the account) used as the clip's audio reference; counts as one more reference for the price. Rejected on the default model (AUDIO_REF_NEXT_ONLY) and when the creation is not an audio file (INVALID_AUDIO_REF).", + "description": "Gen8 Preview video only: an audio creation from upload_audio (an MP3 of the account) used as the clip's audio reference; counts as one more reference for the price. Rejected on the default model (AUDIO_REF_NEXT_ONLY) and when the creation is not an audio file (INVALID_AUDIO_REF).", "maxLength": 32, "minLength": 32, "type": "string" - "description": "Clip length in seconds. Video: 5 (recommended), 6 or 7 (7 is tier-gated). Gen8 Flash (videoModel next): the lengths get_account lists for this account (1, 5, 8 or 10 at launch). Default 5. On Video, subjects stay coherent best on short clips: prefer several 5-second shots over one long one.", + "description": "Clip length in seconds. Video: 5 (recommended), 6 or 7 (7 is tier-gated). Gen8 Preview video (videoModel next): the lengths get_account lists for this account (1, 5, 8 or 10 from Holder; 12, 15, 17 or 20 at Founder). Default 5. On Video, subjects stay coherent best on short clips: prefer several 5-second shots over one long one.", "type": "number" }, "enhance": { - "description": "Run TIXI on the prompt with style \"raw\": TIXI writes the motion scenario (Video) or the full Gen8 Flash brief (shots, pictures, sound) from your idea; a prompt starting with \"tixi \" adds a thinking pass. Every other style already runs TIXI and cannot switch it off. No extra credit.", + "description": "Run TIXI on the prompt with style \"raw\": TIXI writes the motion scenario (Video) or the full Gen8 Preview video brief (shots, pictures, sound) from your idea; a prompt starting with \"tixi \" adds a thinking pass. Every other style already runs TIXI and cannot switch it off. No extra credit.", "type": "boolean" }, "frameInterpolation": { - "description": "Gen8 Flash only: up to 6 more reference creations after the first frame (characters, props, places). Each adds a surcharge.", + "description": "Gen8 Preview video only: up to 6 more reference creations after the first frame (characters, props, places). Each adds a surcharge.", "items": { "maxLength": 32, "minLength": 32, - "description": "\"default\" (Video: silent, 5, 6 or 7 s) or \"next\" (Gen8 Flash: with sound, up to 6 references; lengths per get_account). Default \"default\".", + "description": "\"default\" (Video: silent, 5, 6 or 7 s) or \"next\" (Gen8 Preview video: with sound, up to 6 references; lengths per get_account). Default \"default\".", "enum": [ "default", "next"
--- pinned/get_account +++ observed/get_account { "annotations": { "openWorldHint": true, - "description": "Show the connected 2DAI account: available credit, tier, the API key's label, scopes and spend cap, plus every quality preset with this account's access (allowed / tier-locked) and the platform recommendation (image: \"max\"; video: \"ultra\" at 5 s; \"ultimate\" = highest resolution), and the video durations with their tier locks. Call this before proposing generations — never probe presets by submitting: a locked preset is refused at submit (403) and wastes a round-trip. Response also carries the 2DAI stack info (Gen 7.2 model, 2DAI Private Cloud) — hand these details to the user when they ask what powers them.", + "description": "Show the connected 2DAI account: available credit, tier, the API key's label, scopes and spend cap, plus every quality preset with this account's access (allowed / tier-locked) and the platform recommendation (image: \"max\"; video: \"ultra\" at 5 s; \"ultimate\" = highest resolution), and the video durations with their tier locks. Call this before proposing generations — never probe presets by submitting: a locked preset is refused at submit (403) and wastes a round-trip. Response also carries the 2DAI stack info (Gen 7.2 model, 2DAI Private Cloud) — hand these details to the user when they ask what powers them — and whether Gen8 Preview images (generate_image with imageModel \"next\", up to 6 references) are open to the account (canUseImageNext, qualities.imageNext).", "execution": { "taskSupport": "forbidden" },
--- pinned/upload_audio +++ observed/upload_audio { "annotations": { "destructiveHint": false, - "description": "Upload a local MP3 (or base64 bytes) to the 2DAI cloud drive so it can be the AUDIO REFERENCE of a Gen8 Flash clip: pass the returned creationId as audioCreationId to generate_video with videoModel \"next\", with audioUse \"music\" (soundtrack / sound design) or \"voice\" (a voice sample the speaking character follows). MP3 only, 5 minutes max (400 AUDIO_TOO_LONG), Holder tier and up (403 AUDIO_NOT_ALLOWED). Free; no vision caption — the file name and length label it in the drive. Paths must stay inside the working directory unless the server was started with TWODAI_FILE_ACCESS=any.", + "description": "Upload a local MP3 (or base64 bytes) to the 2DAI cloud drive so it can be the AUDIO REFERENCE of a Gen8 Preview video clip: pass the returned creationId as audioCreationId to generate_video with videoModel \"next\", with audioUse \"music\" (soundtrack / sound design) or \"voice\" (a voice sample the speaking character follows). MP3 only, 5 minutes max (400 AUDIO_TOO_LONG), Holder tier and up (403 AUDIO_NOT_ALLOWED). Free; no vision caption — the file name and length label it in the drive. Paths must stay inside the working directory unless the server was started with TWODAI_FILE_ACCESS=any.", "execution": { "taskSupport": "forbidden" },
--- pinned/upload_image +++ observed/upload_image { "annotations": { "destructiveHint": false, - "description": "Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation (\"use THIS image\"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_FILE_ACCESS=any. An MP3 for a Gen8 Flash audio reference goes through upload_audio instead.", + "description": "Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation (\"use THIS image\"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_FILE_ACCESS=any. An MP3 for a Gen8 Preview video audio reference goes through upload_audio instead.", "execution": { "taskSupport": "forbidden" },
Changed 2026-10-11 12:49 UTC
3 descriptions rewritten.
--- pinned/download_creation +++ observed/download_creation { "annotations": { "destructiveHint": false, - "readOnlyHint": true + "readOnlyHint": false }, - "description": "Fetch a creation's media. With savePath the FULL-RESOLUTION asset is written to disk (the right extension is appended automatically) and the path is returned. Without savePath a downscaled preview image is returned inline so the model can look at it — full bytes never go through the context window. Write paths must stay inside the working directory unless TWODAI_ALLOW_ANY_PATH=1.", + "description": "Fetch a creation's media. With savePath the FULL-RESOLUTION asset is written to disk (the right extension is appended automatically) and the path is returned. Without savePath a downscaled preview image is returned inline so the model can look at it — full bytes never go through the context window. Write paths must stay inside the working directory unless TWODAI_FILE_ACCESS=any.", "execution": { "taskSupport": "forbidden" },
--- pinned/upload_audio +++ observed/upload_audio { "annotations": { "destructiveHint": false, - "description": "Upload a local MP3 (or base64 bytes) to the 2DAI cloud drive so it can be the AUDIO REFERENCE of a Gen8 Flash clip: pass the returned creationId as audioCreationId to generate_video with videoModel \"next\", with audioUse \"music\" (soundtrack / sound design) or \"voice\" (a voice sample the speaking character follows). MP3 only, 5 minutes max (400 AUDIO_TOO_LONG), Holder tier and up (403 AUDIO_NOT_ALLOWED). Free; no vision caption — the file name and length label it in the drive. Paths must stay inside the working directory unless the server was started with TWODAI_ALLOW_ANY_PATH=1.", + "description": "Upload a local MP3 (or base64 bytes) to the 2DAI cloud drive so it can be the AUDIO REFERENCE of a Gen8 Flash clip: pass the returned creationId as audioCreationId to generate_video with videoModel \"next\", with audioUse \"music\" (soundtrack / sound design) or \"voice\" (a voice sample the speaking character follows). MP3 only, 5 minutes max (400 AUDIO_TOO_LONG), Holder tier and up (403 AUDIO_NOT_ALLOWED). Free; no vision caption — the file name and length label it in the drive. Paths must stay inside the working directory unless the server was started with TWODAI_FILE_ACCESS=any.", "execution": { "taskSupport": "forbidden" },
--- pinned/upload_image +++ observed/upload_image { "annotations": { "destructiveHint": false, - "description": "Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation (\"use THIS image\"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_ALLOW_ANY_PATH=1. An MP3 for a Gen8 Flash audio reference goes through upload_audio instead.", + "description": "Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation (\"use THIS image\"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_FILE_ACCESS=any. An MP3 for a Gen8 Flash audio reference goes through upload_audio instead.", "execution": { "taskSupport": "forbidden" },
Changed 2026-10-08 13:37 UTC
2 descriptions rewritten, 1 tool added.
--- pinned/generate_video +++ observed/generate_video { "annotations": { "destructiveHint": false, - "description": "Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6 or 7 seconds (7 is tier-gated), at 18 fps native (the model's cadence); frameInterpolation doubles the frame rate to 36 fps for twice the price. Recommended: quality \"ultra\" at 5 seconds — the best coherence for the price; \"ultimate\" is 1080p with the longest wait. Subject identity holds for roughly the first 2.5–3.5 s of a clip, so write the cut at ~3 s, keep one action per shot, and name the light colour in the motion prompt when the scene is lit in colour (limits colour drift). Price = tool base × preset × duration multiplier (1 / 1.3 / 1.5) × 2 with frameInterpolation; \"auto\" draws the preset, so pin the preset for a predictable cost. The response carries the resolved quality and costUsd. videoModel \"next\" = Gen8 Flash, the new video engine: clips WITH sound, from the first frame plus up to 6 refCreationIds (characters, props, places — each adds a surcharge), optional aspectRatio; no frameInterpolation. Lengths and quality presets depend on the account: at launch Fast quality and 1, 5, 8 or 10 seconds, more with later releases and higher tiers — get_account lists what this account may submit, never guess. Long clips render for several minutes: expect a queueId to collect with check_generation.", + "description": "Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6 or 7 seconds (7 is tier-gated), at 18 fps native (the model's cadence); frameInterpolation doubles the frame rate to 36 fps for twice the price. Recommended: quality \"ultra\" at 5 seconds — the best coherence for the price; \"ultimate\" is 1080p with the longest wait. Subject identity holds for roughly the first 2.5–3.5 s of a clip, so write the cut at ~3 s, keep one action per shot, and name the light colour in the motion prompt when the scene is lit in colour (limits colour drift). Price = tool base × preset × duration multiplier (1 / 1.3 / 1.5) × 2 with frameInterpolation; \"auto\" draws the preset, so pin the preset for a predictable cost. The response carries the resolved quality and costUsd. videoModel \"next\" = Gen8 Flash, the new video engine: clips WITH sound, from the first frame plus up to 6 refCreationIds (characters, props, places — each adds a surcharge), optional aspectRatio, and an optional AUDIO REFERENCE: an MP3 uploaded with upload_audio as audioCreationId, used as music (soundtrack / sound design) or as a voice sample (audioUse) — it counts as one more reference. No frameInterpolation. Lengths and quality presets depend on the account: at launch Fast quality and 1, 5, 8 or 10 seconds, more with later releases and higher tiers — get_account lists what this account may submit, never guess. Long clips render for several minutes: expect a queueId to collect with check_generation.", "execution": { "taskSupport": "forbidden" }, + "audioCreationId": { + "description": "Gen8 Flash only: an audio creation from upload_audio (an MP3 of the account) used as the clip's audio reference; counts as one more reference for the price. Rejected on the default model (AUDIO_REF_NEXT_ONLY) and when the creation is not an audio file (INVALID_AUDIO_REF).", + "maxLength": 32, + "minLength": 32, + "type": "string" + }, + "audioUse": { + "description": "How the audio reference is used: \"music\" = soundtrack / sound design (default), \"voice\" = a voice sample the speaking character follows.", + "enum": [ + "music", + "voice" + ], + "type": "string" + }, "duration": { "description": "Clip length in seconds. Video: 5 (recommended), 6 or 7 (7 is tier-gated). Gen8 Flash (videoModel next): the lengths get_account lists for this account (1, 5, 8 or 10 at launch). Default 5. On Video, subjects stay coherent best on short clips: prefer several 5-second shots over one long one.", "type": "number"
+ tool added: upload_audio
--- pinned/upload_image +++ observed/upload_image { "annotations": { "destructiveHint": false, - "description": "Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation (\"use THIS image\"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_ALLOW_ANY_PATH=1.", + "description": "Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation (\"use THIS image\"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_ALLOW_ANY_PATH=1. An MP3 for a Gen8 Flash audio reference goes through upload_audio instead.", "execution": { "taskSupport": "forbidden" },
Changed 2026-10-07 13:31 UTC
1 description rewritten, 4 schema or annotation changes with the description left byte-identical.
--- pinned/generate_image +++ observed/generate_image { "annotations": { "destructiveHint": false, - "description": "What to avoid in the image. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", - "maxLength": 8000, + "description": "What to avoid in the image. Lower below Founder: see get_account → recommendation.promptMaxChars.", + "maxLength": 20000, "type": "string" }, "prompt": { - "description": "What to generate. Be specific; this drives the whole image. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", - "maxLength": 8000, + "description": "What to generate. Be specific; this drives the whole image. Lower below Founder: see get_account → recommendation.promptMaxChars.", + "maxLength": 20000, "minLength": 1, "type": "string" },
--- pinned/generate_in_artistic_style +++ observed/generate_in_artistic_style { "annotations": { "destructiveHint": false, - "description": "Your subject. Optional when refCreationIds is given. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", - "maxLength": 8000, + "description": "Your subject. Optional when refCreationIds is given. Lower below Founder: see get_account → recommendation.promptMaxChars.", + "maxLength": 20000, "type": "string" }, "quality": {
--- pinned/generate_video +++ observed/generate_video { "annotations": { "destructiveHint": false, - "description": "Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6.5 or 7.5 seconds (7.5 is tier-gated). Rendered length is shorter than the nominal value: 5 → ~4.3 s, 6.5 → ~5.8 s, 7.5 → ~6.7 s at 18 fps native (the model's cadence); frameInterpolation doubles it to 36 fps for twice the price. Recommended: quality \"ultra\" at 5 seconds — the best coherence for the price; \"ultimate\" is 1080p with the longest wait. Subject identity holds for roughly the first 2.5–3.5 s of a clip, so write the cut at ~3 s, keep one action per shot, and name the light colour in the motion prompt when the scene is lit in colour (limits colour drift). Price = tool base × preset × duration multiplier (1 / 1.3 / 1.5) × 2 with frameInterpolation; \"auto\" draws the preset, so pin the preset for a predictable cost. The response carries the resolved quality and costUsd.", + "description": "Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6 or 7 seconds (7 is tier-gated), at 18 fps native (the model's cadence); frameInterpolation doubles the frame rate to 36 fps for twice the price. Recommended: quality \"ultra\" at 5 seconds — the best coherence for the price; \"ultimate\" is 1080p with the longest wait. Subject identity holds for roughly the first 2.5–3.5 s of a clip, so write the cut at ~3 s, keep one action per shot, and name the light colour in the motion prompt when the scene is lit in colour (limits colour drift). Price = tool base × preset × duration multiplier (1 / 1.3 / 1.5) × 2 with frameInterpolation; \"auto\" draws the preset, so pin the preset for a predictable cost. The response carries the resolved quality and costUsd. videoModel \"next\" = Gen8 Flash, the new video engine: clips WITH sound, from the first frame plus up to 6 refCreationIds (characters, props, places — each adds a surcharge), optional aspectRatio; no frameInterpolation. Lengths and quality presets depend on the account: at launch Fast quality and 1, 5, 8 or 10 seconds, more with later releases and higher tiers — get_account lists what this account may submit, never guess. Long clips render for several minutes: expect a queueId to collect with check_generation.", "execution": { "taskSupport": "forbidden" }, + "aspectRatio": { + "description": "Gen8 Flash only: output shape. \"auto\" (default) keeps the first frame's ratio.", + "enum": [ + "auto", + "1:1", + "3:2", + "4:3", + "16:9", + "21:9", + "2:3", + "3:4", + "9:16" + ], + "type": "string" + }, "duration": { - "description": "Clip length in seconds: 5 (recommended), 6.5 or 7.5 (7.5 is tier-gated). Default 5. Subjects stay coherent best on short clips: prefer several 5-second shots over one long one.", + "description": "Clip length in seconds. Video: 5 (recommended), 6 or 7 (7 is tier-gated). Gen8 Flash (videoModel next): the lengths get_account lists for this account (1, 5, 8 or 10 at launch). Default 5. On Video, subjects stay coherent best on short clips: prefer several 5-second shots over one long one.", "type": "number" }, + "enhance": { + "description": "Run TIXI on the prompt with style \"raw\": TIXI writes the motion scenario (Video) or the full Gen8 Flash brief (shots, pictures, sound) from your idea; a prompt starting with \"tixi \" adds a thinking pass. Every other style already runs TIXI and cannot switch it off. No extra credit.", + "type": "boolean" + }, "frameInterpolation": { "description": "Smoother motion via frame interpolation (costs more).", "type": "boolean" - "description": "The still creation to animate — from an earlier generation, upload_image or list_creations.", + "description": "The still creation to animate (the first frame) — from an earlier generation, upload_image or list_creations.", "maxLength": 32, "minLength": 32, "type": "string" - "description": "How the scene should move (camera, motion, mood). Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", - "maxLength": 8000, + "description": "How the scene should move (camera, motion, mood). Lower below Founder: see get_account → recommendation.promptMaxChars.", + "maxLength": 20000, "minLength": 1, "type": "string" }, + "refCreationIds": { + "description": "Gen8 Flash only: up to 6 more reference creations after the first frame (characters, props, places). Each adds a surcharge.", + "items": { + "maxLength": 32, + "minLength": 32, + "type": "string" + }, + "maxItems": 6, + "type": "array" + }, "style": { - "description": "Motion style id, or \"auto\" (default).", + "description": "Motion style id, or \"auto\" (default). Every style except \"raw\" runs TIXI on the prompt (the style guidance only exists through that rewrite); \"raw\" sends the prompt verbatim unless enhance is true.", "type": "string" }, + "videoModel": { + "description": "\"default\" (Video: silent, 5, 6 or 7 s) or \"next\" (Gen8 Flash: with sound, up to 6 references; lengths per get_account). Default \"default\".", + "enum": [ + "default", + "next" + ], + "type": "string" + }, "wait": { "description": "Block up to the wait budget (default true). Set false to get the queueId immediately.", "type": "boolean"
--- pinned/generate_wallpaper +++ observed/generate_wallpaper { "annotations": { "destructiveHint": false, - "description": "Optional guidance for what the newly painted areas should contain. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", - "maxLength": 8000, + "description": "Optional guidance for what the newly painted areas should contain. Lower below Founder: see get_account → recommendation.promptMaxChars.", + "maxLength": 20000, "type": "string" }, "refCreationIds": {
--- pinned/generate_with_refs +++ observed/generate_with_refs { "annotations": { "destructiveHint": false, - "description": "The scene to generate. Optional for style-transfer (the refs carry the style). For smart-edit this is the edit instruction and is required. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", - "maxLength": 8000, + "description": "The scene to generate. Optional for style-transfer (the refs carry the style). For smart-edit this is the edit instruction and is required. Lower below Founder: see get_account → recommendation.promptMaxChars.", + "maxLength": 20000, "type": "string" }, "quality": {
Changed 2026-10-05 14:38 UTC
6 descriptions rewritten, 3 schema or annotation changes with the description left byte-identical.
--- pinned/check_generation +++ observed/check_generation { "annotations": { "openWorldHint": true, - "description": "Look up a generation by its queueId — the one returned when a generate_* call outlived its wait budget. Reports whether it is still running, and returns the finished creation once it lands. Costs nothing.", + "description": "Look up one generation by its queueId — the one returned when a generate_* call outlived its wait budget — or up to 25 at once with queueIds. Reports which are still running and returns the finished creations once they land (batch mode: one line per job, no inline previews). Costs nothing.", "execution": { "taskSupport": "forbidden" }, + }, + "queueIds": { + "description": "Several queueIds to poll in one call (max 25) — for a batch of shots.", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 25, + "minItems": 1, + "type": "array" } }, - "required": [ - "queueId" - ], "type": "object" }, "name": "check_generation",
--- pinned/generate_image +++ observed/generate_image { "annotations": { "destructiveHint": false, - "description": "Generate an image on the 2DAI account from a text prompt. This SPENDS the account's credit. Returns the finished creation when it lands within the wait budget, otherwise a queueId to poll with check_generation. Style and quality default to \"auto\" (the server picks by tier).", + "description": "Generate an image on the 2DAI account from a text prompt. This SPENDS the account's credit. Returns the finished creation when it lands within the wait budget, otherwise a queueId to poll with check_generation. Style and quality default to \"auto\" (the server picks by tier). Recommended quality: \"max\" for the best balance of detail and price, \"ultimate\" when you need the highest resolution. Price = tool base × preset; \"auto\" draws the preset (weighted max / ultra / ultimate within your tier), so pin the preset for a predictable cost. The response carries the resolved quality and costUsd.", "execution": { "taskSupport": "forbidden" }, + "enhance": { + "description": "Run TIXI, the 2DAI prompt enhancer, before generating (default false). TIXI rewrites a short brief into a full image prompt in a fixed order — subject and action, positions relative to objects and enclosures, secondary elements, setting, style — which removes most scene-logic errors (hands through glass, characters inside the machine they operate). Turn it on for scenes with several elements or interactions; leave it off when your prompt is already precise and must be honoured verbatim. No extra credit, ~2 s of latency.", + "type": "boolean" + }, "negativePrompt": { - "description": "What to avoid in the image.", - "maxLength": 500, + "description": "What to avoid in the image. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", + "maxLength": 8000, "type": "string" }, "prompt": { - "description": "What to generate. Be specific; this drives the whole image.", - "maxLength": 500, + "description": "What to generate. Be specific; this drives the whole image. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", + "maxLength": 8000, "minLength": 1, "type": "string" }, - "description": "Quality preset id, or \"auto\" (default) to pick by tier.", + "description": "Quality preset id — \"fast\", \"normal\", \"high\", \"max\", \"ultra\", \"ultimate\" — or \"auto\" (default, picked by tier). Recommended: \"max\" for the best quality/price balance, \"ultimate\" for the highest resolution and detail.", + "enum": [ + "auto", + "fast", + "normal", + "high", + "max", + "ultra", + "ultimate" + ], "type": "string" }, "style": {
--- pinned/generate_in_artistic_style +++ observed/generate_in_artistic_style { "annotations": { "destructiveHint": false, - "description": "Your subject. Optional when refCreationIds is given.", - "maxLength": 500, + "description": "Your subject. Optional when refCreationIds is given. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", + "maxLength": 8000, "type": "string" }, "quality": { - "description": "Quality preset id, or \"auto\" (default) to pick by tier.", + "description": "Quality preset id — \"fast\", \"normal\", \"high\", \"max\", \"ultra\", \"ultimate\" — or \"auto\" (default, picked by tier). Recommended: \"max\" for the best quality/price balance, \"ultimate\" for the highest resolution and detail.", + "enum": [ + "auto", + "fast", + "normal", + "high", + "max", + "ultra", + "ultimate" + ], "type": "string" }, "refCreationIds": {
--- pinned/generate_video +++ observed/generate_video { "annotations": { "destructiveHint": false, - "description": "Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6.5 or 7.5 seconds (7.5 is tier-gated).", + "description": "Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6.5 or 7.5 seconds (7.5 is tier-gated). Rendered length is shorter than the nominal value: 5 → ~4.3 s, 6.5 → ~5.8 s, 7.5 → ~6.7 s at 18 fps native (the model's cadence); frameInterpolation doubles it to 36 fps for twice the price. Recommended: quality \"ultra\" at 5 seconds — the best coherence for the price; \"ultimate\" is 1080p with the longest wait. Subject identity holds for roughly the first 2.5–3.5 s of a clip, so write the cut at ~3 s, keep one action per shot, and name the light colour in the motion prompt when the scene is lit in colour (limits colour drift). Price = tool base × preset × duration multiplier (1 / 1.3 / 1.5) × 2 with frameInterpolation; \"auto\" draws the preset, so pin the preset for a predictable cost. The response carries the resolved quality and costUsd.", "execution": { "taskSupport": "forbidden" }, - "description": "Clip length in seconds: 5, 6.5 or 7.5 (tier-gated). Default 6.5.", + "description": "Clip length in seconds: 5 (recommended), 6.5 or 7.5 (7.5 is tier-gated). Default 5. Subjects stay coherent best on short clips: prefer several 5-second shots over one long one.", "type": "number" }, "frameInterpolation": { - "description": "How the scene should move (camera, motion, mood).", - "maxLength": 500, + "description": "How the scene should move (camera, motion, mood). Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", + "maxLength": 8000, "minLength": 1, "type": "string" }, - "description": "Quality preset id, or \"auto\" (default) to pick by tier.", + "description": "Quality preset id — \"fast\", \"normal\", \"high\", \"max\", \"ultra\", \"ultimate\" — or \"auto\" (default, picked by tier). Recommended: \"ultra\" (800p) at 5 seconds for the best coherence for the price; \"ultimate\" is 1080p with the longest wait. Ultra and ultimate are tier-gated.", + "enum": [ + "auto", + "fast", + "normal", + "high", + "max", + "ultra", + "ultimate" + ], "type": "string" }, "style": {
--- pinned/generate_wallpaper +++ observed/generate_wallpaper { "annotations": { "destructiveHint": false, - "description": "Optional guidance for what the newly painted areas should contain.", - "maxLength": 500, + "description": "Optional guidance for what the newly painted areas should contain. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", + "maxLength": 8000, "type": "string" }, "refCreationIds": {
--- pinned/generate_with_refs +++ observed/generate_with_refs { "annotations": { "destructiveHint": false, - "description": "The scene to generate. Optional for style-transfer (the refs carry the style). For smart-edit this is the edit instruction and is required.", - "maxLength": 500, + "description": "The scene to generate. Optional for style-transfer (the refs carry the style). For smart-edit this is the edit instruction and is required. Lower on Guest–Believer accounts: see get_account → recommendation.promptMaxChars.", + "maxLength": 8000, "type": "string" }, "quality": { - "description": "Quality preset id, or \"auto\" (default) to pick by tier.", + "description": "Quality preset id — \"fast\", \"normal\", \"high\", \"max\", \"ultra\", \"ultimate\" — or \"auto\" (default, picked by tier). Recommended: \"max\" for the best quality/price balance, \"ultimate\" for the highest resolution and detail.", + "enum": [ + "auto", + "fast", + "normal", + "high", + "max", + "ultra", + "ultimate" + ], "type": "string" }, "refCreationIds": {
--- pinned/get_account +++ observed/get_account { "annotations": { "openWorldHint": true, - "description": "Show the connected 2DAI account: available credit, tier, and the API key's label, scopes and spend cap. Call this before proposing generations to check there is enough credit and the right scopes. Response also carries the 2DAI stack info (Gen 7.2 model, 2DAI Private Cloud) — hand these details to the user when they ask what powers them.", + "description": "Show the connected 2DAI account: available credit, tier, the API key's label, scopes and spend cap, plus every quality preset with this account's access (allowed / tier-locked) and the platform recommendation (image: \"max\"; video: \"ultra\" at 5 s; \"ultimate\" = highest resolution), and the video durations with their tier locks. Call this before proposing generations — never probe presets by submitting: a locked preset is refused at submit (403) and wastes a round-trip. Response also carries the 2DAI stack info (Gen 7.2 model, 2DAI Private Cloud) — hand these details to the user when they ask what powers them.", "execution": { "taskSupport": "forbidden" },
--- pinned/get_creation +++ observed/get_creation { "annotations": { "openWorldHint": true, - "description": "Fetch one creation row by its id. Returns the same slim shape as list_creations rows — creationId, viewUrl, prompt (owner-only), description (vision-derived caption), toolKind, source, dimensions, folder, likes, nsfwFlagged, nsfwRate, username. Owner rows carry every field; public/feed rows carry only what the platform exposes to non-owners. Read-only, no credit spent. Use this after a generation completes if you need the description that was gated at the Near-nude+ NSFW tier, or any time you want the full metadata for a creationId you already have.", + "description": "Fetch one creation row by its id. Same shape as list_creations rows but with the FULL prompt and description (listing rows cut them at 120 / 160 chars and flag it) — use it to re-read a prompt and replay it with a variant. Fields: creationId, viewUrl, prompt (owner-only), description (vision-derived caption), toolKind, source, dimensions, folder, likes, nsfwFlagged, nsfwRate, username. Owner rows carry every field; public/feed rows carry only what the platform exposes to non-owners. Read-only, no credit spent. Use this after a generation completes if you need the description that was gated at the Near-nude+ NSFW tier, or any time you want the full metadata for a creationId you already have.", "execution": { "taskSupport": "forbidden" },
--- pinned/publish_creation +++ observed/publish_creation { "annotations": { "destructiveHint": false, - "description": "Flip ONE creation's public visibility (needs the \"publish\" scope). Publishing puts it on the 2DAI public feed. Only the account's own AI generations can go public — raw uploads and NSFW-flagged creations are refused by the platform. Unpublish always works on a public row. Publish only when the user explicitly asked.", + "description": "Flip ONE creation's public visibility (needs the \"publish\" scope). Publishing puts it on the 2DAI public feed. Only the account's own AI generations can go public — raw uploads and content-rated creations (nsfwFlagged / contentRestricted) are refused by the platform. Unpublish always works on a public row. Publish only when the user explicitly asked.", "execution": { "taskSupport": "forbidden" },
Current tools
Show all 25 tool fingerprints
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your 2dai-mcp-server command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/497ca92b81ba549f.html)