Skip to main content
Glama

2dai-mcp-server

npm

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 refCreationIds kept 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 optional aspectRatio and an optional audio reference (upload_audio an MP3, then pass its id as audioCreationId, 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_account lists 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-server

Claude 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

get_account

Account status: credit, tier, key label/scopes/spend cap

read

no

generate_image

Text-to-image (style/quality default to auto; enhance: true runs the TIXI prompt enhancer, off by default); up to 6 refCreationIds kept natively, legible text; aspectRatio sets the shape (phone wallpaper = 9:19.5, story = 9:16, desktop = 16:9, default 1:1)

generate

yes

generate_with_refs

Image from references on the Gen8 image engine: character-ref (1–6 shots of one character, face photos lock the face), style-transfer (1–6 style sources), smart-edit (edit refs[0] per the prompt, up to 5 support refs)

generate

yes

generate_video

Animate a still creation into a short clip with sound (first frame + up to 6 references, optional ratio, optionally scored by an upload_audio reference); enhance: true lets TIXI write the brief on a raw style — every other style already runs TIXI

generate

yes

generate_similar

Re-run an existing creation ("more like this one")

generate

yes

generate_in_artistic_style

Artist Painter: paint the prompt (and up to 6 subject refs) as a new work in a curated artistic style (artisticStyleId from list_artistic_styles, or auto)

generate

yes

generate_wallpaper

Expand a creation into a landscape wallpaper dimension (standard 4:3, photo 3:2, widescreen 16:9, ultrawide 21:9; a phone wallpaper is a 9:19.5 generate_image); own engine, quality fixed at Ultra, price follows the dimension

generate

yes

check_generation

Poll a queued generation by queueId

read

no

cancel_generation

Cancel a still-waiting generation (charge refunded); explains itself when it is too late

generate

no

upload_image

Upload a local image / base64 as a reference (hosted: base64 only)

generate

no

upload_audio

Upload a local MP3 / base64 as the audio reference of a video clip (audioCreationId + audioUse on generate_video)

generate

no

download_creation

Save the full-resolution asset to disk, or return an inline preview (hosted: inline preview + downloadUrl)

read

no

get_creation

Fetch one creation row by id — same slim shape as list_creations rows. Opt-in path for the vision-derived caption when a generation reply gates it (NSFW ≥ Near-nude)

read

no

list_creations

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 nsfwFlagged/nsfwRate so agents can apply their own safeguards

read

no

browse_feed

Page through the public feed (other creators' published work)

read

no

list_folders

Page through the account's folders

read

no

list_artistic_styles

The curated artistic styles available to generate_in_artistic_style

read

no

manage_folder

Folder CRUD + favorites, poster, and sidebar groups (create/rename/delete/move-to-group/list-groups)

manage

no

organise_creation

Move / trash / restore / like / unlike one creation (all reversible: trash deletes nothing); batch-trash / batch-restore up to 100; delete, the only permanent action, stays one-at-a-time

manage

no

publish_creation

Publish / unpublish a creation on the public feed

publish

no

get_stats

One consolidated stats read: counters, streak, storage, 30/90-day generation volume + spend, top refs/styles/keywords

read

no

get_wallet_status

$2DAI balance, USD credit, effective tier + the four signals it derives from

finance

no

get_lock

Staking-lock status (none / active / expiring-soon)

finance

no

get_wallet_history

Transactions, balance chart, credit chart, or credit sources

finance

no

get_token_price

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

TWODAI_API_KEY

— (required)

Your 2DAI API key

TWODAI_PREVIEWS

1

Attach downscaled inline previews to finished generations

TWODAI_PREVIEW_MAX_SIDE

512

Longest edge of those previews, in px

TWODAI_WAIT_BUDGET_MS

45000

How long a generation call blocks before degrading to a queueId

TWODAI_IDEMPOTENCY_WINDOW_MS

30000

Window in which an identical re-submit is treated as a retry, not a new charge

TWODAI_FILE_ACCESS

cwd

What path / savePath may touch: cwd (confined to the working directory), any (no boundary), none (no filesystem — the hosted default; any is refused there). TWODAI_ALLOW_ANY_PATH=1 still means any

TWODAI_API_BASE

production API

API origin override (for self-hosted testing)

TWODAI_PUBLIC_API_BASE

production API

Origin downloadUrl is built on (hosted / none mode) — the API address the caller can reach, not a private one

Notes for agents

  • Presets. Image: max is the recommended everyday pick (best balance of detail and price); ultimate is the highest resolution for final masters; fast / normal are for drafts. Video: high at 5 seconds is the recommended shot; ultimate is the highest resolution with the longest wait. Every preset above normal (image) or fast (video) is tier-gated — get_account lists what the connected account may submit and the best pick open to it (recommendation), so never probe presets.

  • Channels and engines. get_account names the engine behind each image and video channel and what it takes (platform.engines: a summary sentence plus, from server 2.9.0, the reference cap maxRefCreationIds, sound, aspect ratio and frame rate); next (imageModel / videoModel) is the channel kept for the next engine — leave it unset unless get_account shows a distinct engine there. A closed channel is refused, uncharged.

  • Lengths. A clip runs at the length asked, in exact seconds: get_account lists the lengths the account may submit (videoDurations, tier lock resolved); any other length is refused with INVALID_DURATION, uncharged.

  • Images keep up to 6 refCreationIds natively, 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_account reports the presets open to the account (qualities, canUseImageNext for the next channel); 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 optional aspectRatio (auto keeps the first frame's ratio) and an optional audio reference — an MP3 from upload_audio as audioCreationId, 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_account lists what it may submit. Long clips render for several minutes: expect a queueId and collect it with check_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 (and auto) 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 — pass enhance: true to have TIXI write the clip's brief (shots, pictures and, on an engine with sound, the sound) from a short idea; a prompt starting with tixi adds 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. auto draws the preset within the account's tier, so pin it for a predictable cost; every submit returns the resolved quality next to costUsd.

  • Batches. check_generation takes queueIds (up to 25) to poll a whole batch of shots in one call.

  • Prompts are never cut silently. Listing rows shorten prompt / description with an ellipsis and a promptTruncated flag; get_creation returns the full text, so a prompt can be re-read and replayed.

  • References are checked at submit. An inputCreationId / refCreationIds entry that is unknown, in the trash, deleted, or not visible to the account is refused with CREATION_NOT_FOUND and the ids, before any charge (restore it with organise_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_account reports the exact cap as promptMaxChars and the tier that raises it as promptMaxCharsNext; a longer prompt is refused with PROMPT_TOO_LONG before any charge, a longer negativePrompt is truncated to the cap. TIXI enhancement is off by default on generate_image (enhance: true rewrites 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_account shows the headroom, get_stats the 30 / 90-day burn.

  • Content rating is not an error. Every output carries nsfwLabel / nsfwRate. From Near-nude (0.8) the reply adds contentRestricted: 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_creation returns it). Hand over the viewUrl for review instead of retrying. Only NSFW_MAX_EXCEEDED discards 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

Available Tools

21 tools
browse_feedBrowse the public feedA
Read-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 generationA
Read-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 creationA
Read-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 statusA
Read-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 statusA
Read-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 statisticsA
Read-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 priceA
Read-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 historyA
Read-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 statusA
Read-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 creationsA
Read-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 foldersA
Read-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 groupsA
Destructive

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 creationsA
Destructive

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 creationA
Idempotent

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

    A4.3/5.0

    Scored across 21 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count3/5

    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.

    Completeness5/5

    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

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers