byteplus-seedance-mcp
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., "@byteplus-seedance-mcp Generate a 10-second video of a sunrise over mountains"
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.
seedance-mcp
An MCP server that lets Claude Code generate video with BytePlus ModelArk Dreamina Seedance 2.5.
Ask Claude Code for a video in plain language; it submits the task to BytePlus, polls until the render finishes, and hands back the video URL with the metadata BytePlus reports.
1. What it does
Six tools over MCP stdio:
Tool | Purpose |
| Submit a generation task. Returns a task ID immediately — generation is asynchronous. |
| One status check for a task; returns the video URL once it succeeds. |
| Poll with backoff until the task succeeds, fails, or times out. |
| Save a finished video to a local file before its 24-hour URL expires. |
| Cancel a queued task, or delete a finished task's record. |
| List recent tasks, filterable by status and model. |
It handles the parts that are easy to get wrong: encoding local images and audio into the Base64 data-URI form the API expects, enforcing the per-model parameter limits before a request is sent, retrying transient failures with backoff, and keeping the API key out of every log line and error message.
Related MCP server: @lweight/xbrush-api-mcp
2. Prerequisites
Python 3.11+
uv —
brew install uvorcurl -LsSf https://astral.sh/uv/install.sh | shClaude Code 2.x
A BytePlus ModelArk account with an API key and the Seedance model activated.
3. BytePlus configuration
Create an API key: ModelArk console → API keys.
Activate the model. Seedance 2.5 is not enabled by default. BytePlus requires one of:
account balance above USD 30, or
an AI Savings Plan at the USD 30 tier or above, or
a Seedance resource pack with quota remaining.
Activate under ModelArk → Model activation → Computer Vision. Without this, task creation fails with an authorization error even though the key itself is valid.
Note your region. The default base URL below is
ap-southeast(Singapore). If your account is provisioned elsewhere, setBYTEPLUS_BASE_URLaccordingly — a task created in one region is not visible from another.
4. Installation
git clone <this repo> ~/code/seedance-mcp # or just use the directory you already have
cd ~/code/seedance-mcp
uv syncVerify:
uv run pytest -q # 93 tests, all offline against mocked HTTP
uv run ruff check .5. .env setup
cp .env.example .envThen fill in one required variable:
BYTEPLUS_API_KEY=your-modelark-api-keyEverything else is optional and already defaulted:
BYTEPLUS_BASE_URL=https://ark.ap-southeast.bytepluses.com/api/v3
SEEDANCE_MODEL_ID=dreamina-seedance-2-5-260628.env is gitignored. The key is read from the environment only — it is never written to disk by
this server, never logged, and is scrubbed from API error messages before they reach Claude.
6. Choosing the Seedance 2.5 model ID
Seedance 2.5 is a shared, universally available model ID — you do not need to create a dedicated endpoint. The default is:
dreamina-seedance-2-5-260628Note the dreamina- prefix. This is a real inconsistency in BytePlus's naming: the 2.x Dreamina
models carry it, while the 1.x IDs do not (seedance-1-5-pro-251215). Copying a 1.x-shaped ID for
2.5 is the most common cause of a "model not found" error.
Confirm the current ID for your account in the ModelArk model list.
If you prefer a dedicated endpoint (for per-endpoint rate limits, prepaid billing, or
monitoring), create one in the console and put its endpoint ID in SEEDANCE_MODEL_ID instead:
SEEDANCE_MODEL_ID=ep-20260817120000-abcde
SEEDANCE_MODEL_PROFILE=seedance-2.5SEEDANCE_MODEL_PROFILE is needed only in that case: an ep-... ID says nothing about which model
sits behind it, so without it the server cannot validate parameters locally and will pass
everything through to the API for validation instead.
7. Register with Claude Code
From this directory (use the absolute path — Claude Code launches the server from arbitrary working directories):
claude mcp add \
--transport stdio \
--scope user \
byteplus-seedance \
-- uv --directory /Users/alban/code/seedance-mcp run python -m seedance_mcp--scope user makes it available in every project. Use --scope project to share it with a repo's
collaborators via .mcp.json, or omit --scope for the current project only.
The server reads .env from its own directory, so no -e flags are needed. If you would rather
pass the key explicitly:
claude mcp add --scope user byteplus-seedance \
-e BYTEPLUS_API_KEY=your-key \
-- uv --directory /Users/alban/code/seedance-mcp run python -m seedance_mcp8. Verification
claude mcp listExpect a line like:
byteplus-seedance: uv --directory /Users/alban/code/seedance-mcp run python -m seedance_mcp - ✓ ConnectedThen inside Claude Code, /mcp lists the server and its six tools. Ask it:
List my recent Seedance tasks.
That exercises authentication and connectivity without spending generation credits — an empty list
is a success. If the key is wrong you get an explicit HTTP 401 message instead.
For an end-to-end check that actually renders a file, use the minimum-cost recipe in §10.
9. Example Claude Code prompts
Generate a 10-second 1080p cinematic video of Tokyo at night using Seedance 2.5.Use ./assets/reference.png as the visual reference and generate a slow cinematic push-in shot.Create the video and wait until generation finishes.Generate a 15-second 9:16 vertical clip of a surfer at sunrise, no audio, and give me the URL.Use ./assets/first.png as the first frame and ./assets/last.png as the last frame,
6 seconds, and wait for it.Check the status of task cgt-20260817... and download the video if it's ready.Download task cgt-20260818061514-8t2lv into ./renders/ and keep the last frame too.Cancel task cgt-20260817... — I queued the wrong prompt.10. Cost and timing
Generation is billed per second of output, scaled by resolution and model. The cheapest way to prove the pipeline works is a 4-second 480p clip — 4s is the shortest length any Seedance 2.x model accepts.
Free check, no generation credits spent:
List my recent Seedance tasks.Cheapest real generation. Seedance 2.0 mini is the least expensive model on the account; during the promotion running to 7 Sep 2026 its 720p output starts around USD 0.03/second, and 480p sits below that:
Using Seedance model seedance-2-0-mini-260615, generate a 4-second 480p video, 16:9, no audio,
prompt: "a red balloon floating up against a blue sky". Then wait for it and give me the URL.Cheapest test of the Seedance 2.5 default path — worth running separately, since 2.5 is a different model activation and a different price tier:
Generate a 4-second 480p Seedance 2.5 video, 16:9, no audio,
prompt: "a red balloon floating up against a blue sky". Wait for it and give me the URL.Measured baseline
From one real Seedance 2.5 text-to-video run on 2026-08-18:
Output | Wall-clock | Reported usage |
4s · 480p · 16:9 · 24 fps · silent | ~105 s | 38,830 tokens |
That is the floor: the shortest duration at the lowest resolution with no reference media. It also
sets expectations for seedance_wait_for_video, whose 900-second default timeout is sized for jobs
an order of magnitude heavier than this one.
Scaling from that baseline is extrapolation, not measurement — usage tracks output seconds and pixel count, so a 10-second 1080p clip is roughly 2.5× the seconds and ~5× the pixels, i.e. of order 10× this run. Treat it as a planning estimate and confirm against your own billing.
The duration cost trap
Seedance 2.5 defaults duration to -1, which lets the model pick any length up to 30
seconds. Since billing is per second of output, a request that doesn't state a duration can cost
around 7× an intended 4-second test. State the number of seconds explicitly in any cost-sensitive
run — the tool passes it straight through, and 4 is the floor.
Two smaller notes: 480p and 720p are excluded from the current 2.5 promotional discount (only 1080p
is discounted), so 480p remains cheapest in absolute terms — the discount simply doesn't apply to
it. And no audio mainly shortens generation time; nothing in the documentation shows it reduces
the price.
11. Troubleshooting
Symptom | Cause and fix |
| No |
| Wrong or revoked key, or a key from a different BytePlus account than the one holding the model activation. |
| The task was created in a different region, or it is older than 7 days (BytePlus purges task records after 7 days). |
Model-not-found on create |
|
| Rate limited. The client already retries with backoff and honours |
| Expected. BytePlus accepts reference video only as a public URL or |
Task fails with | Seedance 2.5 inferred a different task type than your parameters allow. Set |
| Output URLs expire 24 hours after completion, and Seedance 2.5 URLs allow at most 100 downloads. Re-generate, or configure BytePlus TOS data subscription for durable storage. Use |
| Guard against clobbering a previous render. Pass |
|
|
Server shows as failed in | Run the command by hand — |
12. Supported Seedance 2.5 features
Task types (mutually exclusive — BytePlus rejects mixtures):
Text-to-video — prompt only.
Image-to-video —
first_frame, optionally pluslast_frame. The output starts and ends on exactly those images.Omni reference-to-video — up to 30 reference images, 10 reference videos and 10 audio clips, with audio-only input allowed. Cite assets in the prompt as
@Image 1,@Video 2. Covers three sub-tasks: reference-to-video, video editing, and video extension — steer them withomni_reference_task_type.
Output controls
Parameter | Seedance 2.5 values |
|
|
|
|
| 4–30 seconds, or |
|
|
|
|
|
|
|
|
|
|
Media inputs
Type | Formats | Per-file limit | Local file support |
Image | jpeg, png, webp, bmp, tiff, gif, heic, heif | 30 MB | ✅ inlined as Base64 |
Audio | wav, mp3 | 15 MB | ✅ inlined as Base64 |
Video | mp4, mov | 200 MB | ❌ public URL or |
Prompts work in English, Spanish, Indonesian, Portuguese, Japanese, Malay, Thai, Arabic, Vietnamese and Korean. Keep them under ~1000 English words.
Saving output. seedance_download_video takes a task ID, looks up the current URL itself, and
streams the file to disk. Defaults to ./<task_id>.mp4; pass a file path or an existing directory
as output_path. It never overwrites without overwrite: true, cleans up partial files if a
download breaks, and can also fetch the closing PNG with include_last_frame when the task was
created with return_last_frame. Two deliberate restrictions: downloads go over its own
unauthenticated HTTP client, so the ModelArk key is never sent to the storage host, and the URL
host must end in .volces.com, .bytepluses.com or .byteplus.com — this is a Seedance output
fetcher, not a general-purpose downloader.
The server also targets older models via the model tool argument or SEEDANCE_MODEL_ID —
Seedance 2.0 / 2.0 fast / 2.0 mini, 1.5 pro, 1.0 pro and 1.0 pro fast — validating each against its
own limits (for example 4K is valid on 2.0 but not on 2.5).
13. Known API limitations
Generation is asynchronous. Nothing returns a video synchronously; a 5–10 second clip typically takes a few minutes, longer at 1080p.
No settable
seedorcamera_fixedon Seedance 2.5. The current API reference lists both as input parameters for Seedance 1.5 pro, 1.0 pro and 1.0 pro fast only. This server rejects them for 2.5 with an explicit message rather than silently dropping them. Express camera behaviour in the prompt instead. (Older Seedance 1.x tutorials and third-party examples still show these parameters — they no longer apply to 2.5.)Observed in a real 2.5 run: the task response still reports a
seed(surfaced asVideoResult.seed, e.g.80969), because the model picks one internally. So you can see which seed produced a clip, but you cannot ask for it back — 2.5 generations are not reproducible.No
frameson Seedance 2.5. Sub-second durations via frame count are a 1.0 pro feature.Local video cannot be uploaded. Images and audio have a Base64 form; video does not.
64 MB request-body ceiling. Inlining several large images will hit it; the server checks before sending and tells you to switch to URLs.
Real human faces are restricted. Seedance 2.x rejects reference images and videos containing real human faces unless they are a prior Seedance output from your own account (within 30 days), a preset digital character, or an authorised real-person asset.
Only queued tasks can be cancelled. Once a task is running, it runs to completion.
Output URLs live 24 hours, with a 100-download cap on Seedance 2.5. Both limits are baked into the signed URL itself — a returned link carries
X-Tos-Expires=86400andX-Tos-Max-Requests=100. There is no re-issue endpoint, andseedance_list_taskscan only hand back a URL that is still inside that window. Useseedance_download_videoto save anything worth keeping; once the window closes the only remedy is to generate again.Task records live 7 days.
Reference-media duration limits are not checked locally. Per-clip (2–30s) and total (30s) limits for reference video and audio need media probing; the server does not add a decoder dependency for it, so BytePlus enforces those and reports them as task errors.
Prices and constraints change. The capability table in
src/seedance_mcp/capabilities.pywas transcribed from the BytePlus docs on 2026-08-17; re-check it if BytePlus ships a new model revision.
14. Project layout
seedance-mcp/
├── pyproject.toml
├── README.md
├── .env.example
├── .gitignore
├── src/seedance_mcp/
│ ├── __init__.py
│ ├── __main__.py # stdio entry point
│ ├── server.py # the six MCP tools
│ ├── client.py # BytePlus HTTP client: retries, error parsing
│ ├── payload.py # request building + validation
│ ├── capabilities.py # per-model limits from the official docs
│ ├── media.py # local file -> data URI, with validation
│ ├── models.py # typed request/response models
│ ├── config.py # environment configuration
│ └── errors.py # error types + secret redaction
└── tests/capabilities.py, payload.py and media.py are additions to the layout sketched in the brief:
the documented per-model constraint table, the request builder and the media handling each carry
real logic and their own tests, and folding them into server.py or models.py would have made
both hard to read.
15. Sources
Every API detail above was verified against current official BytePlus documentation:
Available Tools
6 toolsseedance_cancel_videoCancel or delete a Seedance taskA
Cancel a Seedance task that is still queued, or delete the record of one that already finished. BytePlus maps both to a single DELETE call. Only queued tasks can actually be cancelled - a task already running cannot be stopped, and the call will fail. Cancelled tasks are purged after 24 hours.
Inputs: task_id (required). Returns: Return type of ``seedance_cancel_video``.
seedance_create_videoCreate a Seedance video generation taskA
Start a Seedance video generation task on BytePlus ModelArk and return its task ID. Generation is ASYNCHRONOUS and takes minutes: this tool returns immediately without a video. Follow it with seedance_wait_for_video (blocks until the video is ready - use this when the user just wants the video) or seedance_get_video (single status check).
Choose exactly ONE input shape; BytePlus rejects mixtures:
text-to-video: prompt only.
image-to-video: first_frame (+ optional last_frame) - the output starts (and ends) on those exact frames.
omni reference-to-video: image_references / video_references / audio_references - the model borrows subjects, style, motion or sound from them. Seedance 2.5 accepts up to 30 images, 10 videos and 10 audio clips, and can run on audio alone. Refer to them in the prompt as '@Image 1', '@Video 2' etc. first_frame/last_frame cannot be combined with the *_references parameters.
Media may be a local file path, a public https:// URL, or an asset://. Local images (jpeg, png, webp, bmp, tiff, gif, heic, heif; max 30 MB) and local audio (wav, mp3; max 15 MB) are inlined automatically. Local VIDEO files cannot be uploaded - BytePlus takes reference video only as a public URL, so host it first.
Seedance 2.5 supports resolution 480p/720p/1080p, ratio 16:9/4:3/1:1/3:4/9:16/21:9/adaptive, and duration 4-30 seconds (or -1 to let the model choose). It does NOT support seed or camera_fixed - describe camera moves in the prompt instead.
Inputs: seed, model, ratio, prompt, +14 more. Returns: Return type of ``seedance_create_video``.
seedance_download_videoDownload a finished Seedance videoA
Save a finished Seedance video to a local file. Use this whenever the user wants to keep the video rather than just see a link: output URLs expire 24 hours after the task completes and allow only 100 downloads, and BytePlus cannot re-issue them. Pass the task_id - the tool looks up the current URL itself, so it works on any task that succeeded within the last 24 hours. The task must be in 'succeeded' state. Without output_path the file is written to the current directory as <task_id>.mp4. An existing file is never overwritten unless overwrite is true. Set include_last_frame to also save the closing PNG, which is only available if the task was created with return_last_frame.
Inputs: task_id (required), overwrite, output_path, include_last_frame. Returns: Return type of ``seedance_download_video``.
seedance_get_videoCheck a Seedance taskA
Check a Seedance generation task once and return its current state. Use this for a quick status poll; if the user is waiting for the finished video, use seedance_wait_for_video instead of calling this in a loop. Status is one of queued, running, succeeded, failed, cancelled, expired. On success the result carries video_url (valid 24 hours), plus the resolution, aspect ratio, duration and frame rate BytePlus actually produced. On failure it carries error_code and error_message. Task records are kept for 7 days.
Inputs: task_id (required). Returns: Return type of ``seedance_get_video`` and ``seedance_wait_for_video``.
seedance_list_tasksList recent Seedance tasksA
List recent Seedance generation tasks for this account, newest first, optionally filtered by status or model. Useful to recover a task ID that was lost, to check what is still queued, or to re-fetch a video URL for a task that finished within the last 24 hours. BytePlus keeps task records for 7 days.
Inputs: model, status, page_num, page_size. Returns: Return type of ``seedance_list_tasks``.
seedance_wait_for_videoWait for a Seedance video to finishA
Poll a Seedance task until it succeeds, fails, or the timeout elapses, then return the final result including the video URL. Call this right after seedance_create_video whenever the user wants the finished video rather than a task ID. Polling backs off automatically. A 5-10 second clip usually lands within a few minutes; long or 1080p jobs take longer, so raise timeout_seconds for those. A timeout does not cancel anything - the task keeps running and can be waited on again.
Inputs: task_id (required), timeout_seconds, raise_on_failure, poll_interval_seconds. Returns: Return type of ``seedance_get_video`` and ``seedance_wait_for_video``.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool serves a distinct purpose: creating, checking status, waiting, downloading, canceling, and listing tasks. There is no overlap, and the descriptions clearly differentiate their use cases.
All tools follow a consistent verb_noun pattern prefixed with 'seedance_': create_video, get_video, wait_for_video, download_video, cancel_video, list_tasks. No mixing of conventions.
With 6 tools, the set is well-scoped for a video generation service. It covers the necessary operations without being too sparse or bloated.
The tool surface covers the full lifecycle: creation, monitoring (with two convenient patterns), output retrieval, cancellation/deletion, and history listing. No obvious gaps for the intended domain.
Maintenance
Related MCP Connectors
MCP server for Hailuo (MiniMax) AI video generation
MCP server for Grok Imagine AI video generation
MCP server for OpenAI Sora AI video generation
MCP server for Kling AI video generation
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA local MCP server that gives Claude Desktop full video editing capabilities via FFmpeg, Whisper, and yt-dlp.-
- AlicenseAqualityCmaintenanceMCP server for the XBrush AI media generation API, enabling image, video, audio generation, editing, and more directly from Claude Code via async polling.2122 npmMIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that uses Google's Gemini API to analyze videos and convert them to text descriptions that Claude Code can understand and act upon.143 npmMIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that enables Claude to generate Minecraft structures from natural language descriptions.1MIT