@starreel/mcp 0.1.89 → 0.1.90
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 +26 -0
- package/dist/tools/produce.js +14 -0
- package/openapi.json +171 -2
- package/package.json +1 -1
- package/server.json +2 -2
package/SKILL.md
CHANGED
|
@@ -659,6 +659,32 @@ the scene (signs, book pages, screens) is not reported. Re-composing cannot remo
|
|
|
659
659
|
burned-in text; `regenerate_shot_video` the flagged shots. After a non-dry-run scan,
|
|
660
660
|
`compose_episode` lists them as advisory `vendor_burned_text`.
|
|
661
661
|
|
|
662
|
+
### "同一个角色前后换了衣服" / a character's outfit changes between shots
|
|
663
|
+
|
|
664
|
+
The image model sometimes draws a character's clothing differently from the
|
|
665
|
+
reference — most often a small figure in a wide shot — even when the reference
|
|
666
|
+
images, the shot text and the wardrobe lock were all correct. Run
|
|
667
|
+
**`scan_wardrobe_consistency`** (one vision call per shot, billed by usage): it
|
|
668
|
+
compares each shot's opening frame and a mid-clip frame with every bound
|
|
669
|
+
character's sheet (or portrait) and reports concrete `differences`. Overall
|
|
670
|
+
night/lamp color cast is not a mismatch. Re-composing cannot fix it: regenerate
|
|
671
|
+
the shot's frame (`generate_shot_frame`), then `regenerate_shot_video`.
|
|
672
|
+
|
|
673
|
+
### "同一个角色前后嗓音不一样" / a character's voice drifts between shots
|
|
674
|
+
|
|
675
|
+
On native-audio projects the voice comes from the video vendor, anchored by the
|
|
676
|
+
character's bound voice sample. Two different things look the same to the ear:
|
|
677
|
+
a shot generated **before** the voice was bound (it never had an anchor), and a
|
|
678
|
+
shot whose voice drifted despite the anchor. Check them in this order:
|
|
679
|
+
|
|
680
|
+
1. `get_pipeline_status` → `native_voice_anchor.stale_shots` lists shots whose
|
|
681
|
+
final clip was generated without the speaker's current voice anchor
|
|
682
|
+
(`not_attached` / `anchor_changed`). Regenerate those — no scan needed.
|
|
683
|
+
2. For the rest, `scan_voice_consistency` (free, runs in the background ~10 min
|
|
684
|
+
per episode) then `get_voice_consistency`: `summary.voice_mismatch` are shots
|
|
685
|
+
whose voice does not sound like the character's anchor. `uncertain` means the
|
|
686
|
+
spoken part was too short to judge — not a defect.
|
|
687
|
+
|
|
662
688
|
### "话没说完就切" / a line gets cut off mid-word
|
|
663
689
|
|
|
664
690
|
**By far the most common cause is #2 — the vendor's clip never said the whole
|
package/dist/tools/produce.js
CHANGED
|
@@ -1159,6 +1159,20 @@ export function registerProduceTools(server, client) {
|
|
|
1159
1159
|
+ '返回 flagged[{shot, texts, matches_dialogue, frames}] / clean / errors。'
|
|
1160
1160
|
+ 'matches_dialogue=true 表示读出来的字就是本镜台词,基本可确认是厂商字幕;招牌、书页、屏幕等画面里本来就有的字不算。'
|
|
1161
1161
|
+ 'dry_run=true 只报告不写回;否则结果写回,compose_episode 的终拼预检会以 vendor_burned_text 列出这些镜。', { episode_id: z.number().int().positive(), dry_run: z.boolean().optional() }, async ({ episode_id, dry_run }) => jsonResult(await client.producePost(`/episodes/${episode_id}/video-text-scan`, { dry_run: dry_run === true })));
|
|
1162
|
+
server.tool('scan_wardrobe_consistency', '★客户报「同一个角色前后换了衣服 / 衣服颜色款式不对」时跑这个;终拼前也建议跑一次。' +
|
|
1163
|
+
'逐镜把采用的首帧和视频中段一帧,与本镜每个角色的设定图(没有则用定妆图)比对衣服的款式与颜色。' +
|
|
1164
|
+
'常见成因是远景小人物被出图模型画成了别的衣服——即使参考图和提示词都对。夜景/暖光的整体偏色不算不一致。' +
|
|
1165
|
+
'每镜一次视觉审计,**按用量计费**。返回 flagged[{shot, characters:[{name, differences}]}] / clean / errors。' +
|
|
1166
|
+
'dry_run=true 只报告不写回;否则写回,compose_episode 的终拼预检会以 wardrobe_mismatch 列出这些镜。' +
|
|
1167
|
+
'处置:重出该镜首帧(generate_shot_frame)再 regenerate_shot_video;重新拼接去不掉。', { episode_id: z.number().int().positive(), dry_run: z.boolean().optional() }, async ({ episode_id, dry_run }) => jsonResult(await client.producePost(`/episodes/${episode_id}/wardrobe-scan`, { dry_run: dry_run === true })));
|
|
1168
|
+
server.tool('scan_voice_consistency', '★原声剧(视频自带人声)客户报「同一个角色前后嗓音不一样 / 声线漂了」时跑这个。免费(本地推理,不调厂商)。' +
|
|
1169
|
+
'对每个有台词的镜,听厂商生成的人声:台词念没念全,以及声音像不像该角色绑定的声线锚。' +
|
|
1170
|
+
'**异步**:立即返回,后台整集约 10 分钟;同一集同时只跑一条(重复调用返回 started=false)。' +
|
|
1171
|
+
'默认跳过已对当前视频扫过的镜,rescan=true 全部重扫。用 get_voice_consistency 查进度和逐镜结果。', { episode_id: z.number().int().positive(), rescan: z.boolean().optional() }, async ({ episode_id, rescan }) => jsonResult(await client.producePost(`/episodes/${episode_id}/voice-identity-scan`, { rescan: rescan === true })));
|
|
1172
|
+
server.tool('get_voice_consistency', '查声线一致性扫描的进度与逐镜结果(scan_voice_consistency 启动的)。免费。' +
|
|
1173
|
+
'summary.voice_mismatch=声音不像该角色声线锚的镜号(重点看);dialogue_issues=台词没念完/念错/多出说话声的镜;' +
|
|
1174
|
+
'not_scanned_or_stale=还没扫或视频换过需重扫。speaker_verdict=uncertain 表示人声太短判不了,不是问题。' +
|
|
1175
|
+
'声线不一致的镜:先用 get_pipeline_status 的 native_voice_anchor 确认角色已绑声线,再 regenerate_shot_video 重出。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/voice-identity-scan`)));
|
|
1162
1176
|
server.tool('scan_dialogue_coverage', '★客户报「话没说完就切 / 台词只念了一半」时先跑这个。默认**免费零扣费**(只读已落库的转录审计结果)。'
|
|
1163
1177
|
+ '把该集每个原声镜的视频音轨与台词做词级比对,按族给出结论:'
|
|
1164
1178
|
+ 'truncated(念到一半就停) / off_script(念的大半不是台词:自说自话、重复上一镜、只有环境音) / '
|
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.
|
|
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.
|
|
5
|
+
"version": "0.1.90",
|
|
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.90 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -6926,6 +6926,175 @@
|
|
|
6926
6926
|
}
|
|
6927
6927
|
}
|
|
6928
6928
|
},
|
|
6929
|
+
"/episodes/{episode_id}/voice-identity-scan": {
|
|
6930
|
+
"post": {
|
|
6931
|
+
"operationId": "scan_voice_consistency",
|
|
6932
|
+
"summary": "★原声剧(视频自带人声)客户报「同一个角色前后嗓音不一样 / 声线漂了」时跑这个",
|
|
6933
|
+
"description": "★原声剧(视频自带人声)客户报「同一个角色前后嗓音不一样 / 声线漂了」时跑这个。免费(本地推理,不调厂商)。对每个有台词的镜,听厂商生成的人声:台词念没念全,以及声音像不像该角色绑定的声线锚。**异步**:立即返回,后台整集约 10 分钟;同一集同时只跑一条(重复调用返回 started=false)。默认跳过已对当前视频扫过的镜,rescan=true 全部重扫。用 get_voice_consistency 查进度和逐镜结果。",
|
|
6934
|
+
"tags": [
|
|
6935
|
+
"episodes"
|
|
6936
|
+
],
|
|
6937
|
+
"parameters": [
|
|
6938
|
+
{
|
|
6939
|
+
"name": "episode_id",
|
|
6940
|
+
"in": "path",
|
|
6941
|
+
"required": true,
|
|
6942
|
+
"schema": {
|
|
6943
|
+
"type": "integer",
|
|
6944
|
+
"exclusiveMinimum": 0
|
|
6945
|
+
}
|
|
6946
|
+
}
|
|
6947
|
+
],
|
|
6948
|
+
"requestBody": {
|
|
6949
|
+
"required": false,
|
|
6950
|
+
"content": {
|
|
6951
|
+
"application/json": {
|
|
6952
|
+
"schema": {
|
|
6953
|
+
"type": "object",
|
|
6954
|
+
"properties": {
|
|
6955
|
+
"rescan": {
|
|
6956
|
+
"type": "boolean"
|
|
6957
|
+
}
|
|
6958
|
+
}
|
|
6959
|
+
}
|
|
6960
|
+
}
|
|
6961
|
+
}
|
|
6962
|
+
},
|
|
6963
|
+
"responses": {
|
|
6964
|
+
"200": {
|
|
6965
|
+
"description": "StarReel envelope",
|
|
6966
|
+
"content": {
|
|
6967
|
+
"application/json": {
|
|
6968
|
+
"schema": {
|
|
6969
|
+
"type": "object",
|
|
6970
|
+
"properties": {
|
|
6971
|
+
"code": {
|
|
6972
|
+
"type": "integer"
|
|
6973
|
+
},
|
|
6974
|
+
"message": {
|
|
6975
|
+
"type": "string"
|
|
6976
|
+
},
|
|
6977
|
+
"data": {
|
|
6978
|
+
"description": "Operation result payload"
|
|
6979
|
+
}
|
|
6980
|
+
}
|
|
6981
|
+
}
|
|
6982
|
+
}
|
|
6983
|
+
}
|
|
6984
|
+
},
|
|
6985
|
+
"402": {
|
|
6986
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
6987
|
+
}
|
|
6988
|
+
}
|
|
6989
|
+
},
|
|
6990
|
+
"get": {
|
|
6991
|
+
"operationId": "get_voice_consistency",
|
|
6992
|
+
"summary": "查声线一致性扫描的进度与逐镜结果(scan_voice_consistency 启动的)",
|
|
6993
|
+
"description": "查声线一致性扫描的进度与逐镜结果(scan_voice_consistency 启动的)。免费。summary.voice_mismatch=声音不像该角色声线锚的镜号(重点看);dialogue_issues=台词没念完/念错/多出说话声的镜;not_scanned_or_stale=还没扫或视频换过需重扫。speaker_verdict=uncertain 表示人声太短判不了,不是问题。声线不一致的镜:先用 get_pipeline_status 的 native_voice_anchor 确认角色已绑声线,再 regenerate_shot_video 重出。",
|
|
6994
|
+
"tags": [
|
|
6995
|
+
"episodes"
|
|
6996
|
+
],
|
|
6997
|
+
"parameters": [
|
|
6998
|
+
{
|
|
6999
|
+
"name": "episode_id",
|
|
7000
|
+
"in": "path",
|
|
7001
|
+
"required": true,
|
|
7002
|
+
"schema": {
|
|
7003
|
+
"type": "integer",
|
|
7004
|
+
"exclusiveMinimum": 0
|
|
7005
|
+
}
|
|
7006
|
+
}
|
|
7007
|
+
],
|
|
7008
|
+
"responses": {
|
|
7009
|
+
"200": {
|
|
7010
|
+
"description": "StarReel envelope",
|
|
7011
|
+
"content": {
|
|
7012
|
+
"application/json": {
|
|
7013
|
+
"schema": {
|
|
7014
|
+
"type": "object",
|
|
7015
|
+
"properties": {
|
|
7016
|
+
"code": {
|
|
7017
|
+
"type": "integer"
|
|
7018
|
+
},
|
|
7019
|
+
"message": {
|
|
7020
|
+
"type": "string"
|
|
7021
|
+
},
|
|
7022
|
+
"data": {
|
|
7023
|
+
"description": "Operation result payload"
|
|
7024
|
+
}
|
|
7025
|
+
}
|
|
7026
|
+
}
|
|
7027
|
+
}
|
|
7028
|
+
}
|
|
7029
|
+
},
|
|
7030
|
+
"402": {
|
|
7031
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
7032
|
+
}
|
|
7033
|
+
}
|
|
7034
|
+
}
|
|
7035
|
+
},
|
|
7036
|
+
"/episodes/{episode_id}/wardrobe-scan": {
|
|
7037
|
+
"post": {
|
|
7038
|
+
"operationId": "scan_wardrobe_consistency",
|
|
7039
|
+
"summary": "★客户报「同一个角色前后换了衣服 / 衣服颜色款式不对」时跑这个;终拼前也建议跑一次",
|
|
7040
|
+
"description": "★客户报「同一个角色前后换了衣服 / 衣服颜色款式不对」时跑这个;终拼前也建议跑一次。逐镜把采用的首帧和视频中段一帧,与本镜每个角色的设定图(没有则用定妆图)比对衣服的款式与颜色。常见成因是远景小人物被出图模型画成了别的衣服——即使参考图和提示词都对。夜景/暖光的整体偏色不算不一致。每镜一次视觉审计,**按用量计费**。返回 flagged[{shot, characters:[{name, differences}]}] / clean / errors。dry_run=true 只报告不写回;否则写回,compose_episode 的终拼预检会以 wardrobe_mismatch 列出这些镜。处置:重出该镜首帧(generate_shot_frame)再 regenerate_shot_video;重新拼接去不掉。",
|
|
7041
|
+
"tags": [
|
|
7042
|
+
"episodes"
|
|
7043
|
+
],
|
|
7044
|
+
"parameters": [
|
|
7045
|
+
{
|
|
7046
|
+
"name": "episode_id",
|
|
7047
|
+
"in": "path",
|
|
7048
|
+
"required": true,
|
|
7049
|
+
"schema": {
|
|
7050
|
+
"type": "integer",
|
|
7051
|
+
"exclusiveMinimum": 0
|
|
7052
|
+
}
|
|
7053
|
+
}
|
|
7054
|
+
],
|
|
7055
|
+
"requestBody": {
|
|
7056
|
+
"required": false,
|
|
7057
|
+
"content": {
|
|
7058
|
+
"application/json": {
|
|
7059
|
+
"schema": {
|
|
7060
|
+
"type": "object",
|
|
7061
|
+
"properties": {
|
|
7062
|
+
"dry_run": {
|
|
7063
|
+
"type": "boolean"
|
|
7064
|
+
}
|
|
7065
|
+
}
|
|
7066
|
+
}
|
|
7067
|
+
}
|
|
7068
|
+
}
|
|
7069
|
+
},
|
|
7070
|
+
"responses": {
|
|
7071
|
+
"200": {
|
|
7072
|
+
"description": "StarReel envelope",
|
|
7073
|
+
"content": {
|
|
7074
|
+
"application/json": {
|
|
7075
|
+
"schema": {
|
|
7076
|
+
"type": "object",
|
|
7077
|
+
"properties": {
|
|
7078
|
+
"code": {
|
|
7079
|
+
"type": "integer"
|
|
7080
|
+
},
|
|
7081
|
+
"message": {
|
|
7082
|
+
"type": "string"
|
|
7083
|
+
},
|
|
7084
|
+
"data": {
|
|
7085
|
+
"description": "Operation result payload"
|
|
7086
|
+
}
|
|
7087
|
+
}
|
|
7088
|
+
}
|
|
7089
|
+
}
|
|
7090
|
+
}
|
|
7091
|
+
},
|
|
7092
|
+
"402": {
|
|
7093
|
+
"description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
|
|
7094
|
+
}
|
|
7095
|
+
}
|
|
7096
|
+
}
|
|
7097
|
+
},
|
|
6929
7098
|
"/episodes/{episode_id}/wardrobe-timeline": {
|
|
6930
7099
|
"post": {
|
|
6931
7100
|
"operationId": "build_wardrobe_timeline",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.90",
|
|
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.
|
|
5
|
+
"version": "0.1.90",
|
|
6
6
|
"websiteUrl": "https://starreel.ai",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "@starreel/mcp",
|
|
11
|
-
"version": "0.1.
|
|
11
|
+
"version": "0.1.90",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|