
本文目录
AI 助手告诉你“任务已进入队列”,或者贴出一个临时下载链接,都不等于动画已经交付。一次真正可用的 MCP 工作流,需要传输真实图片字节、生成前确认费用、等待任务进入终态、保存全部目标文件,并检查下载后的像素和元数据。
这篇文章记录了 2026 年 9 月 11 日由 Codex 完成的一次 AnimGen 生产环境 MCP 实测:从一张透明角色 PNG 开始,拿到源视频、Sprite Sheet 和 JSON 元数据。视觉复核随后发现第一版精灵图的宽高比有误,因此公开样例改为使用同一份下载 MP4 重新导出的正确版本,没有再次调用生成模型,也没有额外消耗积分。你可以直接下载完整实测包,检查最终文件。
本次实测结果
| 项目 | 本次实际结果 |
|---|---|
| MCP 客户端 | Codex 桌面端,通过 OAuth 连接 AnimGen 生产远程服务 |
| 输入 | 1073 × 1466 RGBA PNG,875,625 字节 |
| 模型 | 先实时调用 list_models,再选择 Seedance 2.0 Fast |
| 视频请求 | 4 秒、480p、自适应比例、自动 Alpha Key 工作流 |
| 导出请求 | 16 帧透明动画,每帧 256 × 256,Sprite Sheet PNG + JSON |
| 报价 | 36 AnimGen 积分:视频生成 36,本次导出 0 |
| 最终计费 | 扣除 36,占用 0,退回 0 |
| 任务结果 | 2 分 23 秒后进入 succeeded,没有自动付费重试 |
| 生产任务产物 | MP4 源视频、1024 × 1024 RGBA 精灵图、16 帧 JSON 元数据 |
| 复核后的最终样例 | 保留同一份源 MP4 和 JSON,并从该 MP4 等比重新导出 1024 × 1024 精灵图 |
36 积分只是这次具体请求当时的真实报价,不是永久价格。模型和费用都以当前账户返回为准,每次新生成都应重新查询和报价。
从真正带 Alpha 的图片开始
本次输入是公开的像素女剑士 PNG。它确实是 RGBA 文件:Alpha 范围为 0–255,四角完全透明,画布中大约 27% 的像素属于可见角色。
远程 MCP 服务无法读取你电脑上的 ./character.png。客户端必须先调用 prepare_image_upload,再按照返回的 HTTP 方法和 Headers 传输准确的文件字节,最后调用 complete_image_upload。只有完成上传后得到的 file_id 才能放进生成请求。
这次完成上传后,服务端返回的 875,625 字节和 SHA-256 都与本地原图一致。临时上传地址和账户所属的文件 ID 没有进入公开文章或下载包。
给 MCP 客户端一条边界清楚的任务
比较实用的做法,是在动作要求之外,把消费和文件交付边界也写进提示词:
使用 AnimGen MCP,把 ./character.png 做成可用于 2D 游戏的透明原地行走动画。
先调用 list_models,确认 Seedance 2.0 Fast 当前支持首帧输入、4 秒和 480p。
上传 PNG 的真实字节,不能把本地路径当成已经上传的图片。
使用自动 Alpha Key 模式,导出 16 帧透明 Sprite Sheet 和对应 JSON,
每帧尺寸为 256 × 256。
调用 generate_animation 之前,先向我展示完整请求和当前积分报价,等我明确批准;
不得超过我批准的金额。保存一个固定的幂等键,只轮询同一个任务直到终态,
然后下载并检查全部产物,不要暴露临时签名地址。
它能避免三种常见的“假完成”:只提到本地路径却没有传文件、把 OAuth 授权误当成消费批准,以及拿到签名 URL 却没有真正保存文件。
先连接并做只读验证
AnimGen 的生产 MCP 地址是 https://api.animgen.com/mcp,使用 Streamable HTTP 和 OAuth。这里不应该填写 AnimGen API Key。
Codex CLI 可以这样连接:
codex mcp add animgen --url https://api.animgen.com/mcp
codex mcp login animgen
Codex 官方 MCP 文档说明了远程 HTTP 服务和 OAuth 登录;AnimGen 的客户端接入指南还列出了当前端点及其他兼容客户端。
OAuth 完成后,先用空参数调用 list_models。只要能返回结构化模型列表,就说明只读连接可用,而且不会消耗生成积分。本次实时结果显示,Seedance 2.0 Fast 支持首帧输入、最短 4 秒、480p,以及下方使用的 adaptive 比例。
构造一份不再偷偷变化的请求
上传后的 file_id 属于账户数据,因此下面使用占位符;其他参数与本次成功任务一致:
{
"input": {
"first_frame": {
"type": "file",
"file_id": "YOUR_COMPLETED_UPLOAD_FILE_ID"
}
},
"prompt": "Static camera. The pixel-art swordswoman faces right and walks in place. Alternate the legs clearly, swing the arms naturally, and let the hair and scarf move slightly. Keep the original character design, pixel-art style, full-body framing, scale, and screen position. Do not move the camera or let the character leave the frame.",
"video": {
"model": "volcengine_seedance:doubao-seedance-2-0-fast-260128",
"duration_seconds": 4,
"resolution": "480p",
"ratio": "adaptive",
"transparency": {
"mode": "alpha_key",
"key_selection": "auto"
}
},
"selection": {"mode": "full"},
"export": {
"frame_count": 16,
"output_width": 256,
"output_height": 256,
"output_formats": ["spritesheet", "spritesheet_json"],
"transparent": {"enabled": true}
}
}
两个透明设置都不能漏:video.transparency.mode 要求视频阶段使用 Alpha Key 工作流,export.transparent.enabled 则要求导出阶段产生 RGBA 资产。少写一个,表达的就不是同一项任务。
这里保留模型 ID,是为了准确记录本次测试。新任务应使用当前 list_models 实际返回的 ID,不能假定模型目录永远不变。
先报价,再批准付费生成
我们先把上述请求交给 quote_animation。实际报价为 36 积分:4 秒视频生成占 36,本次选择的 16 帧透明导出增加 0 积分。
完整请求和金额展示给用户、获得 36 积分上限的明确批准后,客户端再次报价,确认价格没有上涨,再调用 generate_animation:
{
"idempotency_key": "ONE_PERSISTED_LOGICAL_OPERATION_KEY",
"quote_id": "FRESH_QUOTE_ID",
"max_credits": 36,
"request": {"...": "与上方完全相同的请求"}
}
不要把本文的 36 直接复制成另一个任务的预算,应使用用户真正看过并批准的当时报价。创建之前要保存请求和幂等键;如果响应不确定,恢复原任务,而不是偷偷换一个 Key 再创建一次付费操作。MCP 支出保护详细说明了这条边界。
轮询到终态,再下载真实字节
generate_animation 返回的是异步任务,不是成品文件。我们持续查询同一个任务,它依次经过 video_generation 和 animation_export,最终进入 succeeded。在两个导出文件完成之前,先出现了一份中间 MP4。
客户端随后对每项产物调用 download_asset,使用临时地址保存文件,但没有向下载请求转发 OAuth 或 API 凭据。任何签名 URL 都没有复制到文章和压缩包中。
| 保存文件 | 实际检测结果 |
|---|---|
source-video.mp4 |
1,950,417 字节;H.264、560 × 752、24 FPS、97 帧、4.041667 秒 |
第一版 spritesheet.png |
1,005,811 字节;1024 × 1024 RGBA PNG;视觉复核发现帧画面变形后废弃 |
最终 spritesheet.png |
809,336 字节;1024 × 1024 RGBA PNG;从同一份源 MP4 等比缩放并透明补边后重新导出 |
spritesheet.json |
6,790 字节;16 条帧记录,每帧 256 × 256、持续 253 ms |
源 MP4 带一层纯色键控背景,这是生成动画的中间素材,不是最终透明交付格式。
真正的透明度位于最终导出的 PNG 帧中:
打开动态棋盘格预览,可以连续查看全部 16 个最终帧。
把 Sprite Sheet 和 JSON 放在一起验收
最终精灵图是一个 4 × 4 网格。JSON 记录了每一格的矩形、源尺寸和持续时间,因此游戏或构建工具不需要只凭图片猜测切片布局。
实际文件检查结果如下:
- 三份原始下载文件的字节数都与 MCP 资产信息一致;
- 修正后的最终精灵图为 809,336 字节,并保持了源视频中的人物比例;
- PNG 为 RGBA,所有帧的 Alpha 都同时包含 0 和 255;
- 16 个帧图像彼此不同;
- 每帧抽样的四角 Alpha 都为 0;
- JSON 中 16 个矩形与 1024 × 1024 精灵图里的 256 × 256 单元格完全对应;
- JSON 播放总长为 4.048 秒,与源视频相差不到 0.01 秒;
- 任务只扣除一次已批准的 36 积分,没有遗留占用,也没有付费重试。
这些检查可以发现传输、打包和明显的透明度错误;最终是否可用,还是要把动作放进目标场景里看。
视觉复核发现并修正了宽高比问题
第一版导出通过了文件、Alpha、帧数和 JSON 布局检查,但画面看起来仍然不对:角色明显过宽、过矮。源视频尺寸是 560 × 752,而导出路径把每一帧直接压成了 256 × 256,人物的横向比例因此被放大了大约 34%。我们没有把这个“技术检查通过、视觉却不可信”的精灵图继续当作案例成品。
最终样例修正了透明导出路径,只对同一份真实下载 MP4 重新执行确定性的分帧和打包。每个视频帧先等比缩放为 191 × 256,再居中放进 256 × 256 的透明画布;左侧补 32 像素,右侧补 33 像素。修正后相对宽高比误差低于 0.2%,角色右侧的可见像素也至少保留了 33 像素安全空间。
修正后的 4 × 4 精灵图仍包含 16 个不同的 RGBA 帧,抽样四角全部透明,JSON 单元格布局和 4.048 秒播放总长都没有变化。因为复用了源视频,这次修正没有再次调用生成模型,最终费用仍然只有原先批准的 36 积分。
AnimGen 的输入画布仍然适合在生成阶段为角色留出更多活动空间;但它属于构图控制,不能代替导出阶段对宽高比的正确处理。
下载样例,或改用开放 API
MCP 实测下载包包含公开输入图、生产任务真实返回的源 MP4 和 JSON、修正后的最终精灵图、动态预览、分帧检查图、README,以及移除私密 ID 的请求模板。包内没有 OAuth Token、签名 URL、账户文件 ID、资产 ID、报价 ID、任务 ID 或幂等键。
如果生产架构里并不需要 AI 助手,也可以通过开放 API 完成类似流程,从图片到资产的 API 快速开始入手。MCP 使用 OAuth 工具,并能通过批准后的 quote_id 或 max_credits 提供支出保护;API 使用 API Key 和自己文档中的预检查流程,两套鉴权与消费模型不要混用。
需要接入 Agent 工作流时,继续查看完整的 MCP 标准生成流程。如果想先在界面中制作和检查自己的角色动画,可以打开 AnimGen 工作台。

