@starreel/mcp 0.1.29 → 0.1.31
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 +10 -0
- package/dist/tools/produce.js +26 -3
- package/package.json +1 -1
- package/server.json +2 -2
package/SKILL.md
CHANGED
|
@@ -122,6 +122,16 @@ content that will be rejected.
|
|
|
122
122
|
reveal), via `generate_frames` with `frame_type=last_frame` or, for a single
|
|
123
123
|
shot, `generate_shot_frame`. `generate_videos` needs at
|
|
124
124
|
least one first frame in the episode.
|
|
125
|
+
**Image model**: images use a drama-level model (default **Nano Banana 2** =
|
|
126
|
+
`gemini-3.1-flash-image`), set via `create_drama` / `update_project_settings`
|
|
127
|
+
field `image_model` for one consistent look across the whole drama;
|
|
128
|
+
`generate_frames` / `generate_shot_frame` may override per call. Options:
|
|
129
|
+
`gemini-3-pro-image` (Nano Banana Pro, finer, pricier), `gemini-3.1-flash-lite-image`
|
|
130
|
+
(Lite, cheap), `doubao-seedream-5-0-260128` (Seedream 5.0), `gpt-image-2`.
|
|
131
|
+
**Images are slow** (tens of seconds to minutes each; a whole episode can take
|
|
132
|
+
10+ min): poll `get_storyboards` and read `frame_status` — `pending` = still
|
|
133
|
+
generating (keep waiting, NEVER re-call generate_frames — that double-charges),
|
|
134
|
+
`ready` = done, `failed` = the only real failure. Never treat a slow image as failed.
|
|
125
135
|
|
|
126
136
|
**Redraw on-platform, never off-platform.** When a shot's image is wrong,
|
|
127
137
|
fix it with `quote_shot_frame` → `generate_shot_frame` (`frame_type`:
|
package/dist/tools/produce.js
CHANGED
|
@@ -38,6 +38,12 @@ const WORKFLOW_HINT = '★三档执行策略(别把三档混着问客户):' +
|
|
|
38
38
|
'别在出场景图前做场景 Bible。' +
|
|
39
39
|
'★音频默认用视频原声(use_clip_audio 默认开、跳过 TTS 直接用 AI 视频自带声):' +
|
|
40
40
|
'建剧/改设定时 AI 应主动告知客户「默认用视频原声,如需 TTS 配音把 use_clip_audio 设 false」,让客户选。' +
|
|
41
|
+
'★图片模型默认香蕉2(Nano Banana 2 = gemini-3.1-flash-image·整剧统一画风):create_drama/update_project_settings 的 image_model 设,不传即默认香蕉2;' +
|
|
42
|
+
'可选 gemini-3-pro-image(香蕉Pro·更精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·便宜·31点)/doubao-seedream-5-0-260128(Seedream5.0)/gpt-image-2(ChatGPT Image2);generate_frames 可临时覆盖某次。' +
|
|
43
|
+
'★图片生成慢≠失败:每张几十秒~数分钟、整集可能十几分钟,轮询 get_storyboards 看 frame_status——pending=还在生成(耐心等、别重复调 generate_frames 白花钱)、ready=完成、failed=才是真失败。' +
|
|
44
|
+
'★改某一镜画面 / 换定妆图后要让新图生效,走**单镜重生 generate_shot_frame**(平台自动带该镜身份锚·场景道具参考·画风锚,保全片一致);' +
|
|
45
|
+
'generate_frames 只批量补「缺帧」的镜、已有首帧的镜跳过(正常、不是"拒绝"),尾帧用 frame_type=last_frame 可批量补。换定妆图(set_character_portrait)后响应里的 stale_frames 就是被旧图污染、需逐镜重生的镜。' +
|
|
46
|
+
'★绝不用外部工具自制首尾帧再 upload_shot_frame 来"改画面"——外部图无身份锚/画风锚,人物·服装·画风必漂,那才是废片根源;upload_shot_frame 只用于客户自有真实素材。' +
|
|
41
47
|
'③【可选增强·AI 主动提示客户·报价确认才做】美术圣经生成/视觉锁抽取/色彩脚本/动作模板/场景图/场景组/口型/海报/音效/配乐/字幕翻译——' +
|
|
42
48
|
'这些提升一致性/质量、大多收费。★AI 应主动告知客户这些可做并给报价,客户确认才跑;既不默默跳过、也不擅自扣费。' +
|
|
43
49
|
'★两条锁定纪律:①**画幅比例**在 create_drama 即定、drama 级锁定,之后所有出图/出视频/成片都用它、**别中途改**' +
|
|
@@ -60,6 +66,10 @@ const VIDEO_RESOLUTIONS = ['480p', '720p', '1080p', '4k'];
|
|
|
60
66
|
// 后端内部 PUT /dramas 已接受写库,facade 白名单 Wave3 已放行(produce-create-fields.ts)。
|
|
61
67
|
// 不含内部产线/成本开关(strict_mode/best_of_n/shoppable/budget_points 等,需产品决策)。
|
|
62
68
|
const PROJECT_SETTINGS_FIELDS = {
|
|
69
|
+
// drama 级图片模型(整剧统一画风):默认 Nano Banana 2(香蕉2)
|
|
70
|
+
image_model: z.string().optional().describe('图片模型(★drama级·整剧统一画风·默认香蕉2 Nano Banana 2)。可选:' +
|
|
71
|
+
'gemini-3.1-flash-image(香蕉2·默认·71点)/gemini-3-pro-image(香蕉Pro·精细·175点)/gemini-3.1-flash-lite-image(香蕉2 Lite·31点)/' +
|
|
72
|
+
'doubao-seedream-5-0-260128(Seedream 5.0)/gpt-image-2(ChatGPT Image 2)。建剧即定、整剧统一;generate_frames 可临时覆盖某次出图'),
|
|
63
73
|
// 整剧视觉一致性锚(注入所有出图/视频 prompt,决定跨镜一致)
|
|
64
74
|
cinematography_prompt: z.string().optional().describe('摄影DNA:镜头/镜片/光圈/调色一揽子,注入所有出图/视频prompt,整剧镜头一致'),
|
|
65
75
|
art_bible: z.string().optional().describe('美术圣经:色调/材质/气质,注入所有生图prompt,统一视觉风格'),
|
|
@@ -204,12 +214,21 @@ export function registerProduceTools(server, client) {
|
|
|
204
214
|
frame_type: FRAME_TYPE_ARG.optional().describe('默认 first_frame;last_frame=补尾帧;both=首尾都补'),
|
|
205
215
|
}, async ({ episode_id, frame_type }) => jsonResult(await client.producePost(`/episodes/${episode_id}/frames/quote`, { frame_type })));
|
|
206
216
|
server.tool('generate_frames', '确认后批量出帧:后台异步。用 get_storyboards 轮询,first_frame_image/last_frame_image 逐镜填充即完成。' +
|
|
217
|
+
'★图片生成较慢——每张几十秒到数分钟(尤其高清模型),整集可能十几分钟。轮询看 frame_status:' +
|
|
218
|
+
'**pending=还在生成(继续耐心等,别当失败、别重复调 generate_frames,重复触发=白花钱)**、' +
|
|
219
|
+
'ready=完成、failed=才是真失败。别因为「等了一会儿还没出」就判定生成失败或重试。' +
|
|
207
220
|
'出视频前必须先出帧,否则视频会退化成无一致性锚点的画面。' +
|
|
208
|
-
'frame_type 要与 quote_frames 用的一致(默认 first_frame)
|
|
221
|
+
'frame_type 要与 quote_frames 用的一致(默认 first_frame)。' +
|
|
222
|
+
'★这是**批量补缺帧**:只给「缺该帧」的镜出图,已有首帧的镜会跳过——这是正常设计、不是"系统拒绝重出"。' +
|
|
223
|
+
'要**重出/重画某一镜已有的帧**(如换了定妆图要让新图生效),用 generate_shot_frame(单镜重生,平台带身份锚),不是这个工具、更不是自制图 upload_shot_frame。' +
|
|
224
|
+
'★尾帧能批量出:frame_type=last_frame 会给「已有首帧且缺尾帧」的镜批量补尾帧(尾帧只在想固定某镜结尾画面/大运镜时才需,常规只出首帧)。' + CONFIRM_HINT, {
|
|
209
225
|
episode_id: z.number().int().positive(),
|
|
210
226
|
quote_id: z.string().describe('来自 quote_frames'),
|
|
211
227
|
frame_type: FRAME_TYPE_ARG.optional().describe('默认 first_frame,须与报价时一致'),
|
|
212
|
-
|
|
228
|
+
image_model: z.string().optional().describe('临时覆盖本次出图模型(不传=用 drama 级设定,默认香蕉2)。可选:' +
|
|
229
|
+
'gemini-3.1-flash-image(Nano Banana 2·默认·71点)/gemini-3-pro-image(Nano Banana Pro·更精细·175点)/' +
|
|
230
|
+
'gemini-3.1-flash-lite-image(Nano Banana 2 Lite·便宜·31点)/doubao-seedream-5-0-260128(Seedream 5.0)/gpt-image-2(ChatGPT Image 2)'),
|
|
231
|
+
}, async ({ episode_id, quote_id, frame_type, image_model }) => jsonResult(await client.producePost(`/episodes/${episode_id}/frames/generate`, { quote_id, frame_type, image_model })));
|
|
213
232
|
// ---------- 单镜出帧/重生(改某一镜的画面走这里,别去外部平台出图再传回来) ----------
|
|
214
233
|
server.tool('quote_shot_frame', '报价:重画/补出**某一镜的某一帧**要多少点(一帧=一张图)。返回 estimated_points、quote_id。零扣费。' +
|
|
215
234
|
'客户说「第 N 镜画错了/要改」时用它,而不是拿别的图像平台出图再 upload_shot_frame。', {
|
|
@@ -230,7 +249,8 @@ export function registerProduceTools(server, client) {
|
|
|
230
249
|
frame_type: FRAME_TYPE_ARG.optional().describe('默认 first_frame,须与报价时一致;传了 reopen_pair_id 时会被忽略'),
|
|
231
250
|
replace_user_frame: z.boolean().optional().describe('默认 true(显式重生允许覆盖已上传帧);传 false 则保护已上传帧'),
|
|
232
251
|
reopen_pair_id: z.string().optional().describe('来自 get_storyboards 该镜的同名字段;只重掷有问题的那一侧,不必再传 frame_type'),
|
|
233
|
-
|
|
252
|
+
image_model: z.string().optional().describe('临时覆盖本次重画的图片模型(不传=用 drama 级设定,默认香蕉2);取值同 generate_frames'),
|
|
253
|
+
}, async ({ storyboard_id, quote_id, frame_type, replace_user_frame, reopen_pair_id, image_model }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/frame/generate`, { quote_id, frame_type, replace_user_frame, reopen_pair_id, image_model })));
|
|
234
254
|
// ---------- 出视频(videos,大额) ----------
|
|
235
255
|
server.tool('quote_videos', '报价:给某一集所有分镜批量出视频要多少点(与实际扣费同函数,较准)。返回 estimated_points、quote_id。零扣费。' +
|
|
236
256
|
'⚠️ 视频是大额花费,务必把点数清楚告诉用户并等其确认。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/videos/quote`)));
|
|
@@ -314,6 +334,9 @@ export function registerProduceTools(server, client) {
|
|
|
314
334
|
});
|
|
315
335
|
server.tool('set_character_portrait', '用客户自有图片作为角色定妆图(身份锚,优先级高于 AI 生成;之后 AI 重生默认不覆盖)。' +
|
|
316
336
|
'换图会自动失效并重建派生资产(三视图设定图/发型·身材参考)、重建人脸锁。' +
|
|
337
|
+
'★换图后响应含 stale_frames=[{storyboard_id,storyboard_number,frames}]——这些镜的首帧还是旧定妆图生成的、已被污染。' +
|
|
338
|
+
'要让新定妆图生效:对每个 stale_frame 用 quote_shot_frame+generate_shot_frame 重生该镜(平台会自动以新定妆图/设定图/人脸锁作锚,保全片一致)。' +
|
|
339
|
+
'不必逐镜自己指定模型/首尾帧。★千万别自制首尾帧再 upload_shot_frame——外部图没有角色身份锚/画风锚,人物·服装·画风必漂,那才是废片根源(不是"杜绝废片")。' +
|
|
317
340
|
'传本地文件(file_path,自动上传 COS)或已托管的图片 URL(image_url),二选一。免费。', {
|
|
318
341
|
character_id: z.number().int().positive(),
|
|
319
342
|
file_path: z.string().optional().describe('本地定妆图路径(与 image_url 二选一;自动上传 COS)'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.31",
|
|
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.31",
|
|
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.31",
|
|
12
12
|
"transport": { "type": "stdio" },
|
|
13
13
|
"environmentVariables": [
|
|
14
14
|
{
|