@starreel/mcp 0.1.67 → 0.1.69

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
@@ -509,6 +509,8 @@ cost is lip sync: the picture was acted to the original audio. On shots where
509
509
  the mouth isn't readable (back turned, wide, off-screen) that is invisible; on
510
510
  sustained close-ups, regenerate instead. Reach for `regenerate_shot_video` when
511
511
  the shot is a close-up, or when the picture itself is also wrong.
512
+ `repair_episode_dialogue` runs in the background — poll it with
513
+ `get_dialogue_repair_status`.
512
514
  Either way, `compose_episode` afterwards — the final cut still holds the old audio until you do.
513
515
 
514
516
  Four distinct causes; they need **opposite** fixes, so identify the family first.
@@ -652,6 +654,16 @@ to close") tells the vendor to fit that entire sequence into each 3-second shot.
652
654
  each**: `apply_recovered_final`, or `apply_recovered_candidate` (which
653
655
  requires an explicit `target_storyboard_id` — the platform will not guess
654
656
  which shot a recovered frame belongs to). `rollback_asset_recovery` undoes one.
657
+ - **Final-cut review (advisory, not a gate)**: `review_final_cut` — unrendered
658
+ shots, subtitles that won't fit on screen, characters without an identity
659
+ anchor, axis jumps, plus one LLM proofreading pass (that pass **costs money**;
660
+ send `proofread: false` to skip it). `can_export: false` only means something
661
+ is worth a look — the platform will **not** block `compose_episode` or
662
+ `get_export`. Walk the findings past the user and let them decide.
663
+ `audit_silent_shot_audio` catches reaction shots that should be silent but are
664
+ louder than the speaking shots around them (only relevant when the drama uses
665
+ clip audio); it is **slow** — 6–10s per shot — so run it once before the final
666
+ cut, not repeatedly mid-pipeline.
655
667
  - **Marketing export**: `export_sheet_compare` / `get_sheet_compare` — the
656
668
  character-sheet-vs-frame comparison sheet. **Off by default per drama**; a 403
657
669
  or `enabled: false` means the user has to switch it on in the drama settings.
@@ -629,6 +629,25 @@ export function registerProduceTools(server, client) {
629
629
  server.tool('get_final_cut', '查某一集成片状态与下载链接。status=completed 时返回 download_url(我方 COS 直链,可直接下载)。免费。' +
630
630
  '★bgm_stale=true 表示配乐在成片之后生成/改动、尚未进成片:重新 compose_episode(免费)即可,别用 re-render。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/final-cut`)));
631
631
  server.tool('get_export', '查某一集导出/母版状态(成片终拼后的可下载母版)。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/export`)));
632
+ server.tool('review_final_cut', '**成片体检**:导出前把整集过一遍——没出图的镜、字幕一屏放不下、人物没有身份锚、'
633
+ + '镜头连续性(跳轴)、以及一次错别字通读。'
634
+ + '\n★**建议式,不阻断**:can_export=false 只代表有 block 级问题值得先看,'
635
+ + '平台不会拦着你 compose_episode / get_export。把 findings 逐条讲给客户'
636
+ + '(code=问题类型、shots=命中的镜号、action=该调哪个工具去修),**由客户决定修还是照发**。'
637
+ + '\n★费用:本身免费,但默认会跑一次 LLM 错别字通读——那一步**要花钱**。'
638
+ + '不需要通读就传 proofread=false(更快也不扣费)。'
639
+ + '\n★字幕与错别字那几项的**原文**在官网体检面板里看,这里只给结论与镜号。', {
640
+ episode_id: z.number().int().positive(),
641
+ proofread: z.boolean().optional()
642
+ .describe('是否跑 LLM 错别字通读(默认 true,**要花钱**);传 false 跳过这一步'),
643
+ }, async ({ episode_id, proofread }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/qc${proofread === false ? '?proofread=0' : ''}`)));
644
+ server.tool('audit_silent_shot_audio', '查**无台词镜里的异常发声**:本该沉默的反应镜,音轨却比同场说话镜还响——'
645
+ + '成片里的表现是「有人在画外乱说话」。免费。'
646
+ + '\n★用在**原声剧**上(use_clip_audio=true,即直接用 AI 视频自带声音那种)。'
647
+ + '走 TTS 配音的片子不会有这个问题。'
648
+ + '\n★**很慢**:每镜要完整解码音轨,实测 6~10 秒/镜(后端限并发 4),整集几十镜要等几分钟。'
649
+ + '别在产线中途反复调,放在成片前查一次。'
650
+ + '\n★shots_probe_failed 是**没测成**的镜数,不代表那些镜有问题。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/silent-shot-audio-audit`)));
632
651
  server.tool('get_asset_recovery', '列本集可恢复的**历史产物**(免费·只读):以前生成过、后来被覆盖掉的成片与候选帧。'
633
652
  + '\n用途:客户说「上一版那个好」「前天那张图比现在这张好」时,从这里找回来。'
634
653
  + '\n★这一步只看不改。把候选逐条讲给客户,**客户逐条点头**之后再 apply。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/asset-recovery`)));
@@ -1024,6 +1043,11 @@ export function registerProduceTools(server, client) {
1024
1043
  ...(only_flagged === undefined ? {} : { only_flagged }),
1025
1044
  ...(force ? { force: true } : {}),
1026
1045
  })));
1046
+ server.tool('get_dialogue_repair_status', '查台词修复的进度(免费)。repair_episode_dialogue 是后台异步串行跑的,用这个轮询。'
1047
+ + '\n★这个工具此前**不存在**,而 repair_episode_dialogue 的描述里却写着「进度用 '
1048
+ + 'dialogue-repair-status 查」——第三方照着找会扑空(2026-09-21 由 MCP 覆盖闸抓出)。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/dialogue-repair-status`)));
1049
+ server.tool('get_shot_name_card', '读这一镜的**人物名片**现值(免费):名字、头衔、显示位置那些。'
1050
+ + '\n★改之前先读一遍——set_shot_name_card 是**整体覆盖**,不读就改会把没打算动的字段清掉。', { storyboard_id: z.number().int().positive() }, async ({ storyboard_id }) => jsonResult(await client.produceGet(`/storyboards/${storyboard_id}/name-card`)));
1027
1051
  server.tool('generate_bgm', '给整集生成/更换 AI 配乐(按情绪弧线)。后台异步,按用量后付不欠费。返回情绪弧线段数与预估耗时;' +
1028
1052
  '用 get_bgm_status 轮询生成进度。★配乐生成/改动**不会自动进已有成片**——完成后必须重新 ' +
1029
1053
  'compose_episode(免费)才能听到;get_final_cut 的 bgm_stale=true 就是在提示这一步。别用 re-render(吃旧时间线,不含新配乐)。\n' +
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.67",
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.67 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.69",
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.69 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -3364,6 +3364,53 @@
3364
3364
  }
3365
3365
  }
3366
3366
  },
3367
+ "/episodes/{episode_id}/dialogue-repair-status": {
3368
+ "get": {
3369
+ "operationId": "get_dialogue_repair_status",
3370
+ "summary": "查台词修复的进度(免费)",
3371
+ "description": "查台词修复的进度(免费)。repair_episode_dialogue 是后台异步串行跑的,用这个轮询。\n★这个工具此前**不存在**,而 repair_episode_dialogue 的描述里却写着「进度用 dialogue-repair-status 查」——第三方照着找会扑空(2026-09-21 由 MCP 覆盖闸抓出)。",
3372
+ "tags": [
3373
+ "episodes"
3374
+ ],
3375
+ "parameters": [
3376
+ {
3377
+ "name": "episode_id",
3378
+ "in": "path",
3379
+ "required": true,
3380
+ "schema": {
3381
+ "type": "integer",
3382
+ "exclusiveMinimum": 0
3383
+ }
3384
+ }
3385
+ ],
3386
+ "responses": {
3387
+ "200": {
3388
+ "description": "StarReel envelope",
3389
+ "content": {
3390
+ "application/json": {
3391
+ "schema": {
3392
+ "type": "object",
3393
+ "properties": {
3394
+ "code": {
3395
+ "type": "integer"
3396
+ },
3397
+ "message": {
3398
+ "type": "string"
3399
+ },
3400
+ "data": {
3401
+ "description": "Operation result payload"
3402
+ }
3403
+ }
3404
+ }
3405
+ }
3406
+ }
3407
+ },
3408
+ "402": {
3409
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
3410
+ }
3411
+ }
3412
+ }
3413
+ },
3367
3414
  "/episodes/{episode_id}/effects": {
3368
3415
  "post": {
3369
3416
  "operationId": "generate_effects",
@@ -4925,6 +4972,53 @@
4925
4972
  }
4926
4973
  }
4927
4974
  },
4975
+ "/episodes/{episode_id}/qc": {
4976
+ "get": {
4977
+ "operationId": "review_final_cut",
4978
+ "summary": "**成片体检**:导出前把整集过一遍——没出图的镜、字幕一屏放不下、人物没有身份锚、镜头连续性(跳轴)、以及一次错别字通读",
4979
+ "description": "**成片体检**:导出前把整集过一遍——没出图的镜、字幕一屏放不下、人物没有身份锚、镜头连续性(跳轴)、以及一次错别字通读。\n★**建议式,不阻断**:can_export=false 只代表有 block 级问题值得先看,平台不会拦着你 compose_episode / get_export。把 findings 逐条讲给客户(code=问题类型、shots=命中的镜号、action=该调哪个工具去修),**由客户决定修还是照发**。\n★费用:本身免费,但默认会跑一次 LLM 错别字通读——那一步**要花钱**。不需要通读就传 proofread=false(更快也不扣费)。\n★字幕与错别字那几项的**原文**在官网体检面板里看,这里只给结论与镜号。",
4980
+ "tags": [
4981
+ "episodes"
4982
+ ],
4983
+ "parameters": [
4984
+ {
4985
+ "name": "episode_id",
4986
+ "in": "path",
4987
+ "required": true,
4988
+ "schema": {
4989
+ "type": "integer",
4990
+ "exclusiveMinimum": 0
4991
+ }
4992
+ }
4993
+ ],
4994
+ "responses": {
4995
+ "200": {
4996
+ "description": "StarReel envelope",
4997
+ "content": {
4998
+ "application/json": {
4999
+ "schema": {
5000
+ "type": "object",
5001
+ "properties": {
5002
+ "code": {
5003
+ "type": "integer"
5004
+ },
5005
+ "message": {
5006
+ "type": "string"
5007
+ },
5008
+ "data": {
5009
+ "description": "Operation result payload"
5010
+ }
5011
+ }
5012
+ }
5013
+ }
5014
+ }
5015
+ },
5016
+ "402": {
5017
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
5018
+ }
5019
+ }
5020
+ }
5021
+ },
4928
5022
  "/episodes/{episode_id}/re-render": {
4929
5023
  "post": {
4930
5024
  "operationId": "rerender_episode",
@@ -5759,6 +5853,53 @@
5759
5853
  }
5760
5854
  }
5761
5855
  },
5856
+ "/episodes/{episode_id}/silent-shot-audio-audit": {
5857
+ "get": {
5858
+ "operationId": "audit_silent_shot_audio",
5859
+ "summary": "查**无台词镜里的异常发声**:本该沉默的反应镜,音轨却比同场说话镜还响——成片里的表现是「有人在画外乱说话」",
5860
+ "description": "查**无台词镜里的异常发声**:本该沉默的反应镜,音轨却比同场说话镜还响——成片里的表现是「有人在画外乱说话」。免费。\n★用在**原声剧**上(use_clip_audio=true,即直接用 AI 视频自带声音那种)。走 TTS 配音的片子不会有这个问题。\n★**很慢**:每镜要完整解码音轨,实测 6~10 秒/镜(后端限并发 4),整集几十镜要等几分钟。别在产线中途反复调,放在成片前查一次。\n★shots_probe_failed 是**没测成**的镜数,不代表那些镜有问题。",
5861
+ "tags": [
5862
+ "episodes"
5863
+ ],
5864
+ "parameters": [
5865
+ {
5866
+ "name": "episode_id",
5867
+ "in": "path",
5868
+ "required": true,
5869
+ "schema": {
5870
+ "type": "integer",
5871
+ "exclusiveMinimum": 0
5872
+ }
5873
+ }
5874
+ ],
5875
+ "responses": {
5876
+ "200": {
5877
+ "description": "StarReel envelope",
5878
+ "content": {
5879
+ "application/json": {
5880
+ "schema": {
5881
+ "type": "object",
5882
+ "properties": {
5883
+ "code": {
5884
+ "type": "integer"
5885
+ },
5886
+ "message": {
5887
+ "type": "string"
5888
+ },
5889
+ "data": {
5890
+ "description": "Operation result payload"
5891
+ }
5892
+ }
5893
+ }
5894
+ }
5895
+ }
5896
+ },
5897
+ "402": {
5898
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
5899
+ }
5900
+ }
5901
+ }
5902
+ },
5762
5903
  "/episodes/{episode_id}/storyboards": {
5763
5904
  "get": {
5764
5905
  "operationId": "get_storyboards",
@@ -8501,6 +8642,51 @@
8501
8642
  }
8502
8643
  },
8503
8644
  "/storyboards/{storyboard_id}/name-card": {
8645
+ "get": {
8646
+ "operationId": "get_shot_name_card",
8647
+ "summary": "读这一镜的**人物名片**现值(免费):名字、头衔、显示位置那些",
8648
+ "description": "读这一镜的**人物名片**现值(免费):名字、头衔、显示位置那些。\n★改之前先读一遍——set_shot_name_card 是**整体覆盖**,不读就改会把没打算动的字段清掉。",
8649
+ "tags": [
8650
+ "storyboards"
8651
+ ],
8652
+ "parameters": [
8653
+ {
8654
+ "name": "storyboard_id",
8655
+ "in": "path",
8656
+ "required": true,
8657
+ "schema": {
8658
+ "type": "integer",
8659
+ "exclusiveMinimum": 0
8660
+ }
8661
+ }
8662
+ ],
8663
+ "responses": {
8664
+ "200": {
8665
+ "description": "StarReel envelope",
8666
+ "content": {
8667
+ "application/json": {
8668
+ "schema": {
8669
+ "type": "object",
8670
+ "properties": {
8671
+ "code": {
8672
+ "type": "integer"
8673
+ },
8674
+ "message": {
8675
+ "type": "string"
8676
+ },
8677
+ "data": {
8678
+ "description": "Operation result payload"
8679
+ }
8680
+ }
8681
+ }
8682
+ }
8683
+ }
8684
+ },
8685
+ "402": {
8686
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
8687
+ }
8688
+ }
8689
+ },
8504
8690
  "put": {
8505
8691
  "operationId": "set_shot_name_card",
8506
8692
  "summary": "给某一镜加/改/清「版式字卡」(终拼时烧进成片,含预览一致的书法字体与朱红印章)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.67",
3
+ "version": "0.1.69",
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.67",
5
+ "version": "0.1.69",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.67",
11
+ "version": "0.1.69",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },