@starreel/mcp 0.1.119 → 0.1.120

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
@@ -93,6 +93,7 @@ announces a condensed version as MCP `instructions` at connect time.
93
93
  | A product / brand | `create_drama` (`project_type: "ad"` or `"brand_film"`) → `add_product` → `generate_product_sheet` | writing brand copy as dialogue (it gets spoken) |
94
94
  | 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* |
95
95
  | Wants old portraits / sheets / a shot's old tail frame "deleted" | `set_character_portrait` (old assets listed in `old_assets`) · `clear_shot_frame` (old tail frame) → `regenerate_shot_video`. Both only **unlink** — files are not deleted (`physically_deleted` is always empty; `in_history: false` means the platform kept no record, so save that URL if it matters). Tell the customer exactly that | telling the customer the old image was deleted; writing `last_frame_image: null` through the internal API |
96
+ | Cross-era drama (scenes in different periods) — checking props fit their period | `get_props` → read each prop's `era_audit` (`form_consistent`, `conflicting_scopes`, `violations`); `audit_prop_era` to re-check after a new sheet. On a conflict: `update_prop` with a precise `era_lock` (dynasty + physical form) → `generate_prop_sheet`, or bind a different prop to those shots. `run_precheck` also lists shots whose bound prop conflicts (`prop-era-conflict`) | trusting the prop's name or description alone; regenerating shot frames before the prop sheet is fixed |
96
97
  | Wants to assemble the cut themselves | `export_handoff_pack` → `get_handoff_toolchain` → **`register_external_delivery`** when the cut is final | `compose_episode` (pick one); delivering a cut the platform has no record of |
97
98
  | A multi-language release | `translate_subtitles` · `subtitle_secondary_lang` in project settings | — |
98
99
 
@@ -1623,7 +1623,14 @@ export function registerProduceTools(server, client) {
1623
1623
  '前置:该角色已有定妆图。图片步,按用量后付不欠费。', { 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 } : {})));
1624
1624
  server.tool('generate_prop_sheet', '给道具 AI 出设定图。图片步,按用量后付不欠费。', { prop_id: z.number().int().positive() }, async ({ prop_id }) => jsonResult(await client.producePost(`/props/${prop_id}/generate-sheet`)));
1625
1625
  // ========== 剧目级资产:道具库 CRUD + 色彩脚本/动作模板读取 ==========
1626
- server.tool('get_props', '列剧目道具库(每个道具名称/类型/描述/设定图)。★道具库≠广告商品库(add_product/list_products 是带货商品);道具库是剧目道具。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/props`)));
1626
+ server.tool('get_props', '列剧目道具库(每个道具名称/类型/描述/设定图)。★道具库≠广告商品库(add_product/list_products 是带货商品);道具库是剧目道具。免费。' +
1627
+ '★每个道具带 era_audit(道具图的时代/形制审核结论,图换过则为 null):form_consistent=false 表示道具图与它的 era_lock 不符,' +
1628
+ 'conflicting_scopes 列出它被绑定却时代不合的场景/分集(scope 形如 scene:12 / episode:3),violations 点名具体冲突特征。' +
1629
+ '有冲突时:先 update_prop 改 era_lock(写清朝代与形制)再 generate_prop_sheet 重出道具图;或者给那些镜换用合适的道具。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/props`)));
1630
+ server.tool('audit_prop_era', '重审某个道具图的时代/形制(一次小额视觉审核,按用量后付)。依据该道具的 era_lock,以及它被绑定的各镜所在场景/分集的时代契约。' +
1631
+ '跨时代剧(不同场景属于不同朝代/年代)出完或换完道具图后跑一次;结果同 get_props 里的 era_audit。' +
1632
+ '道具还没有图、或既没写 era_lock 也没被绑到带时代契约的镜头上时返回 400(没有可比的依据)。' +
1633
+ '只有点名了具体冲突特征才判冲突;笼统的「不像那个年代」不算。', { prop_id: z.number().int().positive() }, async ({ prop_id }) => jsonResult(await client.producePost(`/props/${prop_id}/era-audit`, {})));
1627
1634
  server.tool('create_prop', '往道具库加一个道具。extract_assets 会自动提取道具,这里供手动补建。跨时代剧建道具时就把 era_lock 填上(建完会自动触发出设定图,补填要重出才生效)。免费(建条目;填了 description 会自动触发出设定图、后付)。', {
1628
1635
  drama_id: z.number().int().positive(),
1629
1636
  name: z.string().min(1).describe('道具名'),
@@ -1640,7 +1647,8 @@ export function registerProduceTools(server, client) {
1640
1647
  .describe("道具级时代锁:这件道具属于哪个年代、材质工艺该读作什么年代(跨时代剧必填,否则名字中性的道具年代随机)。'' 清空"),
1641
1648
  episode_id: z.number().int().positive().optional(),
1642
1649
  }, async ({ drama_id, ...fields }) => jsonResult(await client.producePost(`/props`, { drama_id, ...fields })));
1643
- server.tool('update_prop', '改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)。跨时代剧务必填 era_lock,否则名字中性的道具年代随机。免费。', {
1650
+ server.tool('update_prop', '改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)。跨时代剧务必填 era_lock,否则名字中性的道具年代随机。免费。' +
1651
+ '★改了 era_lock 不会自动重出道具图——要 generate_prop_sheet 重出,重出后若 get_props 的 era_audit 为 null(还没审过新图),用 audit_prop_era 审一次。', {
1644
1652
  prop_id: z.number().int().positive(),
1645
1653
  name: z.string().optional(),
1646
1654
  type: z.string().optional(),
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.119",
6
- "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → 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. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. 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.119 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.120",
6
+ "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → 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. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. 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.120 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -2576,7 +2576,7 @@
2576
2576
  "get": {
2577
2577
  "operationId": "get_props",
2578
2578
  "summary": "列剧目道具库(每个道具名称/类型/描述/设定图)",
2579
- "description": "列剧目道具库(每个道具名称/类型/描述/设定图)。★道具库≠广告商品库(add_product/list_products 是带货商品);道具库是剧目道具。免费。",
2579
+ "description": "列剧目道具库(每个道具名称/类型/描述/设定图)。★道具库≠广告商品库(add_product/list_products 是带货商品);道具库是剧目道具。免费。★每个道具带 era_audit(道具图的时代/形制审核结论,图换过则为 null):form_consistent=false 表示道具图与它的 era_lock 不符,conflicting_scopes 列出它被绑定却时代不合的场景/分集(scope 形如 scene:12 / episode:3),violations 点名具体冲突特征。有冲突时:先 update_prop 改 era_lock(写清朝代与形制)再 generate_prop_sheet 重出道具图;或者给那些镜换用合适的道具。",
2580
2580
  "tags": [
2581
2581
  "dramas"
2582
2582
  ],
@@ -8722,7 +8722,7 @@
8722
8722
  "put": {
8723
8723
  "operationId": "update_prop",
8724
8724
  "summary": "改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)",
8725
- "description": "改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)。跨时代剧务必填 era_lock,否则名字中性的道具年代随机。免费。",
8725
+ "description": "改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)。跨时代剧务必填 era_lock,否则名字中性的道具年代随机。免费。★改了 era_lock 不会自动重出道具图——要 generate_prop_sheet 重出,重出后若 get_props 的 era_audit 为 null(还没审过新图),用 audit_prop_era 审一次。",
8726
8726
  "tags": [
8727
8727
  "props"
8728
8728
  ],
@@ -8848,6 +8848,64 @@
8848
8848
  }
8849
8849
  }
8850
8850
  },
8851
+ "/props/{prop_id}/era-audit": {
8852
+ "post": {
8853
+ "operationId": "audit_prop_era",
8854
+ "summary": "重审某个道具图的时代/形制(一次小额视觉审核,按用量后付)",
8855
+ "description": "重审某个道具图的时代/形制(一次小额视觉审核,按用量后付)。依据该道具的 era_lock,以及它被绑定的各镜所在场景/分集的时代契约。跨时代剧(不同场景属于不同朝代/年代)出完或换完道具图后跑一次;结果同 get_props 里的 era_audit。道具还没有图、或既没写 era_lock 也没被绑到带时代契约的镜头上时返回 400(没有可比的依据)。只有点名了具体冲突特征才判冲突;笼统的「不像那个年代」不算。",
8856
+ "tags": [
8857
+ "props"
8858
+ ],
8859
+ "parameters": [
8860
+ {
8861
+ "name": "prop_id",
8862
+ "in": "path",
8863
+ "required": true,
8864
+ "schema": {
8865
+ "type": "integer",
8866
+ "exclusiveMinimum": 0
8867
+ }
8868
+ }
8869
+ ],
8870
+ "requestBody": {
8871
+ "required": false,
8872
+ "content": {
8873
+ "application/json": {
8874
+ "schema": {
8875
+ "type": "object",
8876
+ "properties": {}
8877
+ }
8878
+ }
8879
+ }
8880
+ },
8881
+ "responses": {
8882
+ "200": {
8883
+ "description": "StarReel envelope",
8884
+ "content": {
8885
+ "application/json": {
8886
+ "schema": {
8887
+ "type": "object",
8888
+ "properties": {
8889
+ "code": {
8890
+ "type": "integer"
8891
+ },
8892
+ "message": {
8893
+ "type": "string"
8894
+ },
8895
+ "data": {
8896
+ "description": "Operation result payload"
8897
+ }
8898
+ }
8899
+ }
8900
+ }
8901
+ }
8902
+ },
8903
+ "402": {
8904
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
8905
+ }
8906
+ }
8907
+ }
8908
+ },
8851
8909
  "/props/{prop_id}/generate-sheet": {
8852
8910
  "post": {
8853
8911
  "operationId": "generate_prop_sheet",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.119",
3
+ "version": "0.1.120",
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.119",
5
+ "version": "0.1.120",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.119",
11
+ "version": "0.1.120",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },