@starreel/mcp 0.1.56 → 0.1.57

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 CHANGED
@@ -70,12 +70,12 @@ announces a condensed version as MCP `instructions` at connect time.
70
70
  | A finished screenplay (scene headers + dialogue lines) | `set_script` → `rewrite_script` (auto two-pass fidelity: dialogue byte-locked) → `review_script`; force with `rewrite_pipeline: "two_pass"`, `fidelity_enforce: 1` | pasting it into `edit_rewritten_script` (400) |
71
71
  | Wants to rewrite on another AI / says our rewrite "changed too much" | `get_script_format_spec` → external rewrite → `check_script_format` → `adopt_external_script` (exit A) or `set_script` + `rewrite_script` (exit B) | skipping the check; `edit_rewritten_script` |
72
72
  | A finished **shot list** (per-shot seconds / shot size / camera move) | `get_storyboard_table_spec` (the contract: shot-size / camera-move vocabulary, body layout, text-card syntax, a prompt for the external AI) → `check_storyboard_table` (same parser as the import; clear `errors`, read every `warning` — a missing duration, an unrecognised shot size or an empty body all get imported as-is) → `import_storyboard_table` (defaults to `auto_complete`: one background batch fills the professional fields and expands every shot's platform-built base description into full image / video prompts — metered text, tell the customer first; `auto_complete: false` imports only) → `get_autofill_status` until `done` → `review_storyboards` | `rewrite_script` + `generate_storyboards` — strips every production parameter (measured: 8 shots / 36 s became 20 shots / 109 s); importing without the check; reviewing before the completion batch finishes (the token expires when shots change) |
73
- | **Structured data** — their own tool / spreadsheet export, or an external AI producing JSON (cast + scenes + shots in one go) | `get_bulk_import_spec` (contract + template + worked example + enums, same source as the validator) → `check_bulk_import` (same zod schema; unresolved character / scene references, dead shots and stage directions inside dialogue are surfaced) → `bulk_import_storyboards` (`mode: "replace"` only with the customer's explicit OK; defaults to `auto_complete`: professional fields for every shot, full image / video prompts only for shots that had no `image_prompt` — metered text, tell the customer first) → `get_autofill_status` until `done` → `review_storyboards` | converting the JSON to text for `import_storyboard_table`; hand-building shots with `update_shot`; sending `image_prompt` / `video_prompt` (ignored — the platform builds them); reviewing before the completion batch finishes |
73
+ | **Structured data** — their own tool / spreadsheet export, or an external AI producing JSON (cast + scenes + shots in one go) | `get_bulk_import_spec` (contract + template + worked example + enums, same source as the validator) → `check_bulk_import` (same zod schema; unresolved character / scene references, dead shots and stage directions inside dialogue are surfaced) → `bulk_import_storyboards` (`mode: "replace"` only with the customer's explicit OK; defaults to `auto_complete`: professional fields for every shot, full image / video prompts only for shots that had no `image_prompt` — prompts you supply yourself are kept verbatim — metered text, tell the customer first) → `get_autofill_status` until `done` → `review_storyboards` | converting the JSON to text for `import_storyboard_table`; hand-building shots with `update_shot`; reviewing before the completion batch finishes |
74
74
  | Their own portraits / scene / prop / shot images | `upload_image` · `set_character_portrait` · `upload_scene_image` · `upload_prop_sheet` · `upload_shot_frame` | rendering a "fix" elsewhere and uploading it — use `generate_shot_frame` |
75
75
  | A voice sample / a required voice | `clone_voice` → `speak_with_voice` → `set_character_voice` / `assign_voices` | cloning without the rights-holder's consent |
76
76
  | A song + lyrics | `create_drama` (`project_type: "mv"`) → `set_mv_lyrics` → `generate_mv_story` → `generate_mv_script` | `rewrite_script` (blocked for MV) |
77
77
  | A product / brand | `create_drama` (`project_type: "ad"` or `"brand_film"`) → `add_product` → `generate_product_sheet` | writing brand copy as dialogue (it gets spoken) |
78
- | Generated shots / a cut that needs changes | `scan_dialogue_coverage` / `scan_intra_shot_cuts` first, then `update_shot` · `replace_shot_dialogue` · `repair_episode_dialogue` · `split_shot` · `trim_shot` · `regenerate_shot_video` · `edit_video_shot` → `rerender_episode` | re-composing to fix what a clip *says* |
78
+ | Generated shots / a cut that needs changes | `scan_dialogue_coverage` / `scan_intra_shot_cuts` first, then `get_shot_prompts` · `update_shot` · `replace_shot_dialogue` · `repair_episode_dialogue` · `split_shot` · `trim_shot` · `regenerate_shot_video` · `edit_video_shot` → `rerender_episode` | re-composing to fix what a clip *says* |
79
79
  | Wants to assemble the cut themselves | `export_handoff_pack` → `get_handoff_toolchain` | `compose_episode` (pick one) |
80
80
  | A multi-language release | `translate_subtitles` · `subtitle_secondary_lang` in project settings | — |
81
81
 
@@ -400,6 +400,16 @@ props in the wardrobe segment, missing `[SFX]`/`[BGM]`, group-shot head counts.
400
400
  Storyboard-level issues do **not** need a script edit at all: use
401
401
  `update_shot` / `replace_shot_dialogue`.
402
402
 
403
+ When the frame or the motion is off in a way the business text cannot express,
404
+ edit the shot's prompt bodies directly: `get_shot_prompts` reads the current
405
+ `image_prompt` / `video_prompt` for one shot, `update_shot` writes them back.
406
+ Keep the `@char:N` / `@scene:M` markers the response lists under `asset_tokens`
407
+ — they are what pulls each character's portrait and each scene's plate into the
408
+ render; drop one and that reference silently stops being sent. The prompt body
409
+ is only the part you write: the platform still layers identity anchors and
410
+ consistency constraints on top at generation time. Editing a prompt does not
411
+ re-generate anything — regenerate the shot afterwards.
412
+
403
413
  ## Failure playbook
404
414
 
405
415
  Failures surface as a human-readable `message` (MCP throws `Error(message)`;
@@ -66,10 +66,10 @@ export const ENTRY_POINTS = [
66
66
  use: [
67
67
  'get_bulk_import_spec(契约 + 模板 + 成品示例 + 枚举与上限,与校验器同源)',
68
68
  'check_bulk_import(同一份 zod 校验;引用不到的角色/场景、死镜、台词里的舞台指示都会报出来)',
69
- 'bulk_import_storyboards(mode=merge 更新/保留,replace 替换全部需客户明确同意;prompt 字段由平台生成)',
69
+ 'bulk_import_storyboards(mode=merge 更新/保留,replace 替换全部需客户明确同意;自带的 image_prompt/video_prompt 逐字照用,没填的镜平台拼基础描述)',
70
70
  ],
71
71
  avoid: '别把 JSON 转成文本再走 import_storyboard_table,也别一条条 update_shot 手建——结构化数据就走结构化通道。',
72
- note: '通过 MCP 导入时 image_prompt/video_prompt/frame_visual_contract 会被忽略,平台拼基础描述;导入默认带 auto_complete(后台 AI 填专业字段,并只给平台拼基础描述的镜扩写出图/视频提示词,文本步后付、调用前告知客户)——回执 started 后 `get_autofill_status` 轮询到 done 再 `review_storyboards`。',
72
+ note: '自带 image_prompt/video_prompt 会逐字保留(只有 frame_visual_contract 这个内部帧契约被忽略),没填的镜平台拼基础描述;导入默认带 auto_complete(后台 AI 填专业字段,并只给平台拼基础描述的镜扩写出图/视频提示词,文本步后付、调用前告知客户)——回执 started 后 `get_autofill_status` 轮询到 done 再 `review_storyboards`。',
73
73
  free: false,
74
74
  flow: 'get_bulk_import_spec → check_bulk_import(errors 清零) → bulk_import_storyboards(默认 auto_complete) → get_autofill_status 到 done → review_storyboards',
75
75
  },
@@ -124,7 +124,8 @@ export const ENTRY_POINTS = [
124
124
  use: [
125
125
  'scan_dialogue_coverage(先定病因:话没说完/念错/走到别的镜;免费)',
126
126
  'scan_intra_shot_cuts(「切太快」先看厂商有没有在单镜内自行硬切;免费)',
127
- 'update_shot(景别/动作/台词/运镜等文本字段;character_ids 全量覆盖)',
127
+ 'get_shot_prompts(读某镜的出图/视频提示词正文,免费;改提示词前先读现值)',
128
+ 'update_shot(景别/动作/台词/运镜等文本字段;image_prompt/video_prompt 提示词正文;character_ids 全量覆盖)',
128
129
  'replace_shot_dialogue',
129
130
  'repair_episode_dialogue(换音频不重生视频,按 TTS 费率,比重生便宜几个数量级)',
130
131
  'split_shot',
@@ -374,7 +374,7 @@ export function registerProduceTools(server, client) {
374
374
  '★与 import_storyboard_table(文本一镜一行)的分工:数据本来就是结构化的走 JSON;客户手上是文本分镜表走那条。' +
375
375
  '★契约要点:顶层 { mode, episode_meta?, characters?[], scenes?[], storyboards[] };characters 按 name 去重、scenes 按 location+time 去重、storyboards 按 storyboard_number 去重;' +
376
376
  'bound_characters 引用 characters[].name(或本剧已有角色名)、scene_ref 引用 scenes[] 的 location+time——引用不到会**静默跳过**;每镜 action/description 至少一个;dialogue 是 `说话人:台词`、别写舞台指示(会被念出来);' +
377
- 'image_prompt/video_prompt 可不填(平台拼基础描述),**通过 MCP 导入时这两个字段与 frame_visual_contract 会被忽略**(prompt 工程由平台生成)。', {}, async () => jsonResult(await client.produceGet('/bulk-import/spec')));
377
+ 'image_prompt/video_prompt 可不填(没填的镜由平台按景别+场景+光线+action 拼基础描述);填了就**逐字照用**,平台不覆盖。frame_visual_contract 是内部帧契约,导入时忽略。', {}, async () => jsonResult(await client.produceGet('/bulk-import/spec')));
378
378
  server.tool('check_bulk_import', '**导入前的 JSON 自检**:用导入端点**同一份 zod schema** 校验,再把导入路由的"静默行为"变成 warning。返回 errors / warnings / stats(镜数·总秒·角色·场景·mode·promptsToBuild)。免费·不落库·可反复跑。' +
379
379
  '★errors = 导入会 400 或会出错覆盖的:不是合法 JSON / schema 不过(逐条带 path,如 storyboards[2].shot_type)/ 镜号重复 + 残留 <...> 占位符;必须清零。' +
380
380
  '★warnings = 导入照常但会缺东西或有副作用的:bound_characters/scene_ref 引用不到(静默跳过)/ 没有 action+description(死镜)/ dialogue 含镜头语言(会被念出来)/ 单镜>15 秒 / 镜号跳号 / mode=replace(替换本集全部分镜)/ 全无角色绑定(人物会漂)。' +
@@ -382,7 +382,8 @@ export function registerProduceTools(server, client) {
382
382
  server.tool('bulk_import_storyboards', '把一份结构化 JSON 一次性建成本集的角色 / 场景 / 分镜(按 name / location+time / storyboard_number 去重更新)。免费·确定性·不调 AI。' +
383
383
  '★三步走:① get_bulk_import_spec 取契约与成品示例;② check_bulk_import 自检到 errors 清零;③ 再调本工具。' +
384
384
  '★mode=merge(默认)保留未提到的镜;mode=replace 替换本集**全部**分镜(旧镜与已生成图/视频归档可恢复、不会自动重挂)——replace 必须先得到客户明确同意。' +
385
- '★image_prompt / video_prompt / frame_visual_contract 在门面被剥掉:prompt 工程由平台生成(缺省按景别+场景+光线+action 拼基础描述,回执 base_prompts_built 是拼了几镜);想更专业用 enhance_shot_prompts。' +
385
+ '★image_prompt / video_prompt 想自己写就直接写在每镜里,**逐字照用不被覆盖**;没填的镜平台拼基础描述(回执 base_prompts_built 是拼了几镜),导入后可用 get_shot_prompts 读、update_shot 改。' +
386
+ '(frame_visual_contract 是内部帧契约,导入时忽略。)' +
386
387
  '★导入后:语速律会抬高装不下台词的镜(回执 speech_duration_raised / speech_duration_overflow)。' +
387
388
  '★导入后**默认自动补全**(auto_complete,跟随剧目「自动补齐辅助资产」开关、默认开):同一后台批次给全镜 AI 填空专业字段(只填空),' +
388
389
  '并只给**没填 image_prompt、由平台拼了基础描述**的镜扩写完整出图/视频提示词(客户自己写的绝不覆盖;回执 auto_complete.prompt_shots)。' +
@@ -762,7 +763,9 @@ export function registerProduceTools(server, client) {
762
763
  '改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果。' +
763
764
  '★★原声镜(厂商原生音频)改 dialogue 后,本镜视频会被标记「待重生」——因为台词是**烤进视频人声**的,' +
764
765
  '不重生就终拼,成片里念的仍是改动前的台词(典型现象:台词像是跑到了别的镜头上)。' +
765
- 'compose_episode 会以 advisory `stale_video_after_edit` 列出这些镜;正确处置是先 regenerate_shot_video 再终拼。', {
766
+ 'compose_episode 会以 advisory `stale_video_after_edit` 列出这些镜;正确处置是先 regenerate_shot_video 再终拼。' +
767
+ '★也可直接改本镜的两条提示词正文(image_prompt/video_prompt):改前先用 get_shot_prompts 读现值,' +
768
+ '别凭空覆盖——正文里的 @char:N / @scene:M 是角色/场景参考图的引用标记,删掉本镜就不注入对应定妆图/场景图(形象漂移)。', {
766
769
  storyboard_id: z.number().int().positive(),
767
770
  character_ids: z.array(z.number().int().positive()).optional()
768
771
  .describe('本镜出场角色 ID 列表(★全量覆盖式,非增量,漏传的角色会被解绑)。决定出图时注入哪些角色的定妆图/设定图——非人角色(动物/生物)也必须绑定,否则形象会漂移。id 必须来自当前集已关联角色'),
@@ -778,10 +781,18 @@ export function registerProduceTools(server, client) {
778
781
  atmosphere: z.string().optional().describe('氛围'),
779
782
  director_note: z.string().optional().describe('导演注释'),
780
783
  shot_intent: z.string().optional().describe('这镜为什么存在(叙事意图)'),
784
+ image_prompt: z.string().optional().describe('首帧画面提示词**正文**(全量覆盖本镜现值)。★先 get_shot_prompts 读现值再改;★原样保留其中的 @char:N / @scene:M 引用标记,删了就不注入对应定妆图/场景图。出图时平台会在正文之上再拼身份锚与一致性约束,不必你写'),
785
+ video_prompt: z.string().optional().describe('视频(动态/运镜/表演)提示词**正文**(全量覆盖本镜现值)。★同 image_prompt:先读现值、保留 @char/@scene 标记'),
781
786
  }, async ({ storyboard_id, ...fields }) => {
782
787
  const payload = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));
783
788
  return jsonResult(await client.producePut(`/storyboards/${storyboard_id}`, payload));
784
789
  });
790
+ server.tool('get_shot_prompts', '读某一镜的两条提示词**正文**(image_prompt=首帧画面 / video_prompt=动态表演),供直接微调后用 update_shot 写回。免费。' +
791
+ '★逐镜按需:改哪镜读哪镜(整集列表 get_storyboards 是纯进度视图,不含提示词)。' +
792
+ '★返回的 asset_tokens 是正文里的角色/场景参考图引用标记(@char:N / @scene:M)——改写时原样保留,' +
793
+ '删掉本镜就不注入对应定妆图/场景图,画面会漂。' +
794
+ '★这是分镜表里的正文层;出图/出视频时平台还会在其上拼身份锚、一致性约束与参考图指令(不在此处,也无需你写)。' +
795
+ '改完提示词不会自动重出图/视频,要让画面跟上得再 regen 对应镜。', { storyboard_id: z.number().int().positive() }, async ({ storyboard_id }) => jsonResult(await client.produceGet(`/storyboards/${storyboard_id}/prompts`)));
785
796
  server.tool('rerender_episode', '按当前 timeline 重拼成片(改完镜/裁剪后用)。**免费**(纯 ffmpeg+COS),后台异步。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/re-render`)));
786
797
  server.tool('replace_shot_dialogue', '换某镜对白音色/声线(转写+克隆重配)。后台异步,按用量后付不欠费。要求本镜有原声视频+角色声线定妆音。' +
787
798
  '★它也是「这一镜台词没念完/念了别的」最经济的修法:用克隆音重配整句并静音原声段,' +
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.56",
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.56 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.57",
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.57 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -152,7 +152,7 @@
152
152
  "get": {
153
153
  "operationId": "get_bulk_import_spec",
154
154
  "summary": "取**批量导入 JSON 的格式契约**:markdown 范本全文 + template(占位符模板,<",
155
- "description": "取**批量导入 JSON 的格式契约**:markdown 范本全文 + template(占位符模板,<...> 必须替换) + filled_example(成品对照,可直接照结构填) + external_prompt(转发给外部 AI/自己工具的任务提示词) + checklist + enums(mode/role/char_type/shot_type/action_motion_class 的合法值,与校验器同源) + limits(数组与字段上限)。免费·静态·不扣费。★什么时候用:客户能从自己的工具/表格导出结构化数据、或要让外部 AI 直接产出 JSON 一次建好角色+场景+分镜时——**在 bulk_import_storyboards 之前**先调它。★与 import_storyboard_table(文本一镜一行)的分工:数据本来就是结构化的走 JSON;客户手上是文本分镜表走那条。★契约要点:顶层 { mode, episode_meta?, characters?[], scenes?[], storyboards[] };characters 按 name 去重、scenes 按 location+time 去重、storyboards 按 storyboard_number 去重;bound_characters 引用 characters[].name(或本剧已有角色名)、scene_ref 引用 scenes[] 的 location+time——引用不到会**静默跳过**;每镜 action/description 至少一个;dialogue 是 `说话人:台词`、别写舞台指示(会被念出来);image_prompt/video_prompt 可不填(平台拼基础描述),**通过 MCP 导入时这两个字段与 frame_visual_contract 会被忽略**(prompt 工程由平台生成)。",
155
+ "description": "取**批量导入 JSON 的格式契约**:markdown 范本全文 + template(占位符模板,<...> 必须替换) + filled_example(成品对照,可直接照结构填) + external_prompt(转发给外部 AI/自己工具的任务提示词) + checklist + enums(mode/role/char_type/shot_type/action_motion_class 的合法值,与校验器同源) + limits(数组与字段上限)。免费·静态·不扣费。★什么时候用:客户能从自己的工具/表格导出结构化数据、或要让外部 AI 直接产出 JSON 一次建好角色+场景+分镜时——**在 bulk_import_storyboards 之前**先调它。★与 import_storyboard_table(文本一镜一行)的分工:数据本来就是结构化的走 JSON;客户手上是文本分镜表走那条。★契约要点:顶层 { mode, episode_meta?, characters?[], scenes?[], storyboards[] };characters 按 name 去重、scenes 按 location+time 去重、storyboards 按 storyboard_number 去重;bound_characters 引用 characters[].name(或本剧已有角色名)、scene_ref 引用 scenes[] 的 location+time——引用不到会**静默跳过**;每镜 action/description 至少一个;dialogue 是 `说话人:台词`、别写舞台指示(会被念出来);image_prompt/video_prompt 可不填(没填的镜由平台按景别+场景+光线+action 拼基础描述);填了就**逐字照用**,平台不覆盖。frame_visual_contract 是内部帧契约,导入时忽略。",
156
156
  "tags": [
157
157
  "bulk-import"
158
158
  ],
@@ -4775,7 +4775,7 @@
4775
4775
  "post": {
4776
4776
  "operationId": "bulk_import_storyboards",
4777
4777
  "summary": "把一份结构化 JSON 一次性建成本集的角色 / 场景 / 分镜(按 name / location+time / storyboard_number 去重更新)",
4778
- "description": "把一份结构化 JSON 一次性建成本集的角色 / 场景 / 分镜(按 name / location+time / storyboard_number 去重更新)。免费·确定性·不调 AI。★三步走:① get_bulk_import_spec 取契约与成品示例;② check_bulk_import 自检到 errors 清零;③ 再调本工具。★mode=merge(默认)保留未提到的镜;mode=replace 替换本集**全部**分镜(旧镜与已生成图/视频归档可恢复、不会自动重挂)——replace 必须先得到客户明确同意。★image_prompt / video_prompt / frame_visual_contract 在门面被剥掉:prompt 工程由平台生成(缺省按景别+场景+光线+action 拼基础描述,回执 base_prompts_built 是拼了几镜);想更专业用 enhance_shot_prompts。★导入后:语速律会抬高装不下台词的镜(回执 speech_duration_raised / speech_duration_overflow)。★导入后**默认自动补全**(auto_complete,跟随剧目「自动补齐辅助资产」开关、默认开):同一后台批次给全镜 AI 填空专业字段(只填空),并只给**没填 image_prompt、由平台拼了基础描述**的镜扩写完整出图/视频提示词(客户自己写的绝不覆盖;回执 auto_complete.prompt_shots)。文本步按 token 后付,**调用前告知客户**;只想导入传 auto_complete:false。回执 started=true 后用 get_autofill_status 轮询到 done **再** review_storyboards。",
4778
+ "description": "把一份结构化 JSON 一次性建成本集的角色 / 场景 / 分镜(按 name / location+time / storyboard_number 去重更新)。免费·确定性·不调 AI。★三步走:① get_bulk_import_spec 取契约与成品示例;② check_bulk_import 自检到 errors 清零;③ 再调本工具。★mode=merge(默认)保留未提到的镜;mode=replace 替换本集**全部**分镜(旧镜与已生成图/视频归档可恢复、不会自动重挂)——replace 必须先得到客户明确同意。★image_prompt / video_prompt 想自己写就直接写在每镜里,**逐字照用不被覆盖**;没填的镜平台拼基础描述(回执 base_prompts_built 是拼了几镜),导入后可用 get_shot_prompts 读、update_shot 改。(frame_visual_contract 是内部帧契约,导入时忽略。)★导入后:语速律会抬高装不下台词的镜(回执 speech_duration_raised / speech_duration_overflow)。★导入后**默认自动补全**(auto_complete,跟随剧目「自动补齐辅助资产」开关、默认开):同一后台批次给全镜 AI 填空专业字段(只填空),并只给**没填 image_prompt、由平台拼了基础描述**的镜扩写完整出图/视频提示词(客户自己写的绝不覆盖;回执 auto_complete.prompt_shots)。文本步按 token 后付,**调用前告知客户**;只想导入传 auto_complete:false。回执 started=true 后用 get_autofill_status 轮询到 done **再** review_storyboards。",
4779
4779
  "tags": [
4780
4780
  "episodes"
4781
4781
  ],
@@ -6148,7 +6148,7 @@
6148
6148
  "put": {
6149
6149
  "operationId": "update_shot",
6150
6150
  "summary": "逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)与角色绑定(character_ids)",
6151
- "description": "逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)与角色绑定(character_ids)。只传要改的字段、其余不动。**免费**(纯文本写库)。★改 dialogue 会自动失效本镜已生成的 TTS 配音与字幕(需重出 tts);改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果。★★原声镜(厂商原生音频)改 dialogue 后,本镜视频会被标记「待重生」——因为台词是**烤进视频人声**的,不重生就终拼,成片里念的仍是改动前的台词(典型现象:台词像是跑到了别的镜头上)。compose_episode 会以 advisory `stale_video_after_edit` 列出这些镜;正确处置是先 regenerate_shot_video 再终拼。",
6151
+ "description": "逐镜编辑:改单个分镜的文本内容(景别/动作/台词/画面描述/运镜等)与角色绑定(character_ids)。只传要改的字段、其余不动。**免费**(纯文本写库)。★改 dialogue 会自动失效本镜已生成的 TTS 配音与字幕(需重出 tts);改文本不会自动重出图/视频,如需让画面跟上文本改动,改完再 regen 对应镜。用 get_storyboards 查改后结果。★★原声镜(厂商原生音频)改 dialogue 后,本镜视频会被标记「待重生」——因为台词是**烤进视频人声**的,不重生就终拼,成片里念的仍是改动前的台词(典型现象:台词像是跑到了别的镜头上)。compose_episode 会以 advisory `stale_video_after_edit` 列出这些镜;正确处置是先 regenerate_shot_video 再终拼。★也可直接改本镜的两条提示词正文(image_prompt/video_prompt):改前先用 get_shot_prompts 读现值,别凭空覆盖——正文里的 @char:N / @scene:M 是角色/场景参考图的引用标记,删掉本镜就不注入对应定妆图/场景图(形象漂移)。",
6152
6152
  "tags": [
6153
6153
  "storyboards"
6154
6154
  ],
@@ -6212,6 +6212,12 @@
6212
6212
  },
6213
6213
  "shot_intent": {
6214
6214
  "type": "string"
6215
+ },
6216
+ "image_prompt": {
6217
+ "type": "string"
6218
+ },
6219
+ "video_prompt": {
6220
+ "type": "string"
6215
6221
  }
6216
6222
  }
6217
6223
  }
@@ -6727,6 +6733,53 @@
6727
6733
  }
6728
6734
  }
6729
6735
  },
6736
+ "/storyboards/{storyboard_id}/prompts": {
6737
+ "get": {
6738
+ "operationId": "get_shot_prompts",
6739
+ "summary": "读某一镜的两条提示词**正文**(image_prompt=首帧画面 / video_prompt=动态表演),供直接微调后用 update_shot 写回",
6740
+ "description": "读某一镜的两条提示词**正文**(image_prompt=首帧画面 / video_prompt=动态表演),供直接微调后用 update_shot 写回。免费。★逐镜按需:改哪镜读哪镜(整集列表 get_storyboards 是纯进度视图,不含提示词)。★返回的 asset_tokens 是正文里的角色/场景参考图引用标记(@char:N / @scene:M)——改写时原样保留,删掉本镜就不注入对应定妆图/场景图,画面会漂。★这是分镜表里的正文层;出图/出视频时平台还会在其上拼身份锚、一致性约束与参考图指令(不在此处,也无需你写)。改完提示词不会自动重出图/视频,要让画面跟上得再 regen 对应镜。",
6741
+ "tags": [
6742
+ "storyboards"
6743
+ ],
6744
+ "parameters": [
6745
+ {
6746
+ "name": "storyboard_id",
6747
+ "in": "path",
6748
+ "required": true,
6749
+ "schema": {
6750
+ "type": "integer",
6751
+ "exclusiveMinimum": 0
6752
+ }
6753
+ }
6754
+ ],
6755
+ "responses": {
6756
+ "200": {
6757
+ "description": "StarReel envelope",
6758
+ "content": {
6759
+ "application/json": {
6760
+ "schema": {
6761
+ "type": "object",
6762
+ "properties": {
6763
+ "code": {
6764
+ "type": "integer"
6765
+ },
6766
+ "message": {
6767
+ "type": "string"
6768
+ },
6769
+ "data": {
6770
+ "description": "Operation result payload"
6771
+ }
6772
+ }
6773
+ }
6774
+ }
6775
+ }
6776
+ },
6777
+ "402": {
6778
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
6779
+ }
6780
+ }
6781
+ }
6782
+ },
6730
6783
  "/storyboards/{storyboard_id}/regen/generate": {
6731
6784
  "post": {
6732
6785
  "operationId": "regenerate_shot_video",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.56",
3
+ "version": "0.1.57",
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.56",
5
+ "version": "0.1.57",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.56",
11
+ "version": "0.1.57",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },