@starreel/mcp 0.1.70 → 0.1.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +18 -3
- package/dist/tools/produce.js +16 -2
- package/openapi.json +21 -5
- package/package.json +1 -1
- package/server.json +2 -2
package/SKILL.md
CHANGED
|
@@ -143,8 +143,11 @@ content that will be rejected.
|
|
|
143
143
|
3. **`retryable` decides retry-vs-change — never blind-retry.** On failure read
|
|
144
144
|
the structured `fail_reason` / `retryable` (from `get_storyboards`) or the
|
|
145
145
|
`message` / `error.type`. `retryable:false` (moderation, copyright, quota,
|
|
146
|
-
overdue) → change the content or stop; retrying is useless.
|
|
147
|
-
(KYC-queuing, rate-limit, transient) → back off, then retry.
|
|
146
|
+
overdue, `needs_content_fix`) → change the content or stop; retrying is useless.
|
|
147
|
+
`retryable:true` (KYC-queuing, rate-limit, `transient`) → back off, then retry.
|
|
148
|
+
`contract_rejected` is retryable **but is not a network blip**: it is a content
|
|
149
|
+
or contract conflict that a re-roll clears about a third of the time. Retry once
|
|
150
|
+
or twice, then read `fail_hint` and change the shot — do not keep re-rolling.
|
|
148
151
|
|
|
149
152
|
4. **Content must be compliant.** Do not generate copyrighted characters,
|
|
150
153
|
trademarks, real-person likenesses, or sensitive content. On a moderation /
|
|
@@ -214,6 +217,16 @@ content that will be rejected.
|
|
|
214
217
|
on hailuo-3 / wan3.0 / wan3.0-prime — `edit_video_shot` rejects
|
|
215
218
|
`start_sec`/`end_sec` on them. `edit_video_shot` also takes a per-call
|
|
216
219
|
`model` so one shot can be edited on a different engine than the drama's.
|
|
220
|
+
**Negative phrasing backfires.** If the receipt carries
|
|
221
|
+
`edit_instruction_negation_advisory`, the instruction contained phrases like
|
|
222
|
+
"don't use X" / "不能采用X". Video models read nouns as positive cues, so the
|
|
223
|
+
thing you forbade is often exactly what gets performed — the forbidden item is
|
|
224
|
+
the most salient one in the model's prior. It is advisory only (the job was
|
|
225
|
+
submitted), but on the next pass **replace the negation with a positive
|
|
226
|
+
description** — state what the shot should do (the opening gesture, where the
|
|
227
|
+
hands are, the beat timing). Measured: an instruction saying "do not use the
|
|
228
|
+
reference image's raised-arm pose" produced exactly that raised arm at the
|
|
229
|
+
opening, overriding the source video's motion.
|
|
217
230
|
**How to choose (guide the customer proactively)**: ① realistic live-action
|
|
218
231
|
dramas → `seedance-2.5` (best instruction-following and face detail), or
|
|
219
232
|
`hailuo-3` to cut cost to ~1/3 (slower, ~6 min/shot); ② stylized / animated /
|
|
@@ -465,7 +478,9 @@ Map the reason to an action:
|
|
|
465
478
|
| `quota_full` | false | Platform vendor-asset quota exhausted | Retry won't help — contact ops |
|
|
466
479
|
| `insufficient_credits` | false | Balance too low for this call | Stop, prompt to recharge (402) |
|
|
467
480
|
| `authorizing` | true | Face frame queuing for KYC (not a rejection) | Wait ~1 min, retry |
|
|
468
|
-
| `transient` | true | BestOfN / quality-gate / rate-limit / network | Back off, retry |
|
|
481
|
+
| `transient` | true | BestOfN / quality-gate / rate-limit / network, or the audit itself failed to run | Back off, retry |
|
|
482
|
+
| `contract_rejected` | true | A **content/contract** rejection (era, composition, shot size, head-count, readable text…) — **not** a network blip. Measured: a blind re-roll clears it about a third of the time | Retry once or twice; if the same reason keeps coming back, read `fail_hint` and change the shot or the contract instead of re-rolling |
|
|
483
|
+
| `needs_content_fix` | false | A content/contract conflict that a re-roll almost never clears (measured ≤10%) — most often the character's wardrobe/accessory record conflicting with the approved portrait | Change the shot description / character record / visual contract **first**, then regenerate. A blind retry is a full-price repeat |
|
|
469
484
|
| `repeat_rejected` | false | Same shot rejected for the same reason until the circuit breaker tripped (auto-clears after 24 h) | Change the prompt / references / contract **first**; a blind retry is a full-price repeat of the same rejection |
|
|
470
485
|
| `pair_collateral` | true | The **other** frame of this shot failed its audit; this frame was never judged bad — it was only closed out with the batch | Do **not** edit this frame. If the shot carries `reopen_pair_id`, pass it to `generate_shot_frame` to redo only the faulty side; otherwise regenerate the shot |
|
|
471
486
|
| `unknown` | false | Unclassified | Read `fail_hint`; don't auto-retry |
|
package/dist/tools/produce.js
CHANGED
|
@@ -538,7 +538,10 @@ export function registerProduceTools(server, client) {
|
|
|
538
538
|
'把 findings 逐条告诉客户、按 action 修完(改稿走 edit_rewritten_script)后复审,再拿 review_token 往下走。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/review/script`)));
|
|
539
539
|
server.tool('review_storyboards', '【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、' +
|
|
540
540
|
'同场景角色站位漂移、情绪曲线峰谷、关键镜标记。★generate_frames 之前必须先跑本工具——' +
|
|
541
|
-
'分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。'
|
|
541
|
+
'分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。' +
|
|
542
|
+
'★code=forbidden_term 的 finding 带 `terms` 字段(命中的具体词,如「背景音乐」「强光」)与 `shots`(镜号),' +
|
|
543
|
+
'照着这两个去 update_shot 改掉即可,不用逐字猜。' +
|
|
544
|
+
'★禁区词判**否定语义**:写「无背景音乐」「不要配乐」不算违规(那是在遵守约束),不必为此改稿。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/review/storyboards`)));
|
|
542
545
|
server.tool('review_frames', '【第③道硬闸·免费】审查镜头图片层:角色身份锚覆盖(缺定妆图的角色在镜头里必漂)、出图失败率、' +
|
|
543
546
|
'孤儿角色变体、场景图被人物污染。★generate_videos 之前必须先跑本工具——出视频是全链最贵的一步,' +
|
|
544
547
|
'拿着漂移的首帧整集出视频是最典型的废片形态。按 findings.action 修完(多为 generate_character_portraits / ' +
|
|
@@ -931,6 +934,10 @@ export function registerProduceTools(server, client) {
|
|
|
931
934
|
server.tool('edit_video_shot', '确认后就地编辑某镜视频:按 instruction 改,可带参考图/视频/音频,或用 start_sec/end_sec 做区间替换。' +
|
|
932
935
|
'可用 model 为本次编辑单独选引擎(与剧引擎可不同):hailuo-3=MiniMax H3 强保真编辑约1/3成本;wan3.0/wan3.0-prime=WAN 3.0 强语义编辑约4折(环境可能跟随指令扩写);' +
|
|
933
936
|
'H3/WAN 均不支持 start_sec/end_sec 区间(传了会 400),编辑/续写的输入视频在 H3/WAN 上另按秒计费。' +
|
|
937
|
+
'\n★回执里出现 `edit_instruction_negation_advisory` = 你的指令里有**否定式约束**(「不能采用X」「不要出现X」)。' +
|
|
938
|
+
'视频模型把名词当正向线索,写「不要 X」往往反而把 X 演出来——被否定的那个动作/物件恰恰是模型先验里最显眼的。' +
|
|
939
|
+
'这不是拦截,任务已照常提交;但**下一轮改指令时务必删掉否定句,改成正向描述**(把该做什么写具体:起手动作、手的位置、每一拍的时值),' +
|
|
940
|
+
'否则同一个毛病会一直复现。已实测:客户写「不能采用参考图举手单脚的静态舞姿」,成片开头的抬臂手势就被参考图那个举手带跑了。' +
|
|
934
941
|
'\n★收到 **409「本镜是用户上传的实拍素材」** = 这一镜被 upload_shot_footage 登记成了实拍素材镜,不是模型或引擎的问题,换引擎重试无用。' +
|
|
935
942
|
'两条出路:要以该素材为源做 AI 重绘 → 带 replace_user_footage=true 重发;要恢复成普通 AI 镜 → 先 clear_shot_footage。' +
|
|
936
943
|
CONFIRM_HINT, {
|
|
@@ -1225,7 +1232,14 @@ export function registerProduceTools(server, client) {
|
|
|
1225
1232
|
'★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。' +
|
|
1226
1233
|
'★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。' +
|
|
1227
1234
|
'★与 generate_scene_images 的区别:那个是整剧批量、只补**缺图**的场景,已有图的一律跳过;' +
|
|
1228
|
-
'这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。'
|
|
1235
|
+
'这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。' +
|
|
1236
|
+
'★episode_id 通常不必传(平台按场景归属、再按引用它的分镜自动推导)。' +
|
|
1237
|
+
'只有回执报「本场景被多集分镜共用」时才需要点名:那说明同一地点跨集复用,' +
|
|
1238
|
+
'平台不猜该按哪一集的时代/世界观出图——猜错就是画面年代静默错掉。', {
|
|
1239
|
+
scene_id: z.number().int().positive(),
|
|
1240
|
+
episode_id: z.number().int().positive().optional()
|
|
1241
|
+
.describe('按哪一集的时代/世界观 brief 出图。通常不必传;跨集共用的场景被要求时才传'),
|
|
1242
|
+
}, async ({ scene_id, episode_id }) => jsonResult(await client.producePost(`/scenes/${scene_id}/image/regenerate`, episode_id ? { episode_id } : {})));
|
|
1229
1243
|
server.tool('delete_scene', '删除一个场景。免费。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.produceDelete(`/scenes/${scene_id}`)));
|
|
1230
1244
|
server.tool('generate_character_sheet', '给**单个**角色出三视图设定图(镜头一致性根锚,所有镜头帧都会引用;比定妆图更完整)。整集批量用 generate_character_sheets。' +
|
|
1231
1245
|
'前置:该角色已有定妆图。图片步,按用量后付不欠费。', { character_id: z.number().int().positive(), episode_id: z.number().int().positive().optional() }, async ({ character_id, episode_id }) => jsonResult(await client.producePost(`/characters/${character_id}/sheet`, episode_id ? { episode_id } : {})));
|
package/openapi.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"openapi": "3.1.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "StarReel Production API",
|
|
5
|
-
"version": "0.1.
|
|
6
|
-
"description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → portraits & sheets → storyboards → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`; for video, quote == actual charge). Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.
|
|
5
|
+
"version": "0.1.72",
|
|
6
|
+
"description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → portraits & sheets → storyboards → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`; for video, quote == actual charge). Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.72 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -5282,7 +5282,7 @@
|
|
|
5282
5282
|
"post": {
|
|
5283
5283
|
"operationId": "review_storyboards",
|
|
5284
5284
|
"summary": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记",
|
|
5285
|
-
"description": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记。★generate_frames 之前必须先跑本工具——分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot
|
|
5285
|
+
"description": "【第②道硬闸·免费】审查分镜:禁区词(会被厂商审核拒、白扣费)、镜头时长分布、相邻构图重复、同场景角色站位漂移、情绪曲线峰谷、关键镜标记。★generate_frames 之前必须先跑本工具——分镜里的问题一旦整集出图就变成整集废图,单镜修不回来。按 findings.action 用 update_shot/split_shot 修完再复审。★code=forbidden_term 的 finding 带 `terms` 字段(命中的具体词,如「背景音乐」「强光」)与 `shots`(镜号),照着这两个去 update_shot 改掉即可,不用逐字猜。★禁区词判**否定语义**:写「无背景音乐」「不要配乐」不算违规(那是在遵守约束),不必为此改稿。",
|
|
5286
5286
|
"tags": [
|
|
5287
5287
|
"episodes"
|
|
5288
5288
|
],
|
|
@@ -7693,7 +7693,7 @@
|
|
|
7693
7693
|
"post": {
|
|
7694
7694
|
"operationId": "regenerate_scene_image",
|
|
7695
7695
|
"summary": "按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)",
|
|
7696
|
-
"description": "按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)。图片步,按用量后付不欠费。★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。★与 generate_scene_images
|
|
7696
|
+
"description": "按当前提示词重出**这一场**的场景图(改完 image_prompt 让画面跟上)。图片步,按用量后付不欠费。★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。★与 generate_scene_images 的区别:那个是整剧批量、只补**缺图**的场景,已有图的一律跳过;这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。★episode_id 通常不必传(平台按场景归属、再按引用它的分镜自动推导)。只有回执报「本场景被多集分镜共用」时才需要点名:那说明同一地点跨集复用,平台不猜该按哪一集的时代/世界观出图——猜错就是画面年代静默错掉。",
|
|
7697
7697
|
"tags": [
|
|
7698
7698
|
"scenes"
|
|
7699
7699
|
],
|
|
@@ -7708,6 +7708,22 @@
|
|
|
7708
7708
|
}
|
|
7709
7709
|
}
|
|
7710
7710
|
],
|
|
7711
|
+
"requestBody": {
|
|
7712
|
+
"required": false,
|
|
7713
|
+
"content": {
|
|
7714
|
+
"application/json": {
|
|
7715
|
+
"schema": {
|
|
7716
|
+
"type": "object",
|
|
7717
|
+
"properties": {
|
|
7718
|
+
"episode_id": {
|
|
7719
|
+
"type": "integer",
|
|
7720
|
+
"exclusiveMinimum": 0
|
|
7721
|
+
}
|
|
7722
|
+
}
|
|
7723
|
+
}
|
|
7724
|
+
}
|
|
7725
|
+
}
|
|
7726
|
+
},
|
|
7711
7727
|
"responses": {
|
|
7712
7728
|
"200": {
|
|
7713
7729
|
"description": "StarReel envelope",
|
|
@@ -8244,7 +8260,7 @@
|
|
|
8244
8260
|
"post": {
|
|
8245
8261
|
"operationId": "edit_video_shot",
|
|
8246
8262
|
"summary": "确认后就地编辑某镜视频:按 instruction 改,可带参考图/视频/音频,或用 start_sec/end_sec 做区间替换",
|
|
8247
|
-
"description": "确认后就地编辑某镜视频:按 instruction 改,可带参考图/视频/音频,或用 start_sec/end_sec 做区间替换。可用 model 为本次编辑单独选引擎(与剧引擎可不同):hailuo-3=MiniMax H3 强保真编辑约1/3成本;wan3.0/wan3.0-prime=WAN 3.0 强语义编辑约4折(环境可能跟随指令扩写);H3/WAN 均不支持 start_sec/end_sec 区间(传了会 400),编辑/续写的输入视频在 H3/WAN 上另按秒计费。\n★收到 **409「本镜是用户上传的实拍素材」** = 这一镜被 upload_shot_footage 登记成了实拍素材镜,不是模型或引擎的问题,换引擎重试无用。两条出路:要以该素材为源做 AI 重绘 → 带 replace_user_footage=true 重发;要恢复成普通 AI 镜 → 先 clear_shot_footage。⚠️ 批量报价确认流程:先调对应的 quote_* 工具,把返回的 estimated_points 原样告诉用户,用户明确同意后,才用返回的 quote_id 调本工具。不要擅自确认。",
|
|
8263
|
+
"description": "确认后就地编辑某镜视频:按 instruction 改,可带参考图/视频/音频,或用 start_sec/end_sec 做区间替换。可用 model 为本次编辑单独选引擎(与剧引擎可不同):hailuo-3=MiniMax H3 强保真编辑约1/3成本;wan3.0/wan3.0-prime=WAN 3.0 强语义编辑约4折(环境可能跟随指令扩写);H3/WAN 均不支持 start_sec/end_sec 区间(传了会 400),编辑/续写的输入视频在 H3/WAN 上另按秒计费。\n★回执里出现 `edit_instruction_negation_advisory` = 你的指令里有**否定式约束**(「不能采用X」「不要出现X」)。视频模型把名词当正向线索,写「不要 X」往往反而把 X 演出来——被否定的那个动作/物件恰恰是模型先验里最显眼的。这不是拦截,任务已照常提交;但**下一轮改指令时务必删掉否定句,改成正向描述**(把该做什么写具体:起手动作、手的位置、每一拍的时值),否则同一个毛病会一直复现。已实测:客户写「不能采用参考图举手单脚的静态舞姿」,成片开头的抬臂手势就被参考图那个举手带跑了。\n★收到 **409「本镜是用户上传的实拍素材」** = 这一镜被 upload_shot_footage 登记成了实拍素材镜,不是模型或引擎的问题,换引擎重试无用。两条出路:要以该素材为源做 AI 重绘 → 带 replace_user_footage=true 重发;要恢复成普通 AI 镜 → 先 clear_shot_footage。⚠️ 批量报价确认流程:先调对应的 quote_* 工具,把返回的 estimated_points 原样告诉用户,用户明确同意后,才用返回的 quote_id 调本工具。不要擅自确认。",
|
|
8248
8264
|
"tags": [
|
|
8249
8265
|
"storyboards"
|
|
8250
8266
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.72",
|
|
4
4
|
"mcpName": "ai.starreel/starreel",
|
|
5
5
|
"description": "StarReel MCP server — drive the AI short-drama production pipeline (script → storyboards → frames → video → final cut) from Claude, Cursor, or any MCP client",
|
|
6
6
|
"license": "MIT",
|
package/server.json
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
3
3
|
"name": "ai.starreel/starreel",
|
|
4
4
|
"description": "Turn a script into a finished, downloadable short-drama episode — via MCP or REST.",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.72",
|
|
6
6
|
"websiteUrl": "https://starreel.ai",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "@starreel/mcp",
|
|
11
|
-
"version": "0.1.
|
|
11
|
+
"version": "0.1.72",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|