@starreel/mcp 0.1.223 → 0.1.225
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 +6 -1
- package/dist/i18n/tools.en.json +3 -3
- package/dist/i18n/tools.zh-CN.json +3 -3
- package/dist/tools/produce.js +8 -3
- package/openapi.json +13 -5
- package/package.json +3 -4
- package/server.json +2 -2
package/SKILL.md
CHANGED
|
@@ -523,7 +523,12 @@ content that will be rejected.
|
|
|
523
523
|
shot's first frame the previous shot's last frame (free, but the shot inherits the
|
|
524
524
|
previous shot's framing); *reframe* regenerates the first frame anchored on that last
|
|
525
525
|
frame (one image per seam, keeps the shot's own framing). Tell the customer, then run
|
|
526
|
-
it without `dry_run`.
|
|
526
|
+
it without `dry_run`. Drama-wide switch: `update_project_settings` `frame_chain_mode`
|
|
527
|
+
— `off` turns all cross-shot chaining off (the automatic join after frames settle,
|
|
528
|
+
`chain_frames` and bookends; quotes stop counting them), `reframe` is the default,
|
|
529
|
+
`strict` only copies across adjacent seams (bookends still regenerate and are
|
|
530
|
+
still quoted — use `off` for no images at all). Switch back to `reframe`/`strict` before using `chain_frames`;
|
|
531
|
+
changing the mode never regenerates existing frames. **Reframes render asynchronously** — the call returns as soon as
|
|
527
532
|
they are dispatched. Before `review_frames`, watch `get_jobs` until those shots'
|
|
528
533
|
`first_frame` jobs are no longer pending/processing (a failed one carries `error_msg`;
|
|
529
534
|
re-join that seam with `chain_shot_from`), then re-check `seam_state` in
|
package/dist/i18n/tools.en.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"apply_extend_final": "Set an extension output as this episode's **final cut** (free, pure pointer switch).\n★This step **overwrites** the episode's current final cut link: the previous final cut is no longer the public version. First use get_extend_final to inspect final_url and confirm the customer is satisfied before calling.\n★If compose_episode (final assembly) is run again later, the final cut will be overwritten by the final assembly result, and applied automatically becomes false.",
|
|
89
89
|
"export_sheet_compare": "Export **character sheet comparison version** (side-by-side composite of character sheets and final cut frames, for marketing/delivery). Triggers backend compositing; poll with get_sheet_compare.\n★This capability is **off by default**: it is a drama-level switch (not every title is allowed to export this externally). When off it returns **403**. If you see 403, do not retry and do not treat it as failure—tell the customer to enable it in **Drama Settings** on the official site.\nIf character_id is omitted, export the whole episode; if provided, export only that character.",
|
|
90
90
|
"get_sheet_compare": "Poll export status for the character sheet comparison version. Free. Returns enabled (whether the drama switch is on)/processing/result/error.\n★enabled=false means the drama switch is not enabled—not an error. Enable it in Drama Settings on the official site, then export again.",
|
|
91
|
-
"update_project_settings": "Modify project settings after creating the drama. Besides aspect ratio/resolution/worldview Brief/ethnicity/genre/director style, now also covers ★whole-drama visual consistency anchors (cinematography DNA cinematography_prompt/art bible art_bible/visual lock visual_lock/video style positive and negative prompts/visual motifs motifs), audio (bgm_source own vs native/bgm_volume_preset volume/use_clip_audio use original video audio), subtitles (show_subtitles/bilingual subtitle_secondary_lang/position/margins/animation), transitions—i.e. all common settings on the project settings page. Free. ⚠️ After changing worldview Brief/ethnicity/aspect ratio/consistency anchors, already generated content will not update automatically; regenerate the corresponding content.",
|
|
91
|
+
"update_project_settings": "Modify project settings after creating the drama. Besides aspect ratio/resolution/worldview Brief/ethnicity/genre/director style, now also covers ★whole-drama visual consistency anchors (cinematography DNA cinematography_prompt/art bible art_bible/visual lock visual_lock/video style positive and negative prompts/visual motifs motifs), audio (bgm_source own vs native/bgm_volume_preset volume/use_clip_audio use original video audio), subtitles (show_subtitles/bilingual subtitle_secondary_lang/position/margins/animation), transitions—i.e. all common settings on the project settings page. Free. ⚠️ After changing worldview Brief/ethnicity/aspect ratio/consistency anchors, already generated content will not update automatically; regenerate the corresponding content. ★frame_chain_mode controls cross-shot frame chaining for the whole drama: off = none at all (the auto-chain after frames settle, chain_frames and bookends dispatch no images and change no frames, and quotes no longer include them); reframe = default; strict = adjacent seams only copy the previous shot's last frame, no regeneration (bookends already set still regenerate as reframes and are still quoted; use off for no images at all). To use chain_frames after turning it off, switch back to reframe/strict first; changing the mode does not regenerate existing frames.",
|
|
92
92
|
"generate_world_concept": "(★Default required·many third-party platforms miss this step·still uses quote confirmation) Generate worldview concept images (fixed 4 panels: panorama/era/main location/color) to improve whole-drama visual consistency. ★Call this by default after storyboard; do not skip. But still tell the customer the estimated credits (whether to run depends on execution mode: Professional mode / unconfirmed plan / this step is customer-controlled → explain to the customer and run only after customer approval; do not decide for them. This step in autopilot → do not ask the customer; follow get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Before dispatch, the platform prechecks budget by missing slots × single-image upper bound; if it exceeds the hard cap, returns 402, with no charge. Requires setting_brief ≥30 characters. Image step, fixed-cost postpaid, no arrears.",
|
|
93
93
|
"generate_art_bible": "Generate the art bible (palette/materials/atmosphere, reads characters + metadata). Text step, postpaid, no arrears.",
|
|
94
94
|
"extract_visual_lock": "Extract \"visual lock\" rules from worldview Brief + characters (writes visual_lock, unifies image style/ethnicity). Text step, postpaid, no arrears.",
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"get_bgm_status": "Check AI score generation status for an episode: running (whether generation is in progress) + list of library score tracks (track/covered shot segments/fade in/out) + cue count. Free. After score is done, re-run compose_episode to include it in the final cut.",
|
|
161
161
|
"translate_subtitles": "Translate an episode's subtitles into a second language and enable bilingual subtitles. Backend async, postpaid by usage, no arrears.",
|
|
162
162
|
"list_dramas": "List all short dramas under my account (drama_id/title/genre/episode count/progress). Free.",
|
|
163
|
-
"get_drama": "Read details of one drama (settings/character count/scene count/asset stats, etc.). Free.",
|
|
163
|
+
"get_drama": "Read details of one drama (settings/character count/scene count/asset stats, etc.). Free. frame_chain_mode = the drama-wide cross-shot frame-chain mode (off/strict/reframe; change it with update_project_settings).",
|
|
164
164
|
"get_characters": "Read the character list for one episode (names/character sheets/reference-sheet readiness). Free. Each character includes structured status: portrait_status/sheet_status (ready=stored in library/pending=generating or under audit·do not click repeatedly/rejected=image generated but rejected by consistency gate and not stored/failed/none) + on rejection: sheet_fail_reason·sheet_retryable·sheet_fail_hint (rejection verdict). ★When sheet_status=rejected, judge by retryable: consistency_rejected can be rerolled once (generate_character_sheet); **repeated rejections with nearly identical fail_hint = anchor fields conflict with character profile (structural guaranteed rejection); rerolling is pure wasted money**—first run run_precheck and check anchor-conflict warnings, remove or align character appearance pinned in visual_lock/art_bible with the profile, then reroll.",
|
|
165
165
|
"get_scenes": "Read the scene list for an episode (name/description/whether scene image is ready). Free.",
|
|
166
166
|
"get_assets": "Read all aggregated assets for a drama (characters/scenes/props/images). Free.",
|
|
@@ -212,7 +212,7 @@
|
|
|
212
212
|
"get_seam_previews": "Check progress and results of preview_seams. Free. While status=running, read progress.done/total; when status=done, each entry of result.seams[] gives: from_shot_id/to_shot_id, transition (effective transition), left/right (in/out points on the source video, src_in_ms/src_out_ms, trim already applied), preview_url (the short clip), compare_image_url (left = last frame of the outgoing shot before the transition starts, right = first frame of the incoming shot after the transition ends), audit (audit_seams conclusion; not_enabled = not enabled for this drama). A non-empty result.synth_skipped_shot_ids means those shots have no synthesized voice-over yet and the preview treats them as silent. A single-shot episode returns seam_count=0.",
|
|
213
213
|
"build_av_timing_contract": "★Run this first when an external agent assembles the cut itself, or to check why the final cut has the length it has — do not assemble by the seconds written in the storyboard. Free, zero charge (pure ffprobe + local activity detection; no vendor calls and no on-the-fly TTS synthesis). Returns the episode's A/V timing contract. Per shot: source.duration_ms (ffprobe-measured source length, not the storyboard seconds) and excess_over_declared_ms (extra tail the vendor delivered); trim.in_ms/out_ms (source in/out points used in the cut, auto head-trim and trim_shot included; untrimmed shots have full_length=true); action (effective action window and recommended trim window, reusing recommend_trim_window's activity detection); tail (freeze_pad_ms = frames the renderer clones to pad the shot, low_motion_in_cut_ms = low-motion tail still in the cut after the action ends); voice.in_final_cut (mixed_into_video = the voice is already mixed into the clip's audio, never dub it again; separate_track = separate dialogue track, dialogue_track gives its timeline interval; pending_synthesis/missing/unknown/double_voice — see instruction); timeline (start/end on the final-cut timeline, transition_in overlap, transition_out_overlap_ms, exclusive interval). The episode summary gives total duration, total transition overlap, per-track spans and tracks that run past the end of the picture. planned uses the same timeline build as compose_episode; final_cut reads the timeline the last final cut actually rendered and measures the final file (duration_check); drift_vs_planned lists shots that would change if you re-composed now. Async: this tool only starts the job; poll get_av_timing_contract until status=done. include_activity=false skips activity detection (faster, but no action window or low-motion tail).",
|
|
214
214
|
"get_av_timing_contract": "Check progress and results of build_av_timing_contract. Free. While status=running read progress (stage=build_timeline/activity/probe); when status=done, result.planned is the per-shot contract a re-compose would produce now, result.final_cut is the last final cut (contract = derived from the stored timeline, probed = measured final file, duration_check.matches = total duration agrees within 100 ms, drift_vs_planned = shots that differ; when timeline_association≠verified the stored timeline is no longer the one the final cut rendered, so contract is not provided). ★When assembling yourself, place shots by shots[].timeline and cut sources by trim.in_ms/out_ms; for voice.in_final_cut=mixed_into_video use the clip's own audio and never lay another voice on top. A non-empty result.synth_skipped_shot_ids means those shots have no synthesized voice yet (synthesized and billed at compose time), so their dialogue-track intervals are missing.",
|
|
215
|
-
"chain_frames": "Whole-episode first/last-frame relay chain: make each shot's first frame inherit the previous shot's last frame so inter-shot visuals are continuous (smoother than generating each shot independently). ★When to call: after first frames are done and any last frames required by tail_frame_plan are also filled, before review_frames / generate_videos. The platform only auto-runs this once when batch frame generation on the official site finishes; episodes generated shot by shot (generate_frames / generate_shot_frame) often have never been chained — get_storyboards seam_state=unchained means this kind of seam.\n★First use dry_run:true (free, does not write DB or generate images): returns planned_copy / planned_reframe / estimated_points / needs_last_frame. copy = directly replace this shot's first frame with the previous shot's last frame (free, but this shot's shot size becomes the same as the previous shot); reframe = use the previous shot's last frame as an anchor to regenerate this shot's first frame according to this shot's visual description (one image per seam, preserves shot size). Tell the client the plan and estimated_points; after confirmation, call again **without dry_run** to execute (postpaid by usage).\n★The platform decides which seams to chain: intentional cuts (scene/time jump/costume change/insert shot), shots with existing video, and already-chained seams are skipped — “already chained” = the first frame is the previous shot's last frame, or reframe is chained to the previous shot's **current** last frame, so repeated execution will not charge again. If the previous shot's last frame is later regenerated, that seam will reappear in the plan; that seam is indeed broken. To fill individual seams, use chain_shot_from_prev / chain_shot_from. Shots whose first frame is changed by execution and already have video will be marked pending regeneration. ★Execution only dispatches reframe and does not wait for image generation: use get_jobs to view first_frame generation rows for these shots; wait until all pending/processing are finished (for failed, check error_msg; for a single seam use chain_shot_from to reconnect; while the old first frame still exists, get_storyboards frame_status remains ready and failure is not visible), then use get_storyboards to verify seam_state and review_frames — auditing too early will audit the old first frame, and the token will be invalidated later.",
|
|
215
|
+
"chain_frames": "Whole-episode first/last-frame relay chain: make each shot's first frame inherit the previous shot's last frame so inter-shot visuals are continuous (smoother than generating each shot independently). ★When to call: after first frames are done and any last frames required by tail_frame_plan are also filled, before review_frames / generate_videos. The platform only auto-runs this once when batch frame generation on the official site finishes; episodes generated shot by shot (generate_frames / generate_shot_frame) often have never been chained — get_storyboards seam_state=unchained means this kind of seam.\n★First use dry_run:true (free, does not write DB or generate images): returns planned_copy / planned_reframe / estimated_points / needs_last_frame. copy = directly replace this shot's first frame with the previous shot's last frame (free, but this shot's shot size becomes the same as the previous shot); reframe = use the previous shot's last frame as an anchor to regenerate this shot's first frame according to this shot's visual description (one image per seam, preserves shot size). Tell the client the plan and estimated_points; after confirmation, call again **without dry_run** to execute (postpaid by usage).\n★The platform decides which seams to chain: intentional cuts (scene/time jump/costume change/insert shot), shots with existing video, and already-chained seams are skipped — “already chained” = the first frame is the previous shot's last frame, or reframe is chained to the previous shot's **current** last frame, so repeated execution will not charge again. If the previous shot's last frame is later regenerated, that seam will reappear in the plan; that seam is indeed broken. To fill individual seams, use chain_shot_from_prev / chain_shot_from. When the drama's frame_chain_mode=off the whole episode is skipped (empty plan); to chain, first switch it back to reframe/strict with update_project_settings. Shots whose first frame is changed by execution and already have video will be marked pending regeneration. ★Execution only dispatches reframe and does not wait for image generation: use get_jobs to view first_frame generation rows for these shots; wait until all pending/processing are finished (for failed, check error_msg; for a single seam use chain_shot_from to reconnect; while the old first frame still exists, get_storyboards frame_status remains ready and failure is not visible), then use get_storyboards to verify seam_state and review_frames — auditing too early will audit the old first frame, and the token will be invalidated later.",
|
|
216
216
|
"chain_shot_from_prev": "(Free) Directly set the previous shot's last frame as this shot's first frame: visuals connect 100%, zero cost, no image generation. ★Use when: the two shots are a continuation from the same camera position and same shot size (seam_state=unchained/broken and this shot should already share the previous shot's composition). ★Do not use for seams with shot-size changes (wide → close-up, etc.): it will overwrite this shot's shot-size design, and later image generation may be judged “inconsistent with design” — for such seams use chain_shot_from with mode=reframe. If this shot already has video, it will be marked pending regeneration. If this shot's first frame was uploaded by the client (first_frame_source=upload) or is client-locked (first_frame_pinned), the call is rejected (409 reason=user-locked-frame); pass force:true only to overwrite it (any execution mode requires explicit client consent, including managed mode). force releases the upload / lock protection, and the new frame needs client re-acceptance.",
|
|
217
217
|
"quote_chain_shot_from": "(Free quote) chain_shot_from with mode=reframe deducts **one image** (regenerate this shot's first frame anchored on the source frame); quote before execution (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step is customer-controlled → explain to the customer and proceed only after customer approval; do not decide for them; this step is autopiloted → do not ask the customer, execute per get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Returns quote_id / estimated_points; quote_id is one-time and valid only for this shot. mode=copy needs no quote. If this shot's first frame was uploaded by the client or is locked, no quote is issued without force (409 reason=user-locked-frame, not priced); after the client explicitly agrees to replace it, pass force:true to both the quote and the execution.",
|
|
218
218
|
"chain_shot_from": "Use the first or last frame of **any shot** in the same episode as this shot's first frame. Two modes:\n· mode=copy(default, free): directly replace this shot's first frame with the source frame, pixel-identical—good for “return to the exact same image” or continuing the same camera position.\n· mode=reframe(deducts one image, must include quote_id from quote_chain_shot_from): regenerate the first frame anchored on the source frame and based on this shot's visual description—character/clothing/prop/lighting/scene continuity, while preserving this shot's own shot size and composition. Use this when the seam must connect while shot size changes.\n★If the source is not the previous shot's last frame (bookend / return to a previous image), the platform records the seam between this shot and the previous shot as an “intentional cut”, and automatic frame chaining will no longer overwrite it. If this shot already has video it will be marked for regeneration; if its first frame was uploaded by the customer or is finalized it will be rejected (409 reason=user-locked-frame, no image dispatched, no charge)—pass force:true only when overwriting it has explicit customer approval (required in every execution mode, including autopilot). force releases the upload / finalized protection and the new frame needs customer re-acceptance; for mode=reframe the quote must also carry force.",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"apply_extend_final": "把某个续写产物**设为本集成片**(免费,纯指针切换)。\n★这一步会**覆盖**本集当前的成片链接:之前的成片不再是对外那一版。先用 get_extend_final 看 final_url、确认客户满意再调。\n★之后若重新 compose_episode(终拼),成片会被终拼结果覆盖回去,applied 自动变 false。",
|
|
93
93
|
"export_sheet_compare": "导出**设定图对照版**(角色设定图与成片画面的对照拼版,营销/交付用)。触发后台合成,用 get_sheet_compare 轮询。\n★这个能力**默认关**:它是剧集级开关(不是所有片子都允许这样对外输出),关着时回 **403**。看到 403 别重试、也别当成失败——告诉客户去官网的**剧集设置**里打开它。\n不传 character_id 就导出整集;传了只导这一个角色。",
|
|
94
94
|
"get_sheet_compare": "轮询设定图对照版的导出状态。免费。回 enabled(剧集开关是否打开)/processing/result/error。\n★enabled=false 就是那个剧集开关没开——不是出错,去官网剧集设置里打开再导。",
|
|
95
|
-
"update_project_settings": "建剧后修改项目设定。除画幅/分辨率/世界观Brief/族裔/题材/导演风格外,现覆盖★整剧视觉一致性锚(摄影DNA cinematography_prompt/美术圣经 art_bible/视觉锁定 visual_lock/视频风格正负向词/视觉母题 motifs)、音频(bgm_source 自有vs原生/bgm_volume_preset 音量/use_clip_audio 用视频原声)、字幕(show_subtitles/双语 subtitle_secondary_lang/位置/边距/动效)、转场——即项目设定页全部通用设定。免费。⚠️ 世界观 Brief
|
|
95
|
+
"update_project_settings": "建剧后修改项目设定。除画幅/分辨率/世界观Brief/族裔/题材/导演风格外,现覆盖★整剧视觉一致性锚(摄影DNA cinematography_prompt/美术圣经 art_bible/视觉锁定 visual_lock/视频风格正负向词/视觉母题 motifs)、音频(bgm_source 自有vs原生/bgm_volume_preset 音量/use_clip_audio 用视频原声)、字幕(show_subtitles/双语 subtitle_secondary_lang/位置/边距/动效)、转场——即项目设定页全部通用设定。免费。⚠️ 世界观 Brief/族裔/画幅/一致性锚等改后,已生成的内容不会自动更新,需重生对应内容。★frame_chain_mode 管整剧跨镜帧链:off=整剧不做(出帧落定后的自动衔接、chain_frames、首尾呼应都不派图不改帧,报价里也不再计入);reframe=默认;strict=相邻缝只裸拷贝上镜尾帧不重生(已设的首尾呼应仍按 reframe 重生、照常计入报价;要全不派图用 off)。关掉后想用 chain_frames 要先改回 reframe/strict;改模式不会自动重出已有帧。",
|
|
96
96
|
"generate_world_concept": "(★默认必做·很多第三方平台漏做这步·仍走报价确认)生成世界观概念图(固定4格:全景/时代/主场景/色彩),提升整剧视觉一致性。★分镜后默认调这个,别跳过;但仍要告知客户预估点数(跑不跑按执行模式:专业模式 / 未确认方案 / 本环节由客户把控 → 讲给客户、客户同意才做,别替客户决定;本环节托管 → 不问客户,照 get_production_plan 的 autopilot.default_decisions 执行,平台记进 get_autopilot_log)(派发前平台按缺槽数 × 单张上界过预算预检,超出硬上限回 402、未扣费)。需 setting_brief ≥30字。图片步,按固定成本后付、不欠费。",
|
|
97
97
|
"generate_art_bible": "生成美术圣经(色调/材质/气质,读角色+元数据)。文本步后付不欠费。",
|
|
98
98
|
"extract_visual_lock": "从世界观 Brief + 角色抽取「视觉锁定」规则(写 visual_lock,统一出图风格/族裔)。文本步后付不欠费。",
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
"get_bgm_status": "查某集 AI 配乐生成状态:running(是否在生成)+已入库的配乐轨列表(track/覆盖镜段/淡入淡出)+cue 数。免费。配乐 done 后需重新 compose_episode 才进成片。",
|
|
176
176
|
"translate_subtitles": "把某集字幕翻译成第二语言并开启双语。后台异步,按用量后付不欠费。",
|
|
177
177
|
"list_dramas": "列出我名下的所有短剧(drama_id/剧名/类型/集数/进度)。免费。",
|
|
178
|
-
"get_drama": "读一部剧的详情(设定/角色数/场景数/资产统计等)。免费。",
|
|
178
|
+
"get_drama": "读一部剧的详情(设定/角色数/场景数/资产统计等)。免费。frame_chain_mode = 整剧跨镜帧链模式(off/strict/reframe,改用 update_project_settings)。",
|
|
179
179
|
"get_characters": "读某一集的角色列表(名字/定妆图/设定图就绪状态)。免费。每角色带结构化状态:portrait_status/sheet_status(ready=已入库/pending=生成或审计中·别重复点/rejected=图已生成但被一致性闸拒收未入库/failed/none)+ 拒收时的 sheet_fail_reason·sheet_retryable·sheet_fail_hint(拒收判词)。★sheet_status=rejected 时照 retryable 判:consistency_rejected 可重掷一次(generate_character_sheet);**连拒且 fail_hint 理由几乎相同 = 锚字段与人物档案冲突(结构性必拒),重掷纯白花钱**——先 run_precheck 看 anchor-conflict 警告,把 visual_lock/art_bible 里钉死的角色外观移除或对齐档案再重掷。",
|
|
180
180
|
"get_scenes": "读某一集的场景列表(名字/描述/场景图是否就绪)。免费。",
|
|
181
181
|
"get_assets": "读一部剧的全部资产聚合(角色/场景/道具/图片)。免费。",
|
|
@@ -231,7 +231,7 @@
|
|
|
231
231
|
"get_av_timing_contract": "查 build_av_timing_contract 的进度与结果。免费。status=running 时看 progress(stage=build_timeline/activity/probe);status=done 时 result.planned 是现在重拼会得到的逐镜契约,result.final_cut 是上次成片(contract=存档时间轴推出的契约,probed=成片实测,duration_check.matches=总时长在 100ms 容差内一致,drift_vs_planned=两者不同的镜;timeline_association≠verified 时存档时间轴已不是成片用的那份,contract 不提供)。★自己拼片按 shots[].timeline 排位、按 trim.in_ms/out_ms 截源片;voice.in_final_cut=mixed_into_video 的镜直接用视频原声,绝不再叠配音。result.synth_skipped_shot_ids 非空 = 这些镜配音尚未合成(成片时现场合成扣费),对白轨区间暂缺。",
|
|
232
232
|
"audit_seam_directions": "出视频前的接缝方向对照(提示性,不拦任何步骤):对每对相邻镜拿「上一镜尾帧(没有就首帧)↔ 本镜首帧」看五件事——同一主体在画面左右跳边(视线也反了会一并写明)、运动方向反了、景别跳级(同一主体大远景↔特写)。单镜都对、拼起来跳,多半是这几维。视线单独反向、主光方向会被观察但不报:生产回放里这两维误报率太高(宁漏不扰)。与 audit_seams 互补:那个比身份/服装/道具/物体状态,不管方向和位置。★何时调:首帧(和要的尾帧)都出完、chain_frames 跑过之后,review_frames / generate_videos 之前。换场、声明跳切、插入镜、字卡黑场的接缝自动跳过。★先 dry_run(默认,免费):回待观察接缝与 estimated_points(上界)/ typical_points(通常花费),两个都告诉客户,按实际文本 token 扣费;客户同意后传 dry_run=false + confirm_usage_billing=true。执行是异步的,立即返回;过一两分钟用 get_seam_directions 读结论。已观察过且两侧帧没换的接缝不重复扣费。",
|
|
233
233
|
"get_seam_directions": "(免费)读 audit_seam_directions 的结论:issues 每条带接缝镜号、问题(主体跳边、运动反向、景别跳级)与 fixes 修复建议(chain_shot_from mode=reframe 以上一镜尾帧为锚重出本镜首帧 / update_shot 写明朝向后 generate_shot_frame / 上一镜已出视频时 align_prev_shot / split_shot 插过渡景别)。结论是提示性的:讲给客户,由客户挑要修的;有意的反打、转身、冲击剪辑可忽略。not_audited>0 = 还有接缝没观察或帧已换过;running=true = 还在跑。review_frames 的 seam_direction_advisory 是同一份结论的摘要。本工具只看出视频前的静帧;视频出完后查接缝用 preview_seams(免费短片预览)。",
|
|
234
|
-
"chain_frames": "整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)。★何时调:首帧出完、tail_frame_plan 要的尾帧也补完之后,review_frames / generate_videos 之前。平台只在官网批量出帧结束时自动跑一次;逐镜出帧(generate_frames / generate_shot_frame)的集多半从没接过——get_storyboards 的 seam_state=unchained 就是这种缝。\n★先 dry_run:true(免费,不写库不出图):回 planned_copy / planned_reframe / estimated_points / needs_last_frame。copy=本镜首帧直接换成上镜尾帧(免费,但本镜景别会变成和上镜一样);reframe=以上镜尾帧为锚按本镜画面描述重生首帧(每道一张图,保景别)。把计划和 estimated_points 告诉客户,确认后**不带 dry_run** 再调一次执行(按用量后付)。\n★平台自己判哪道缝该接:有意切换(换场/时间跳跃/换装/插入镜)、已出视频的镜、已经接好的缝都会跳过——「已接好」= 首帧就是上镜尾帧,或 reframe 接在上镜**当前**尾帧上,所以重复执行不会重复扣费。上镜尾帧后来被重生过的缝会重新出现在计划里,那道缝确实断了。只补个别缝用 chain_shot_from_prev / chain_shot_from。执行后改了首帧的镜若已有视频会被标为待重生。★执行只派发 reframe、不等出图:用 get_jobs 看这些镜的 first_frame 出图行,等 pending/processing 全部结束(failed 的看 error_msg,单道用 chain_shot_from 重接;旧首帧还在时 get_storyboards 的 frame_status 仍是 ready、看不出失败),再用 get_storyboards 核对 seam_state、review_frames——提前审会审到旧首帧,token 随后作废。",
|
|
234
|
+
"chain_frames": "整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)。★何时调:首帧出完、tail_frame_plan 要的尾帧也补完之后,review_frames / generate_videos 之前。平台只在官网批量出帧结束时自动跑一次;逐镜出帧(generate_frames / generate_shot_frame)的集多半从没接过——get_storyboards 的 seam_state=unchained 就是这种缝。\n★先 dry_run:true(免费,不写库不出图):回 planned_copy / planned_reframe / estimated_points / needs_last_frame。copy=本镜首帧直接换成上镜尾帧(免费,但本镜景别会变成和上镜一样);reframe=以上镜尾帧为锚按本镜画面描述重生首帧(每道一张图,保景别)。把计划和 estimated_points 告诉客户,确认后**不带 dry_run** 再调一次执行(按用量后付)。\n★平台自己判哪道缝该接:有意切换(换场/时间跳跃/换装/插入镜)、已出视频的镜、已经接好的缝都会跳过——「已接好」= 首帧就是上镜尾帧,或 reframe 接在上镜**当前**尾帧上,所以重复执行不会重复扣费。上镜尾帧后来被重生过的缝会重新出现在计划里,那道缝确实断了。只补个别缝用 chain_shot_from_prev / chain_shot_from。剧级 frame_chain_mode=off 时整集不接(计划为空),要接先 update_project_settings 改回 reframe/strict。执行后改了首帧的镜若已有视频会被标为待重生。★执行只派发 reframe、不等出图:用 get_jobs 看这些镜的 first_frame 出图行,等 pending/processing 全部结束(failed 的看 error_msg,单道用 chain_shot_from 重接;旧首帧还在时 get_storyboards 的 frame_status 仍是 ready、看不出失败),再用 get_storyboards 核对 seam_state、review_frames——提前审会审到旧首帧,token 随后作废。",
|
|
235
235
|
"chain_shot_from_prev": "(免费)把上一镜的尾帧**直接**设为本镜首帧:画面 100% 接上,零成本、不出图。★适用:两镜是同一机位、同一景别的延续(seam_state=unchained/broken 且本镜本来就该和上镜一个构图)。★别用于景别有变化的缝(全景→近景等):那会把本镜的景别设计冲掉,且后续出图可能被判「与设计不符」——这种缝用 chain_shot_from 的 mode=reframe。本镜已有视频的会被标为待重生。本镜首帧若是客户上传的(first_frame_source=upload)或已定稿(first_frame_pinned)会被拒(409 reason=user-locked-frame);覆盖它(任何执行模式都须客户明确同意,托管也不例外)才传 force:true(会解除上传 / 定稿保护,新图需客户重新验收)。",
|
|
236
236
|
"quote_chain_shot_from": "(免费报价)chain_shot_from 的 mode=reframe 要扣**一张图**(以源帧为锚重生本镜首帧),执行前先报价(报价确认按执行模式:专业模式 / 未确认方案 / 本环节由客户把控 → 讲给客户、客户同意才做,别替客户决定;本环节托管 → 不问客户,照 get_production_plan 的 autopilot.default_decisions 执行,平台记进 get_autopilot_log)。回 quote_id / estimated_points;quote_id 一次性、只对这一镜有效。mode=copy 不需要报价。本镜首帧是客户上传的或已定稿的:不带 force 不出报价(409 reason=user-locked-frame,不计价);客户明确同意替换后报价与执行都带 force:true。",
|
|
237
237
|
"chain_shot_from": "把同一集**任一镜**的首帧或尾帧接为本镜首帧。两种落法:\n· mode=copy(默认,免费):本镜首帧直接换成源帧,画面逐像素相同——适合「回到一模一样的画面」或同机位延续。\n· mode=reframe(扣一张图,必须带 quote_chain_shot_from 的 quote_id):以源帧为锚、按本镜画面描述重生首帧——人物/服装/道具/光线/场景延续,但保留本镜自己的景别与构图。景别有变化的缝要接,用这个。\n★源不是上一镜尾帧时(首尾呼应/回到某个画面),平台会把本镜与上一镜的缝记为「有意切换」,自动帧链不会再覆盖它。本镜已有视频的会被标为待重生;首帧是客户上传的或已定稿的会被拒(409 reason=user-locked-frame,不派图不扣费),覆盖它(任何执行模式都须客户明确同意,托管也不例外)才传 force:true(会解除上传 / 定稿保护,新图需客户重新验收;mode=reframe 的报价也要带 force)。",
|
package/dist/tools/produce.js
CHANGED
|
@@ -1325,8 +1325,12 @@ export function registerProduceTools(server, client) {
|
|
|
1325
1325
|
'(摄影DNA cinematography_prompt/美术圣经 art_bible/视觉锁定 visual_lock/视频风格正负向词/视觉母题 motifs)、' +
|
|
1326
1326
|
'音频(bgm_source 自有vs原生/bgm_volume_preset 音量/use_clip_audio 用视频原声)、' +
|
|
1327
1327
|
'字幕(show_subtitles/双语 subtitle_secondary_lang/位置/边距/动效)、转场——即项目设定页全部通用设定。免费。' +
|
|
1328
|
-
'⚠️ 世界观 Brief/族裔/画幅/一致性锚等改后,已生成的内容不会自动更新,需重生对应内容。'
|
|
1328
|
+
'⚠️ 世界观 Brief/族裔/画幅/一致性锚等改后,已生成的内容不会自动更新,需重生对应内容。' +
|
|
1329
|
+
'★frame_chain_mode 管整剧跨镜帧链:off=整剧不做(出帧落定后的自动衔接、chain_frames、首尾呼应都不派图不改帧,报价里也不再计入);' +
|
|
1330
|
+
'reframe=默认;strict=相邻缝只裸拷贝上镜尾帧不重生(已设的首尾呼应仍按 reframe 重生、照常计入报价;要全不派图用 off)。关掉后想用 chain_frames 要先改回 reframe/strict;改模式不会自动重出已有帧。', {
|
|
1329
1331
|
drama_id: z.number().int().positive(),
|
|
1332
|
+
frame_chain_mode: z.enum(['off', 'strict', 'reframe']).optional().describe('整剧跨镜帧链模式:off=整剧不做(含出帧落定后的自动衔接与 chain_frames)/strict=相邻缝只裸拷贝上镜尾帧(首尾呼应仍会重生计费)/reframe=默认。' +
|
|
1333
|
+
'关掉后想用 chain_frames 先改回 reframe 或 strict;改了不会自动重出已有帧。当前值见 get_drama 的 frame_chain_mode。'),
|
|
1330
1334
|
genre: z.string().optional(),
|
|
1331
1335
|
style: z.string().optional(),
|
|
1332
1336
|
description: z.string().optional(),
|
|
@@ -1494,7 +1498,7 @@ export function registerProduceTools(server, client) {
|
|
|
1494
1498
|
handoff_pack_id: z.string().optional(),
|
|
1495
1499
|
handoff_manifest_sha256: z.string().regex(/^[a-f0-9]{64}$/).optional(),
|
|
1496
1500
|
note: z.string().max(500).optional(),
|
|
1497
|
-
manifest: z.record(z.unknown()).optional().describe('外部后期做了什么(≤64KB),原样存进交付清单的 client 段'),
|
|
1501
|
+
manifest: z.record(z.string(), z.unknown()).optional().describe('外部后期做了什么(≤64KB),原样存进交付清单的 client 段'),
|
|
1498
1502
|
}, async ({ episode_id, file_path, file_url, note, manifest, handoff_pack_id, handoff_manifest_sha256 }) => {
|
|
1499
1503
|
const url = file_path ? await client.uploadLocalFile(file_path, 'footage') : file_url;
|
|
1500
1504
|
if (!url)
|
|
@@ -2167,7 +2171,7 @@ export function registerProduceTools(server, client) {
|
|
|
2167
2171
|
server.tool('translate_subtitles', '把某集字幕翻译成第二语言并开启双语。后台异步,按用量后付不欠费。', { episode_id: z.number().int().positive(), lang: z.string().describe('目标语言(如 en/ja/ko)') }, async ({ episode_id, lang }) => jsonResult(await client.producePost(`/episodes/${episode_id}/subtitles/translate`, { lang })));
|
|
2168
2172
|
// ========== P1 · 读取层(闭环必需:能读回自己建的东西)==========
|
|
2169
2173
|
server.tool('list_dramas', '列出我名下的所有短剧(drama_id/剧名/类型/集数/进度)。免费。', {}, async () => jsonResult(await client.produceGet('/dramas')));
|
|
2170
|
-
server.tool('get_drama', '读一部剧的详情(设定/角色数/场景数/资产统计等)。免费。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}`)));
|
|
2174
|
+
server.tool('get_drama', '读一部剧的详情(设定/角色数/场景数/资产统计等)。免费。frame_chain_mode = 整剧跨镜帧链模式(off/strict/reframe,改用 update_project_settings)。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.produceGet(`/dramas/${drama_id}`)));
|
|
2171
2175
|
server.tool('get_characters', '读某一集的角色列表(名字/定妆图/设定图就绪状态)。免费。每角色带结构化状态:' +
|
|
2172
2176
|
'portrait_status/sheet_status(ready=已入库/pending=生成或审计中·别重复点/rejected=图已生成但被' +
|
|
2173
2177
|
'一致性闸拒收未入库/failed/none)+ 拒收时的 sheet_fail_reason·sheet_retryable·sheet_fail_hint(拒收判词)。' +
|
|
@@ -2555,6 +2559,7 @@ export function registerProduceTools(server, client) {
|
|
|
2555
2559
|
'★平台自己判哪道缝该接:有意切换(换场/时间跳跃/换装/插入镜)、已出视频的镜、已经接好的缝都会跳过——' +
|
|
2556
2560
|
'「已接好」= 首帧就是上镜尾帧,或 reframe 接在上镜**当前**尾帧上,所以重复执行不会重复扣费。' +
|
|
2557
2561
|
'上镜尾帧后来被重生过的缝会重新出现在计划里,那道缝确实断了。只补个别缝用 chain_shot_from_prev / chain_shot_from。' +
|
|
2562
|
+
'剧级 frame_chain_mode=off 时整集不接(计划为空),要接先 update_project_settings 改回 reframe/strict。' +
|
|
2558
2563
|
'执行后改了首帧的镜若已有视频会被标为待重生。★执行只派发 reframe、不等出图:用 get_jobs 看这些镜的 first_frame 出图行,' +
|
|
2559
2564
|
'等 pending/processing 全部结束(failed 的看 error_msg,单道用 chain_shot_from 重接;旧首帧还在时 get_storyboards 的 frame_status 仍是 ready、看不出失败),' +
|
|
2560
2565
|
'再用 get_storyboards 核对 seam_state、review_frames——提前审会审到旧首帧,token 随后作废。', {
|
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.225",
|
|
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.225 tool surface (operationIds match MCP tool names 1:1)."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
|
9
9
|
{
|
|
@@ -1257,7 +1257,7 @@
|
|
|
1257
1257
|
"put": {
|
|
1258
1258
|
"operationId": "update_project_settings",
|
|
1259
1259
|
"summary": "建剧后修改项目设定",
|
|
1260
|
-
"description": "建剧后修改项目设定。除画幅/分辨率/世界观Brief/族裔/题材/导演风格外,现覆盖★整剧视觉一致性锚(摄影DNA cinematography_prompt/美术圣经 art_bible/视觉锁定 visual_lock/视频风格正负向词/视觉母题 motifs)、音频(bgm_source 自有vs原生/bgm_volume_preset 音量/use_clip_audio 用视频原声)、字幕(show_subtitles/双语 subtitle_secondary_lang/位置/边距/动效)、转场——即项目设定页全部通用设定。免费。⚠️ 世界观 Brief
|
|
1260
|
+
"description": "建剧后修改项目设定。除画幅/分辨率/世界观Brief/族裔/题材/导演风格外,现覆盖★整剧视觉一致性锚(摄影DNA cinematography_prompt/美术圣经 art_bible/视觉锁定 visual_lock/视频风格正负向词/视觉母题 motifs)、音频(bgm_source 自有vs原生/bgm_volume_preset 音量/use_clip_audio 用视频原声)、字幕(show_subtitles/双语 subtitle_secondary_lang/位置/边距/动效)、转场——即项目设定页全部通用设定。免费。⚠️ 世界观 Brief/族裔/画幅/一致性锚等改后,已生成的内容不会自动更新,需重生对应内容。★frame_chain_mode 管整剧跨镜帧链:off=整剧不做(出帧落定后的自动衔接、chain_frames、首尾呼应都不派图不改帧,报价里也不再计入);reframe=默认;strict=相邻缝只裸拷贝上镜尾帧不重生(已设的首尾呼应仍按 reframe 重生、照常计入报价;要全不派图用 off)。关掉后想用 chain_frames 要先改回 reframe/strict;改模式不会自动重出已有帧。",
|
|
1261
1261
|
"tags": [
|
|
1262
1262
|
"dramas"
|
|
1263
1263
|
],
|
|
@@ -1279,6 +1279,14 @@
|
|
|
1279
1279
|
"schema": {
|
|
1280
1280
|
"type": "object",
|
|
1281
1281
|
"properties": {
|
|
1282
|
+
"frame_chain_mode": {
|
|
1283
|
+
"type": "string",
|
|
1284
|
+
"enum": [
|
|
1285
|
+
"off",
|
|
1286
|
+
"strict",
|
|
1287
|
+
"reframe"
|
|
1288
|
+
]
|
|
1289
|
+
},
|
|
1282
1290
|
"genre": {
|
|
1283
1291
|
"type": "string"
|
|
1284
1292
|
},
|
|
@@ -1585,7 +1593,7 @@
|
|
|
1585
1593
|
"get": {
|
|
1586
1594
|
"operationId": "get_drama",
|
|
1587
1595
|
"summary": "读一部剧的详情(设定/角色数/场景数/资产统计等)",
|
|
1588
|
-
"description": "读一部剧的详情(设定/角色数/场景数/资产统计等)。免费。",
|
|
1596
|
+
"description": "读一部剧的详情(设定/角色数/场景数/资产统计等)。免费。frame_chain_mode = 整剧跨镜帧链模式(off/strict/reframe,改用 update_project_settings)。",
|
|
1589
1597
|
"tags": [
|
|
1590
1598
|
"dramas"
|
|
1591
1599
|
],
|
|
@@ -6005,7 +6013,7 @@
|
|
|
6005
6013
|
"post": {
|
|
6006
6014
|
"operationId": "chain_frames",
|
|
6007
6015
|
"summary": "整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)",
|
|
6008
|
-
"description": "整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)。★何时调:首帧出完、tail_frame_plan 要的尾帧也补完之后,review_frames / generate_videos 之前。平台只在官网批量出帧结束时自动跑一次;逐镜出帧(generate_frames / generate_shot_frame)的集多半从没接过——get_storyboards 的 seam_state=unchained 就是这种缝。\n★先 dry_run:true(免费,不写库不出图):回 planned_copy / planned_reframe / estimated_points / needs_last_frame。copy=本镜首帧直接换成上镜尾帧(免费,但本镜景别会变成和上镜一样);reframe=以上镜尾帧为锚按本镜画面描述重生首帧(每道一张图,保景别)。把计划和 estimated_points 告诉客户,确认后**不带 dry_run** 再调一次执行(按用量后付)。\n★平台自己判哪道缝该接:有意切换(换场/时间跳跃/换装/插入镜)、已出视频的镜、已经接好的缝都会跳过——「已接好」= 首帧就是上镜尾帧,或 reframe 接在上镜**当前**尾帧上,所以重复执行不会重复扣费。上镜尾帧后来被重生过的缝会重新出现在计划里,那道缝确实断了。只补个别缝用 chain_shot_from_prev / chain_shot_from。执行后改了首帧的镜若已有视频会被标为待重生。★执行只派发 reframe、不等出图:用 get_jobs 看这些镜的 first_frame 出图行,等 pending/processing 全部结束(failed 的看 error_msg,单道用 chain_shot_from 重接;旧首帧还在时 get_storyboards 的 frame_status 仍是 ready、看不出失败),再用 get_storyboards 核对 seam_state、review_frames——提前审会审到旧首帧,token 随后作废。",
|
|
6016
|
+
"description": "整集首尾帧接力链:让每镜首帧承接上镜尾帧,镜间画面连续(比各镜独立出帧更顺)。★何时调:首帧出完、tail_frame_plan 要的尾帧也补完之后,review_frames / generate_videos 之前。平台只在官网批量出帧结束时自动跑一次;逐镜出帧(generate_frames / generate_shot_frame)的集多半从没接过——get_storyboards 的 seam_state=unchained 就是这种缝。\n★先 dry_run:true(免费,不写库不出图):回 planned_copy / planned_reframe / estimated_points / needs_last_frame。copy=本镜首帧直接换成上镜尾帧(免费,但本镜景别会变成和上镜一样);reframe=以上镜尾帧为锚按本镜画面描述重生首帧(每道一张图,保景别)。把计划和 estimated_points 告诉客户,确认后**不带 dry_run** 再调一次执行(按用量后付)。\n★平台自己判哪道缝该接:有意切换(换场/时间跳跃/换装/插入镜)、已出视频的镜、已经接好的缝都会跳过——「已接好」= 首帧就是上镜尾帧,或 reframe 接在上镜**当前**尾帧上,所以重复执行不会重复扣费。上镜尾帧后来被重生过的缝会重新出现在计划里,那道缝确实断了。只补个别缝用 chain_shot_from_prev / chain_shot_from。剧级 frame_chain_mode=off 时整集不接(计划为空),要接先 update_project_settings 改回 reframe/strict。执行后改了首帧的镜若已有视频会被标为待重生。★执行只派发 reframe、不等出图:用 get_jobs 看这些镜的 first_frame 出图行,等 pending/processing 全部结束(failed 的看 error_msg,单道用 chain_shot_from 重接;旧首帧还在时 get_storyboards 的 frame_status 仍是 ready、看不出失败),再用 get_storyboards 核对 seam_state、review_frames——提前审会审到旧首帧,token 随后作废。",
|
|
6009
6017
|
"tags": [
|
|
6010
6018
|
"episodes"
|
|
6011
6019
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starreel/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.225",
|
|
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",
|
|
@@ -30,13 +30,12 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
33
|
-
"zod": "^
|
|
33
|
+
"zod": "^4.6.7"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "^25.5.0",
|
|
37
37
|
"tsx": "^4.19.0",
|
|
38
|
-
"typescript": "^5.7.0"
|
|
39
|
-
"zod-to-json-schema": "^3.25.2"
|
|
38
|
+
"typescript": "^5.7.0"
|
|
40
39
|
},
|
|
41
40
|
"keywords": [
|
|
42
41
|
"mcp",
|
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.225",
|
|
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.225",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|