@starreel/mcp 0.1.119 → 0.1.121

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
@@ -92,7 +92,8 @@ announces a condensed version as MCP `instructions` at connect time.
92
92
  | A song + lyrics | `create_drama` (`project_type: "mv"`) → `set_mv_lyrics` → `generate_mv_story` → `generate_mv_script` | `rewrite_script` (blocked for MV) |
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
- | 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 |
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`; `list_unlinked_assets` lists the drama's unlinked old assets (a history list, not proof of ownership). 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
 
@@ -1145,6 +1145,9 @@ export function registerProduceTools(server, client) {
1145
1145
  const video_url = await client.uploadLocalFile(file_path, 'footage');
1146
1146
  return jsonResult(await client.producePost(`/storyboards/${storyboard_id}/footage`, { video_url }));
1147
1147
  });
1148
+ server.tool('list_unlinked_assets', '列出本剧「已解除引用」的旧资产(免费):清尾帧、换定妆图时被摘下来的旧尾帧/旧定妆图/旧设定图/发型·身体参考/视频锚,每个 URL 一条。' +
1149
+ '这些文件仍然存在于存储里。清单会尽量排除已被重新用上的图,但不保证完全排除——某张图是否还在别处被引用,' +
1150
+ '以平台的全库检查为准。客户问「旧图还在不在」时用它。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/unlinked-assets`)));
1148
1151
  server.tool('clear_shot_frame', '清除某镜的尾帧(解除引用,免费)。用于换了定妆图/改了剧情后,旧尾帧会把旧人物/旧画面带进重生的视频时,先清掉它再 regenerate_shot_video。' +
1149
1152
  '只能清尾帧:首帧是出视频的起点,要换首帧用 generate_shot_frame 重生或 upload_shot_frame 替换。' +
1150
1153
  '★这是解除引用,不是删除:文件不会被删,响应里 unlinked[].in_history=true 的可在 get_asset_versions 找回,physically_deleted 恒为空——如实告诉客户。' +
@@ -1623,7 +1626,14 @@ export function registerProduceTools(server, client) {
1623
1626
  '前置:该角色已有定妆图。图片步,按用量后付不欠费。', { 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
1627
  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
1628
  // ========== 剧目级资产:道具库 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`)));
1629
+ server.tool('get_props', '列剧目道具库(每个道具名称/类型/描述/设定图)。★道具库≠广告商品库(add_product/list_products 是带货商品);道具库是剧目道具。免费。' +
1630
+ '★每个道具带 era_audit(道具图的时代/形制审核结论,图换过则为 null):form_consistent=false 表示道具图与它的 era_lock 不符,' +
1631
+ 'conflicting_scopes 列出它被绑定却时代不合的场景/分集(scope 形如 scene:12 / episode:3),violations 点名具体冲突特征。' +
1632
+ '有冲突时:先 update_prop 改 era_lock(写清朝代与形制)再 generate_prop_sheet 重出道具图;或者给那些镜换用合适的道具。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}/props`)));
1633
+ server.tool('audit_prop_era', '重审某个道具图的时代/形制(一次小额视觉审核,按用量后付)。依据该道具的 era_lock,以及它被绑定的各镜所在场景/分集的时代契约。' +
1634
+ '跨时代剧(不同场景属于不同朝代/年代)出完或换完道具图后跑一次;结果同 get_props 里的 era_audit。' +
1635
+ '道具还没有图、或既没写 era_lock 也没被绑到带时代契约的镜头上时返回 400(没有可比的依据)。' +
1636
+ '只有点名了具体冲突特征才判冲突;笼统的「不像那个年代」不算。', { prop_id: z.number().int().positive() }, async ({ prop_id }) => jsonResult(await client.producePost(`/props/${prop_id}/era-audit`, {})));
1627
1637
  server.tool('create_prop', '往道具库加一个道具。extract_assets 会自动提取道具,这里供手动补建。跨时代剧建道具时就把 era_lock 填上(建完会自动触发出设定图,补填要重出才生效)。免费(建条目;填了 description 会自动触发出设定图、后付)。', {
1628
1638
  drama_id: z.number().int().positive(),
1629
1639
  name: z.string().min(1).describe('道具名'),
@@ -1640,7 +1650,8 @@ export function registerProduceTools(server, client) {
1640
1650
  .describe("道具级时代锁:这件道具属于哪个年代、材质工艺该读作什么年代(跨时代剧必填,否则名字中性的道具年代随机)。'' 清空"),
1641
1651
  episode_id: z.number().int().positive().optional(),
1642
1652
  }, async ({ drama_id, ...fields }) => jsonResult(await client.producePost(`/props`, { drama_id, ...fields })));
1643
- server.tool('update_prop', '改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)。跨时代剧务必填 era_lock,否则名字中性的道具年代随机。免费。', {
1653
+ server.tool('update_prop', '改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)。跨时代剧务必填 era_lock,否则名字中性的道具年代随机。免费。' +
1654
+ '★改了 era_lock 不会自动重出道具图——要 generate_prop_sheet 重出,重出后若 get_props 的 era_audit 为 null(还没审过新图),用 audit_prop_era 审一次。', {
1644
1655
  prop_id: z.number().int().positive(),
1645
1656
  name: z.string().optional(),
1646
1657
  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.121",
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.121 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
  ],
@@ -2732,6 +2732,53 @@
2732
2732
  }
2733
2733
  }
2734
2734
  },
2735
+ "/dramas/{drama_id}/unlinked-assets": {
2736
+ "get": {
2737
+ "operationId": "list_unlinked_assets",
2738
+ "summary": "列出本剧「已解除引用」的旧资产(免费):清尾帧、换定妆图时被摘下来的旧尾帧/旧定妆图/旧设定图/发型·身体参考/视频锚,每个 URL 一条",
2739
+ "description": "列出本剧「已解除引用」的旧资产(免费):清尾帧、换定妆图时被摘下来的旧尾帧/旧定妆图/旧设定图/发型·身体参考/视频锚,每个 URL 一条。这些文件仍然存在于存储里。清单会尽量排除已被重新用上的图,但不保证完全排除——某张图是否还在别处被引用,以平台的全库检查为准。客户问「旧图还在不在」时用它。",
2740
+ "tags": [
2741
+ "dramas"
2742
+ ],
2743
+ "parameters": [
2744
+ {
2745
+ "name": "drama_id",
2746
+ "in": "path",
2747
+ "required": true,
2748
+ "schema": {
2749
+ "type": "integer",
2750
+ "exclusiveMinimum": 0
2751
+ }
2752
+ }
2753
+ ],
2754
+ "responses": {
2755
+ "200": {
2756
+ "description": "StarReel envelope",
2757
+ "content": {
2758
+ "application/json": {
2759
+ "schema": {
2760
+ "type": "object",
2761
+ "properties": {
2762
+ "code": {
2763
+ "type": "integer"
2764
+ },
2765
+ "message": {
2766
+ "type": "string"
2767
+ },
2768
+ "data": {
2769
+ "description": "Operation result payload"
2770
+ }
2771
+ }
2772
+ }
2773
+ }
2774
+ }
2775
+ },
2776
+ "402": {
2777
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
2778
+ }
2779
+ }
2780
+ }
2781
+ },
2735
2782
  "/dramas/{drama_id}/video-style": {
2736
2783
  "post": {
2737
2784
  "operationId": "generate_video_style",
@@ -8722,7 +8769,7 @@
8722
8769
  "put": {
8723
8770
  "operationId": "update_prop",
8724
8771
  "summary": "改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)",
8725
- "description": "改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)。跨时代剧务必填 era_lock,否则名字中性的道具年代随机。免费。",
8772
+ "description": "改道具(名称/类型/描述/prompt/尺寸/多视角参考图/时代锁)。跨时代剧务必填 era_lock,否则名字中性的道具年代随机。免费。★改了 era_lock 不会自动重出道具图——要 generate_prop_sheet 重出,重出后若 get_props 的 era_audit 为 null(还没审过新图),用 audit_prop_era 审一次。",
8726
8773
  "tags": [
8727
8774
  "props"
8728
8775
  ],
@@ -8848,6 +8895,64 @@
8848
8895
  }
8849
8896
  }
8850
8897
  },
8898
+ "/props/{prop_id}/era-audit": {
8899
+ "post": {
8900
+ "operationId": "audit_prop_era",
8901
+ "summary": "重审某个道具图的时代/形制(一次小额视觉审核,按用量后付)",
8902
+ "description": "重审某个道具图的时代/形制(一次小额视觉审核,按用量后付)。依据该道具的 era_lock,以及它被绑定的各镜所在场景/分集的时代契约。跨时代剧(不同场景属于不同朝代/年代)出完或换完道具图后跑一次;结果同 get_props 里的 era_audit。道具还没有图、或既没写 era_lock 也没被绑到带时代契约的镜头上时返回 400(没有可比的依据)。只有点名了具体冲突特征才判冲突;笼统的「不像那个年代」不算。",
8903
+ "tags": [
8904
+ "props"
8905
+ ],
8906
+ "parameters": [
8907
+ {
8908
+ "name": "prop_id",
8909
+ "in": "path",
8910
+ "required": true,
8911
+ "schema": {
8912
+ "type": "integer",
8913
+ "exclusiveMinimum": 0
8914
+ }
8915
+ }
8916
+ ],
8917
+ "requestBody": {
8918
+ "required": false,
8919
+ "content": {
8920
+ "application/json": {
8921
+ "schema": {
8922
+ "type": "object",
8923
+ "properties": {}
8924
+ }
8925
+ }
8926
+ }
8927
+ },
8928
+ "responses": {
8929
+ "200": {
8930
+ "description": "StarReel envelope",
8931
+ "content": {
8932
+ "application/json": {
8933
+ "schema": {
8934
+ "type": "object",
8935
+ "properties": {
8936
+ "code": {
8937
+ "type": "integer"
8938
+ },
8939
+ "message": {
8940
+ "type": "string"
8941
+ },
8942
+ "data": {
8943
+ "description": "Operation result payload"
8944
+ }
8945
+ }
8946
+ }
8947
+ }
8948
+ }
8949
+ },
8950
+ "402": {
8951
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
8952
+ }
8953
+ }
8954
+ }
8955
+ },
8851
8956
  "/props/{prop_id}/generate-sheet": {
8852
8957
  "post": {
8853
8958
  "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.121",
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.121",
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.121",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },