@starreel/mcp 0.1.17 → 0.1.19

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.
@@ -23,7 +23,11 @@ const CONFIRM_HINT = '⚠️ 批量报价确认流程:先调对应的 quote_*
23
23
  // → compose_episode → get_final_cut / get_export
24
24
  // 项目设定随时可 update_project_settings;剧目级资产(色彩脚本/动作模板/世界观图/美术圣经)可选增强。
25
25
  const WORKFLOW_HINT = '照完整工作流按序推进,别跳步:set_script(原始)→ rewrite_script(AI改写)→ extract_assets →' +
26
- ' generate_portraits_and_sheets(定妆图+设定图·镜头一致性根锚,别只出定妆图)→ storyboards → frames → videos → compose。用 get_pipeline_status 查进度。';
26
+ ' generate_portraits_and_sheets(定妆图+设定图·镜头一致性根锚)→ assign_voices(分配音色,否则 generate_tts 无声)→' +
27
+ ' storyboards → frames → videos → generate_tts → compose。' +
28
+ '★广告(ad)另需 add_product 建产品库 + generate_product_sheet(广告主体,不建镜头产品会漂);' +
29
+ 'MV 走 set_mv_lyrics→generate_mv_story→generate_mv_script。' +
30
+ '用 get_pipeline_status 查进度——它按项目类型返回专属步骤(广告有 build_product_library,MV 有歌词/故事)。';
27
31
  const ETHNICITY_CODES = [
28
32
  'east_asian', 'southeast_asian', 'south_asian', 'central_asian',
29
33
  'caucasian', 'middle_eastern', 'african', 'latin_american',
@@ -36,6 +40,39 @@ const ETHNICITY_CODES = [
36
40
  const FRAME_TYPE_ARG = z.enum(['first_frame', 'last_frame', 'both']);
37
41
  const ASPECT_RATIOS = ['9:16', '16:9', '1:1', '4:5', '4:3', '21:9'];
38
42
  const VIDEO_RESOLUTIONS = ['480p', '720p', '1080p', '4k'];
43
+ // 「项目设定页」通用视觉/音频/字幕/转场设定 —— create_drama 与 update_project_settings 共用。
44
+ // 后端内部 PUT /dramas 已接受写库,facade 白名单 Wave3 已放行(produce-create-fields.ts)。
45
+ // 不含内部产线/成本开关(strict_mode/best_of_n/shoppable/budget_points 等,需产品决策)。
46
+ const PROJECT_SETTINGS_FIELDS = {
47
+ // 整剧视觉一致性锚(注入所有出图/视频 prompt,决定跨镜一致)
48
+ cinematography_prompt: z.string().optional().describe('摄影DNA:镜头/镜片/光圈/调色一揽子,注入所有出图/视频prompt,整剧镜头一致'),
49
+ art_bible: z.string().optional().describe('美术圣经:色调/材质/气质,注入所有生图prompt,统一视觉风格'),
50
+ visual_lock: z.string().optional().describe('视觉锁定:民族外貌/服装约束/禁止元素,最高优先级、无条件注入所有生图prompt'),
51
+ video_style_prompt: z.string().optional().describe('视频风格锁定·正向风格词(前置注入,描述渲染质感/美术)'),
52
+ video_negative_prompt: z.string().optional().describe('视频风格锁定·负向排除词(末尾追加,防风格跳变)'),
53
+ motifs: z.string().optional().describe('视觉母题:反复出现的物件/颜色,逗号分隔(每个应≥3镜复现)'),
54
+ theme: z.string().optional().describe('主题(一句话核心冲突·防跑题);★≠theme_statement,这是UI「主题」框对应的列'),
55
+ // 音频(BGM 源/开关/音量 + 用视频原声)
56
+ bgm_enabled: z.boolean().optional().describe('BGM总开关:false=终拼不混任何BGM,保留视频原声'),
57
+ bgm_source: z.enum(['own', 'clip']).optional().describe("BGM来源:own=自有BGM流水线(默认,抑制裸片BGM);clip=保留视频原生BGM、终拼不叠加"),
58
+ bgm_volume_preset: z.enum(['off', 'low', 'auto', 'high']).optional().describe('BGM音量档:off静音/low轻(-28dB)/auto自适应(默认,静段可闻·对白不压麦)/high强'),
59
+ bgm_volume_db: z.number().optional().describe('自定义BGM音量(dB,负值),覆盖预设档、关自适应'),
60
+ use_clip_audio: z.boolean().optional().describe('用视频原声:true=跳过TTS配音,直接用视频自带声音(★直接改成片音频)'),
61
+ // 字幕(烧录/双语/仅译文/位置/边距/动效)
62
+ show_subtitles: z.boolean().optional().describe('字幕烧录总开关:false=不烧字幕轨'),
63
+ subtitle_secondary_lang: z.string().optional().describe('双语字幕第二语言(如 en/ja);设了即双语(需先字幕同步翻译该语言)'),
64
+ subtitle_translation_only: z.boolean().optional().describe('仅显示译文(不显原文)'),
65
+ subtitle_position: z.enum(['bottom', 'top']).optional().describe('字幕位置(默认 bottom)'),
66
+ subtitle_margin_v: z.number().optional().describe('字幕边距 MarginV 像素(与画面边缘距离,默认 80)'),
67
+ subtitle_animation: z.string().optional().describe('字幕动效:fade(默认)/bounce弹跳/typewriter打字机/highlight高亮'),
68
+ // 转场 + 多画幅裁切 + 片头尾卡
69
+ default_transition: z.string().optional().describe('镜头间转场预设(默认 fade;21种+智能)'),
70
+ default_transition_ms: z.number().optional().describe('转场时长 ms(默认 250;短剧 200-400 体感佳)'),
71
+ reframe_mode: z.string().optional().describe('一源多画幅裁切策略'),
72
+ reframe_anchor: z.string().optional().describe('多画幅裁切锚点'),
73
+ cover_card_default: z.string().optional().describe('片头封面卡默认'),
74
+ poster_card_default: z.string().optional().describe('片尾海报卡默认'),
75
+ };
39
76
  /** 把友好 ethnicity 枚举 + note 组装成后端认的结构化族裔锁 { code, note? }。 */
40
77
  function buildEthnicityLock(ethnicity, note) {
41
78
  if (!ethnicity)
@@ -70,6 +107,7 @@ export function registerProduceTools(server, client) {
70
107
  .describe('项目类型(默认 drama)。ad=广告(改写走 ad_script_rewriter);mv=音乐(走歌词→故事→剧本子流程);brand_film=品牌微电影(默认16:9)'),
71
108
  rewrite_mode: z.enum(['standard', 'director']).optional().describe('AI改写深度:standard 或 director(导演级)'),
72
109
  director_style: z.string().optional().describe('导演风格包 key'),
110
+ ...PROJECT_SETTINGS_FIELDS,
73
111
  }, async (args) => {
74
112
  const { ethnicity, ethnicity_note, ...rest } = args;
75
113
  const body = { ...rest };
@@ -160,8 +198,11 @@ export function registerProduceTools(server, client) {
160
198
  server.tool('get_final_cut', '查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/final-cut`)));
161
199
  server.tool('get_export', '查某一集导出/母版状态(成片终拼后的可下载母版)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/export`)));
162
200
  // ========== 项目设定(建后可改)==========
163
- server.tool('update_project_settings', '建剧后修改项目设定(画幅/分辨率/世界观Brief/族裔/题材/改写深度/导演风格/字幕/长镜,及各类型专属字段)。免费。' +
164
- '⚠️ 世界观 Brief/族裔/画幅等改后,已生成的内容不会自动更新,需重生对应内容。', {
201
+ server.tool('update_project_settings', '建剧后修改项目设定。除画幅/分辨率/世界观Brief/族裔/题材/导演风格外,现覆盖★整剧视觉一致性锚' +
202
+ '(摄影DNA cinematography_prompt/美术圣经 art_bible/视觉锁定 visual_lock/视频风格正负向词/视觉母题 motifs)、' +
203
+ '音频(bgm_source 自有vs原生/bgm_volume_preset 音量/use_clip_audio 用视频原声)、' +
204
+ '字幕(show_subtitles/双语 subtitle_secondary_lang/位置/边距/动效)、转场——即项目设定页全部通用设定。免费。' +
205
+ '⚠️ 世界观 Brief/族裔/画幅/一致性锚等改后,已生成的内容不会自动更新,需重生对应内容。', {
165
206
  drama_id: z.number().int().positive(),
166
207
  genre: z.string().optional(),
167
208
  style: z.string().optional(),
@@ -188,6 +229,7 @@ export function registerProduceTools(server, client) {
188
229
  // MV 专属
189
230
  mv_lyrics: z.string().optional(),
190
231
  mv_audio_url: z.string().optional(),
232
+ ...PROJECT_SETTINGS_FIELDS,
191
233
  }, async (args) => {
192
234
  const { drama_id, ethnicity, ethnicity_note, ...rest } = args;
193
235
  const body = { ...rest };
@@ -300,7 +342,10 @@ export function registerProduceTools(server, client) {
300
342
  server.tool('get_cost_estimate', '查一部剧的整体成本预估(点数)。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/cost-estimate`)));
301
343
  server.tool('get_budget_status', '查一部剧的预算状态(预算/已花费/剩余)。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/budget-status`)));
302
344
  // ========== P1 · 整集配音(成片前的强制音频步)==========
303
- server.tool('generate_tts', '给整集所有对白批量配音(TTS)。成片前的音频步——不配音成片会缺对白。后台异步,按用量后付不欠费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/tts`)));
345
+ server.tool('assign_voices', '★给本集所有角色分配音色(配音导演 agent 按性别/性格/年龄/角色定位+项目语言选)。' +
346
+ 'voiceStyle 不是提取时自动填的——不分配,generate_tts 就没音色。文本步(LLM)后付。' +
347
+ '后台异步,轮询 get_pipeline_status:assign_voices=done 即完成,再 generate_tts。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/assign-voices`)));
348
+ server.tool('generate_tts', '给整集所有对白批量配音(TTS)。成片前的音频步——不配音成片会缺对白。前置:先 assign_voices 给角色分配音色。后台异步,按用量后付不欠费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/tts`)));
304
349
  // ========== P1 · MV 子流程(project_type=mv 专用)==========
305
350
  server.tool('set_mv_lyrics', 'MV 项目:设置歌词(整曲音频另在建剧时传)。免费。之后 generate_mv_story → generate_mv_script。', { drama_id: z.number().int().positive(), lyrics: z.string().min(1).describe('歌词全文') }, async ({ drama_id, lyrics }) => jsonResult(await client.producePost(`/dramas/${drama_id}/mv/lyrics`, { lyrics })));
306
351
  server.tool('generate_mv_story', 'MV 项目:据歌词 AI 编一个 MV 故事线。后台/同步,按用量后付。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.producePost(`/dramas/${drama_id}/mv/story`)));
@@ -354,13 +399,15 @@ export function registerProduceTools(server, client) {
354
399
  // ========== P2 · 品牌片交付物 / 广告商品库 ==========
355
400
  server.tool('get_deliverables', '品牌片:读交付物树(海报/母版/分轨/各平台版等)。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/deliverables`)));
356
401
  server.tool('generate_deliverables', '品牌片:一键生成全部交付物。后台异步,按用量后付。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.producePost(`/dramas/${drama_id}/deliverables`)));
357
- server.tool('add_product', '广告项目:往商品库加一个商品(名称/卖点/图),供带货广告露出。免费。', {
402
+ server.tool('add_product', '★广告项目必做:往商品库加一个商品(名称/卖点/图),是广告的**主体**——出视频时按分镜文本匹配产品图当锚,' +
403
+ '不建产品库镜头里的产品会漂移/瞎编。建完用 generate_product_sheet 出设定图(锚更稳)。免费(仅建条目)。', {
358
404
  drama_id: z.number().int().positive(),
359
405
  name: z.string().min(1),
360
406
  description: z.string().optional().describe('卖点/描述'),
361
407
  image_url: z.string().optional().describe('商品图 URL(先 upload_image 拿)'),
362
408
  }, async ({ drama_id, ...fields }) => jsonResult(await client.producePost(`/dramas/${drama_id}/products`, fields)));
363
409
  server.tool('list_products', '广告项目:列出商品库。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/products`)));
410
+ server.tool('generate_product_sheet', '★广告项目:给商品库里某商品 AI 出设定图(广告露出锚)。商品无设定图 → 出视频时按分镜 grep 产品名取图当锚会落空、产品漂移。图片步,按用量后付不欠费。', { product_id: z.number().int().positive() }, async ({ product_id }) => jsonResult(await client.producePost(`/products/${product_id}/sheet`)));
364
411
  // ========== AI 声音克隆(voice cloning)==========
365
412
  // 音色是**独立资产**:克隆 → 试听下载,全程不需要角色。绑角色只是「要出片」时的
366
413
  // 可选下游动作。voice_id 形如 `lib:12`,克隆/列表/试听/绑定四处同一命名空间。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
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",