2dai-mcp-server
The server lets an MCP host operate a 2DAI account for AI media generation, asset management, and read-only account/wallet insights.
Check account credit, tier, API-key scopes, spend cap, generation stats, wallet status, staking lock, wallet history, and cached token price; wallet tools are read-only.
Generate images from text with prompt, style/quality, aspect ratio, negative prompt, NSFW permission, and optional inline previews; these spend credit.
Generate images from references for character consistency, style transfer, and smart edits, using creation IDs or uploads.
Animate a still creation into a video with prompt/style/quality/duration, sound, optional aspect ratio, reference images, and optional uploaded audio.
Re-run an existing creation for more like it, or expand a creation into standard/photo/widescreen/ultrawide wallpaper formats.
Poll queued generations, batch-poll queue IDs, and cancel jobs that are still waiting for a refundable cancellation.
Upload image or audio references, download full-resolution creations or inline previews, and get creation details including full prompts.
List, search, filter, sort, and randomly pick creations; browse the public feed; inspect folders and artistic styles.
Organize the cloud drive: manage folders and sidebar groups, move/trash/restore/like/unlike creations, and batch trash/restore up to 100 items; permanent delete is one-at-a-time and only from trash.
Publish or unpublish eligible creations to the public feed when explicitly requested.
Run locally over stdio via npx or against the hosted Streamable HTTP endpoint; hosted mode has no filesystem access, so uploads use base64 and downloads return inline preview plus a download URL.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@2dai-mcp-server Generate an image of a futuristic city skyline at sunset."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
2dai-mcp-server
MCP server for 2DAI — lets Claude, Cursor, Cline, Windsurf and any other MCP host generate images and video, upload references, browse the public feed, and organise your cloud drive on your own 2DAI account.
Runs locally over stdio via
npx— nothing to install permanently.Authenticates with a 2DAI API key (create one at 2dai.io → Dashboard → Integrations → API keys).
Finished images come back as inline previews so the model can see what it made and iterate.
New in 2.2 — Gen8 on the default channels
generate_image and generate_video run the Gen8 engines on their default channel; get_account names the engine
behind each channel and what it takes (platform.engines, today Gen8.1):
Images: up to 6
refCreationIdskept natively, legible text in the picture, long literal prompts honoured.Video: clips with sound, from a first frame plus up to 6
refCreationIds(characters, props and places kept consistent), an optionalaspectRatioand an optional audio reference (upload_audioan MP3, then pass its id asaudioCreationId,audioUse: "music"for a soundtrack or"voice"for a voice sample). Lengths are exact seconds — 1, 5, 8, 10, 12, 15, 17 or 20, opened by tier; video opens at Explorer.Presets and lengths depend on the tier:
get_accountlists what the account may submit and the best pick open to it (recommendation), so read it instead of probing.
next (imageModel / videoModel) is kept for the next engine. The next channel closed on 2026-11-11: it answers
VIDEO_MODEL_UNAVAILABLE / IMAGE_MODEL_UNAVAILABLE, uncharged, until an engine opens it. Leave both parameters
unset, and reconnect the server in your host after updating (a running session keeps the old tool descriptions).
Related MCP server: Krea MCP Server
New in 2.0 — reference tools on the Gen8 image engine
generate_with_refs and generate_in_artistic_style now render on the Gen8 image engine, which reads every
reference natively: character-ref takes 1–6 shots of one character (face photos lock the exact same face, the
prompt drives outfit, pose and scene), style-transfer 1–6 style sources, smart-edit the image to edit plus up to
5 support refs, the artistic style up to 6 subject images. The former face-ref tool was merged into
character-ref and is refused with INVALID_TOOL. Same preset ids and tier gates; prices follow the Gen8 image
ladder plus a surcharge per reference (the ticket's costUsd is the truth).
Quick start
Claude Code
claude mcp add 2dai --env TWODAI_API_KEY=2dai_sk_... -- npx -y 2dai-mcp-serverClaude Desktop / Cursor / Cline / Windsurf (JSON config)
{
"mcpServers": {
"2dai": {
"command": "npx",
"args": ["-y", "2dai-mcp-server"],
"env": { "TWODAI_API_KEY": "2dai_sk_..." }
}
}
}The key is read from the environment only — never pass it as a tool argument.
Hosted alternative — mcp.2dai.io:800
Every host that speaks remote MCP (Streamable HTTP) can point at our hosted
server instead of running npx locally. No install, no Node runtime, no
process lifecycle — just a URL and a Bearer key.
Endpoint — https://mcp.2dai.io:800/mcp
Auth — Authorization: Bearer 2dai_sk_... on every request (same key you'd
put in TWODAI_API_KEY for the stdio flow).
Claude Desktop / Cursor / Cline / Windsurf (remote-MCP JSON shape — check
your host's docs, some hosts still spell the type "remote"):
{
"mcpServers": {
"2dai": {
"type": "streamable-http",
"url": "https://mcp.2dai.io:800/mcp",
"headers": { "Authorization": "Bearer 2dai_sk_..." }
}
}
}Claude Code
claude mcp add --transport http 2dai https://mcp.2dai.io:800/mcp \
--header "Authorization: Bearer 2dai_sk_..."Both transports (stdio via npx and hosted via HTTP) expose the exact same
tools. Pick whichever fits: npx when you want zero third-party dependency and
full control of the process, hosted when you want zero install and a single URL.
No filesystem on the hosted server. The process runs in our container, so a
savePath would write to our disk and an upload path would read from it —
both are refused with a clear message (TWODAI_FILE_ACCESS=none is the hosted
default). Instead, download_creation returns an inline preview (images) plus
downloadUrl, the full-resolution file on the API: GET it with the same
Authorization: Bearer header you send to the server (public creations need
none). upload_image / upload_audio take base64. GET /health reports
fileAccess: "none".
Tools
Tool | What it does | Scope | Spends credit |
| Account status: credit, tier, key label/scopes/spend cap | read | no |
| Text-to-image (style/quality default to auto; | generate | yes |
| Image from references on the Gen8 image engine: | generate | yes |
| Animate a still creation into a short clip with sound (first frame + up to 6 references, optional ratio, optionally scored by an | generate | yes |
| Re-run an existing creation ("more like this one") | generate | yes |
| Artist Painter: paint the prompt (and up to 6 subject refs) as a new work in a curated artistic style ( | generate | yes |
| Expand a creation into a landscape wallpaper dimension ( | generate | yes |
| Poll a queued generation by queueId | read | no |
| Cancel a still-waiting generation (charge refunded); explains itself when it is too late | generate | no |
| Upload a local image / base64 as a reference (hosted: base64 only) | generate | no |
| Upload a local MP3 / base64 as the audio reference of a video clip ( | generate | no |
| Save the full-resolution asset to disk, or return an inline preview (hosted: inline preview + | read | no |
| Fetch one creation row by id — same slim shape as | read | no |
| Page, search, sort and filter the library (folders, folder groups, trash, activity lenses, smart collections, shared folders, random pick; likes, type, aspect ratio, dates, NSFW block). Rows include | read | no |
| Page through the public feed (other creators' published work) | read | no |
| Page through the account's folders | read | no |
| The curated artistic styles available to | read | no |
| Folder CRUD + favorites, poster, and sidebar groups (create/rename/delete/move-to-group/list-groups) | manage | no |
| Move / trash / restore / like / unlike one creation (all reversible: trash deletes nothing); | manage | no |
| Publish / unpublish a creation on the public feed | publish | no |
| One consolidated stats read: counters, streak, storage, 30/90-day generation volume + spend, top refs/styles/keywords | read | no |
| $2DAI balance, USD credit, effective tier + the four signals it derives from | finance | no |
| Staking-lock status (none / active / expiring-soon) | finance | no |
| Transactions, balance chart, credit chart, or credit sources | finance | no |
| Cached $2DAI/USD quote with its staleness | read | no |
All wallet tools are read-only — no tool on this server can move money. The finance
scope is opt-in and never part of a key's defaults; enable it in the dashboard's key settings
when you want an agent to see wallet data.
Least privilege
Scopes are set per key in the dashboard. A coding agent that only generates needs
read + generate; add manage for drive organisation, publish only if you want it
posting to the public feed, and finance only for wallet reads. You can also set a
per-key spend cap — the server reports actionable errors when a cap or scope blocks a call.
Configuration (env)
Variable | Default | Meaning |
| — (required) | Your 2DAI API key |
|
| Attach downscaled inline previews to finished generations |
|
| Longest edge of those previews, in px |
|
| How long a generation call blocks before degrading to a queueId |
|
| Window in which an identical re-submit is treated as a retry, not a new charge |
|
| What |
| production API | API origin override (for self-hosted testing) |
| production API | Origin |
Notes for agents
Presets. Image:
maxis the recommended everyday pick (best balance of detail and price);ultimateis the highest resolution for final masters;fast/normalare for drafts. Video:highat 5 seconds is the recommended shot;ultimateis the highest resolution with the longest wait. Every preset abovenormal(image) orfast(video) is tier-gated —get_accountlists what the connected account may submit and the best pick open to it (recommendation), so never probe presets.Channels and engines.
get_accountnames the engine behind each image and video channel and what it takes (platform.engines: asummarysentence plus, from server 2.9.0, the reference capmaxRefCreationIds, sound, aspect ratio and frame rate);next(imageModel/videoModel) is the channel kept for the next engine — leave it unset unlessget_accountshows a distinct engine there. A closed channel is refused, uncharged.Lengths. A clip runs at the length asked, in exact seconds:
get_accountlists the lengths the account may submit (videoDurations, tier lock resolved); any other length is refused withINVALID_DURATION, uncharged.Images keep up to 6
refCreationIdsnatively, renders legible text and honours long literal prompts — describe the scene plainly rather than in keyword lists. Same quality ids, priced on render time, and every reference adds a surcharge.get_accountreports the presets open to the account (qualities,canUseImageNextfor thenextchannel); a submit below a gate is refused with the tier that opens it, uncharged.Video renders clips with sound at 24 fps from a first frame plus up to 6
refCreationIds(each adds a surcharge), with an optionalaspectRatio(autokeeps the first frame's ratio) and an optional audio reference — an MP3 fromupload_audioasaudioCreationId,audioUse: "music"(soundtrack / sound design) or"voice"(a voice sample the speaking character follows); it counts as one more reference. Lengths and presets depend on the account:get_accountlists what it may submit. Long clips render for several minutes: expect aqueueIdand collect it withcheck_generation.Shots. With
style: "raw", write the clip the way TIXI does: the first frame is the opening shot (describe it as it is at 0 s, then the changes in order), about one shot per 1.7–2 s (5 s = 2–3, 8 s = 4, 10 s = 5, 20 s = 12; under 3 s one continuous shot), one camera idea and about one action per shot, each subject anchored by its face, hair, garments and colours, and each sound written next to the action that makes it.Video styles and TIXI. Every video style except
raw(andauto) runs TIXI on the prompt: the style's guidance only exists through that rewrite, so it cannot be switched off.style: "raw"sends the prompt verbatim — passenhance: trueto have TIXI write the clip's brief (shots, pictures and, on an engine with sound, the sound) from a short idea; a prompt starting withtixiadds a thinking pass (the word is dropped from what TIXI reads). No extra credit either way.Price — video is priced on render time, which grows faster than the length (8 s ≈ 1.7–2.2×, 10 s ≈ 2.2–3.4×, 20 s ≈ 6–12× the 5 s price, higher presets at the top of each range), +5 % per reference after the first frame, the audio reference included.
autodraws the preset within the account's tier, so pin it for a predictable cost; every submit returns the resolvedqualitynext tocostUsd.Batches.
check_generationtakesqueueIds(up to 25) to poll a whole batch of shots in one call.Prompts are never cut silently. Listing rows shorten
prompt/descriptionwith an ellipsis and apromptTruncatedflag;get_creationreturns the full text, so a prompt can be re-read and replayed.References are checked at submit. An
inputCreationId/refCreationIdsentry that is unknown, in the trash, deleted, or not visible to the account is refused withCREATION_NOT_FOUNDand the ids, before any charge (restore it withorganise_creation, or drop it).Prompts are capped per account tier (1,500 characters as a Guest, 8,000 at Supporter, 20,000 at Founder):
get_accountreports the exact cap aspromptMaxCharsand the tier that raises it aspromptMaxCharsNext; a longerpromptis refused withPROMPT_TOO_LONGbefore any charge, a longernegativePromptis truncated to the cap. TIXI enhancement is off by default ongenerate_image(enhance: truerewrites a short brief into a full prompt);character-ref, wallpaper resize and the artistic-style tool always run it.Costs are charged at submit against the account's USD credit and refunded on failure;
get_accountshows the headroom,get_statsthe 30 / 90-day burn.Content rating is not an error. Every output carries
nsfwLabel/nsfwRate. From Near-nude (0.8) the reply addscontentRestricted: true: the generation succeeded and was charged, the creation is kept but masked in the owner's drive, cannot be published, and its caption is withheld (get_creationreturns it). Hand over theviewUrlfor review instead of retrying. OnlyNSFW_MAX_EXCEEDEDdiscards an output, uncharged.Skill. The package ships
skills/2dai/SKILL.md— a platform guide for agents (quality ladder, costs, the film recipe, brand-consistency recipe, limits). Point your agent runtime at it, or read it once per session.
The 2DAI stack
2DAI runs its own models, and unlike others, we don't resell model access. All our models originate from the open-source community or our own R&D — we then disassemble, modify, fine-tune and optimize them to align with our legacy and 2DAI❤️ART lines. They also run on our own private cloud network.
get_account names the engine behind each channel (platform.engines, modelLabels); the next channels are
kept for the next engine.
Every tool response carries the model version and stack summary (via
get_account.platform), so an agent can hand these facts back to a user who
asks "what powers you?" without extra plumbing.
License
MIT
Community & links
Website — www.2dai.io
X — @2DAICommunity
Telegram — t.me/Token2dAI
$2DAI on Base — chart on Dexscreener · stake for tiers & daily credit airdrops
SDK — 2dai-cloud-sdk for scripts, servers and apps
GitHub — 2DAICommunity
Available Tools
21 toolsbrowse_feedBrowse the public feedARead-only
Page through the 2DAI public feed — what creators across the platform have published, newest first. Useful for inspiration and trend scans. Rows belong to OTHER accounts (isOwner: false, prompts hidden); you can like them with organise_creation. NSFW-flagged rows are excluded unless includeNsfw is set, and every row carries nsfwFlagged so you can apply your own safeguards. Costs nothing.
Inputs: page, limit, includeNsfw.
cancel_generationCancel a queued generationA
Cancel a generation that is still WAITING in the queue — its charge is refunded and the queue slot freed. Only works before processing starts: once a worker has picked the job up it cannot be aborted, and this returns an explanation with the current status instead. Costs nothing.
Inputs: queueId (required).
check_generationCheck a generationARead-only
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.
Inputs: queueId (required).
download_creationDownload a creationARead-onlyIdempotent
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.
Inputs: cdnId, savePath, creationId.
generate_imageGenerate an imageA
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).
Inputs: prompt (required), wait, style, quality, +3 more.
generate_similarGenerate more like a creationA
Re-run an existing creation — the SERVER re-derives the original tool's parameters (prompt, style, quality, dimensions, references) from the stored row and submits a fresh generation. This SPENDS the account's credit at the usual price. The natural "make more like this one" verb: no parameters to reconstruct. Raw uploads and wallpaper-resize outputs can't be re-derived and are refused. Rapid identical calls within ~5s are deduplicated server-side, never double-charged.
Inputs: creationId (required), wait.
generate_videoGenerate a video from a stillA
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).
Inputs: prompt (required), inputCreationId (required), wait, style, +4 more.
generate_wallpaperExpand a creation into a wallpaperA
Expand an existing creation into a wallpaper format — the original content is preserved and the surroundings are painted outward to fill the new shape. This SPENDS the account's credit: the price follows the chosen dimension, and quality is fixed at Ultra (there is no quality knob on this tool). Dimensions: "standard", "photo", "widescreen", "ultrawide" — unknown values are rejected. Optional extra refs and a prompt steer the newly painted areas. Returns the finished creation within the wait budget, else a queueId for check_generation.
Inputs: dimension (required), inputCreationId (required), wait, prompt, +2 more.
generate_with_refsGenerate an image from referencesA
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.
Inputs: tool (required), refCreationIds (required), wait, prompt, +4 more.
get_accountGet 2DAI account statusARead-only
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.
Inputs: no named parameters.
get_lockGet staking lock statusARead-only
Read-only view of the account's staking lock: none, active (with time remaining), or expiring-soon (under 24 hours left). Needs the opt-in "finance" scope on the API key (enabled in the dashboard's key settings). Locks are managed in the dashboard, never here.
Inputs: no named parameters.
get_statsGet account statisticsARead-only
One consolidated read of the account's activity: creation counts and streak, storage use, generation volume and spend over a 30 or 90 day window (split by day, tool and origin), plus the most-used references, styles and keywords. The first line is a ready-made summary; the JSON block has the detail. Numbers come from a server-side cache — its age is reported, and a stale cache refreshes itself in the background. Costs nothing.
Inputs: days.
get_token_priceGet the $2DAI token priceARead-only
The cached $2DAI/USD quote. Works with the ordinary "read" scope — no finance scope needed. The quote is served from a cache and never triggers a live refresh, so treat it as indicative: the staleness is included so you can judge how current it is. Costs nothing.
Inputs: no named parameters.
get_wallet_historyGet wallet historyARead-only
Read-only money history for the account. kind = "transactions" (deposits, withdrawals and swaps, newest first, paged), "balance" ($2DAI balance chart points over a window of days), "credit" (USD-credit chart points), or "sources" (where credit came from and went over a window: accrued, bonuses, swapped in, spent on generations). Needs the opt-in "finance" scope on the API key (enabled in the dashboard's key settings).
Inputs: kind (required), days, page, limit.
get_wallet_statusGet wallet and tier statusARead-only
Read-only wallet snapshot: $2DAI token balance, USD credit, and the account's effective tier with the four signals it is derived from (explicit assignment, staking watermark, 24h hold watermark, live wallet value — the highest wins). Also flags any in-flight withdrawal, swap or staking lock. Needs the opt-in "finance" scope on the API key (enabled in the dashboard's key settings). No tool on this server can move money.
Inputs: no named parameters.
list_creationsList creationsARead-only
Page through the account's creations, newest first — or pick ONE at random with random=true. Filter MODES are mutually exclusive: folderId ("root" for ungrouped) / trashed=true; an activity lens; a smart collection ("faces", "videos", "crop", "alpha", or "favorites" = creations inside starred folders); or sharedFolderId for a folder another user shared with this account. Cross-cutting filters combine with any mode: search (whole words over description + tags, trailing * makes a prefix), sort, hideFiled, and usedRef= for creations BUILT FROM that creation. Paginate by passing back nextBeforeDate (newest-first only) or with page. Rows carry nsfwFlagged/nsfwRate so you can apply your own content safeguards on top of the platform's. Each row has a viewUrl — the browser link to give the user (opens in their signed-in 2DAI drive). Costs nothing.
Inputs: page, sort, limit, smart, +9 more.
list_foldersList foldersARead-only
Page through the account's folders (collections). Use the folderId with list_creations to see a folder's contents, or with organise_creation to move something into it. Costs nothing.
Inputs: sort, limit, beforeDate.
manage_folderManage folders and sidebar groupsADestructive
Folder CRUD plus sidebar organisation on the account's cloud drive (needs the "manage" scope; "list-groups" only needs "read"). "create" needs a title (optionally a groupId to create it inside a group). "rename" updates title and/or description. "delete" removes the folder — its creations detach to the drive root by default, or go to trash with trashContents=true; never a permanent delete. "set-favorite" stars/unstars a folder (starred folders feed the "favorites" smart collection). "set-poster" pins a creation as the folder cover (null clears it). "move-to-group" files the folder under a sidebar group (null detaches). Groups are the collapsible sidebar sections: "create-group" / "rename-group" take a title, "delete-group" only detaches its folders, "list-groups" shows them all.
Inputs: action (required), title, groupId, favorite, +4 more.
organise_creationMove, trash, restore, delete or like creationsADestructive
Organise creations on the cloud drive (needs the "manage" scope). "move" needs a folderId (or "root" to ungroup). "trash" is reversible; "restore" undoes it. "like"/"unlike" SET the like state — idempotent, a repeat is harmless, and any public creation can be liked too. "batch-trash"/"batch-restore" act on up to 100 ids in one call (reversible, like their single-creation forms). "delete" is PERMANENT, stays one creation per call by design, and only works on a creation already in trash — trash it first, and only delete when the user explicitly asked for permanent removal.
Inputs: action (required), ids, folderId, creationId.
publish_creationPublish or unpublish a creationAIdempotent
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.
Inputs: action (required), creationId (required).
upload_imageUpload an imageA
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 10 MB; jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_ALLOW_ANY_PATH=1.
Inputs: path, base64, filename, contentType, +3 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 21 tools
Each tool targets a distinct resource and action: generation tools are differentiated by input type (text, refs, video, wallpaper, similar), queue management is separate, and finance tools are read-only. No two tools have overlapping purposes.
All tool names follow a consistent verb_noun snake_case pattern (get_, generate_, list_, manage_, organise_, etc.). The naming is uniform and predictable across the entire set.
21 tools is on the heavier side and falls within the 'borderline' range for tool count. However, the broad scope of the 2DAI platform (generation, asset management, folder management, finance) justifies the number, though consolidation could be considered.
The tool surface covers the full lifecycle: generation in multiple forms, queue polling/cancellation, upload/download, listing with filters, folder CRUD, organisation (move, trash, like, delete), and finance read-only. There are no obvious gaps for the stated purpose.
Maintenance
Related MCP Connectors
MCP server for Hailuo (MiniMax) AI video generation
MCP server for ByteDance Seedream AI image generation
MCP server for Wan AI video generation
MCP server for AI dialogue using various LLM models via AceDataCloud
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Pruna AI — ultra-fast image generation, editing, upscaling, and video generation directly from your AI assistant.875 PyPI5MIT
- AlicenseAqualityDmaintenanceMCP server for Krea.ai enabling AI image and video generation using models like Flux, Hailuo, Runway, Kling, and others via natural language prompts.928 npm11Apache 2.0
- FlicenseNot gradedqualityCmaintenanceMCP server enabling AI agents to generate AI videos and images, analyze video content, and download videos from Douyin and Xiaohongshu.-
- AlicenseAqualityBmaintenanceGenerate AI images, video, voiceovers and music from Claude, Cursor or VS Code through 50+ models (Veo 3.1, Kling 3, Seedance, Nano Banana, GPT Image, ElevenLabs). Upload photos for edits and image-to-video. Tools are annotated (read-only vs. credit-spending); failed generations are refunded. Local via npx or hosted with OAuth at fattly.app.645 npmMIT