@starreel/mcp 0.1.71 → 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 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. `retryable:true`
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 /
@@ -475,7 +478,9 @@ Map the reason to an action:
475
478
  | `quota_full` | false | Platform vendor-asset quota exhausted | Retry won't help — contact ops |
476
479
  | `insufficient_credits` | false | Balance too low for this call | Stop, prompt to recharge (402) |
477
480
  | `authorizing` | true | Face frame queuing for KYC (not a rejection) | Wait ~1 min, retry |
478
- | `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 |
479
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 |
480
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 |
481
486
  | `unknown` | false | Unclassified | Read `fail_hint`; don't auto-retry |
@@ -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 修完再复审。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/review/storyboards`)));
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 / ' +
@@ -1229,7 +1232,14 @@ export function registerProduceTools(server, client) {
1229
1232
  '★覆盖式:出好后本场旧图被换掉(要留档先 get_scene_prompt/资产列表拿旧图 URL)。' +
1230
1233
  '★已生成的镜头帧不会自动跟着重出——它们仍拿旧场景图当背景锚,要跟上得逐镜重出。' +
1231
1234
  '★与 generate_scene_images 的区别:那个是整剧批量、只补**缺图**的场景,已有图的一律跳过;' +
1232
- '这个是单场景强制重出。客户自己上传过的场景图也会被覆盖,先确认是不是要保留。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.producePost(`/scenes/${scene_id}/image/regenerate`)));
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 } : {})));
1233
1243
  server.tool('delete_scene', '删除一个场景。免费。', { scene_id: z.number().int().positive() }, async ({ scene_id }) => jsonResult(await client.produceDelete(`/scenes/${scene_id}`)));
1234
1244
  server.tool('generate_character_sheet', '给**单个**角色出三视图设定图(镜头一致性根锚,所有镜头帧都会引用;比定妆图更完整)。整集批量用 generate_character_sheets。' +
1235
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.71",
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.71 tool surface (operationIds match MCP tool names 1: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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.71",
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.71",
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.71",
11
+ "version": "0.1.72",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },