@starreel/mcp 0.1.117 → 0.1.119

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,6 +92,7 @@ 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
96
  | 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 |
96
97
  | A multi-language release | `translate_subtitles` · `subtitle_secondary_lang` in project settings | — |
97
98
 
@@ -264,7 +265,15 @@ content that will be rejected.
264
265
  "transcript"`); no voice or no usable transcript is refused. Call it with
265
266
  `preview: true` first: you get `preview_url` and the anchor text without
266
267
  anything being written, then call again without `preview` (same
267
- `start_s` / `dur_s`) to lock it.
268
+ `start_s` / `dur_s`) to lock it. Where the platform has sample hygiene
269
+ enabled the response carries `hygiene`: pauses holding only ambient sound
270
+ are cut out and the noise floor is measured before / after. `preview_url`
271
+ is then the cleaned sample and `raw_preview_url` the original — have the
272
+ customer compare both. `verdict: "fail"` means ambience or music sits under
273
+ the voice itself (cutting pauses cannot fix it; cloning and video vendors
274
+ would learn it as timbre), so the lock is refused: pick a cleaner shot or
275
+ window, and pass `allow_issues: true` only after the customer has listened
276
+ and insists.
268
277
 
269
278
  **No sample? Design one.** `design_voice` turns a one-sentence description
270
279
  (age, gender, timbre, pace, mood — say what you want, not what you don't)
@@ -77,7 +77,8 @@ export const ENTRY_POINTS = [
77
77
  customer_has: '自有的定妆图 / 场景图 / 道具图 / 镜头图(客户真实素材)',
78
78
  use: [
79
79
  'upload_image',
80
- 'set_character_portrait(须单人·单张单角度·无文字;换图后按 next_step 重出设定图,stale_frames 是要逐镜重生的镜)',
80
+ 'set_character_portrait(须单人·单张单角度·无文字;换图后按 next_step 重出设定图,stale_frames 是要逐镜重生的镜;旧图只是解除引用不删除,old_assets 逐项列出)',
81
+ 'clear_shot_frame(清掉某镜旧尾帧再重生视频,免得旧人物被尾帧带回来;解除引用不删文件,still_referenced_by 列出仍用这张图的镜)',
81
82
  'upload_scene_image(须空景无人·无叠加文字)',
82
83
  'upload_prop_sheet',
83
84
  'upload_shot_frame(只用于客户自有真实素材)',
@@ -1080,6 +1080,9 @@ export function registerProduceTools(server, client) {
1080
1080
  '★换图后响应含 stale_frames=[{storyboard_id,storyboard_number,frames}]——这些镜的首帧还是旧定妆图生成的、已被污染。' +
1081
1081
  '要让新定妆图生效:对每个 stale_frame 用 quote_shot_frame+generate_shot_frame 重生该镜(平台会自动以新定妆图/设定图/人脸锁作锚,保全片一致)。' +
1082
1082
  '不必逐镜自己指定模型/首尾帧。★千万别自制首尾帧再 upload_shot_frame——外部图没有角色身份锚/画风锚,人物·服装·画风必漂,那才是废片根源(不是"杜绝废片")。' +
1083
+ '★换图只是**解除引用**,旧定妆图/设定图的文件不会被删除。响应里的 old_assets 逐项列出被解除的旧资产:' +
1084
+ 'unlinked=[{kind,url,in_history}](in_history=false 表示平台没留记录——典型是客户上传的旧定妆图,要留就把 url 存下来),' +
1085
+ 'physically_deleted 恒为空。客户说「删掉旧图」时,如实告诉他只是不再使用、文件仍在,别说成已删除。' +
1083
1086
  '传本地文件(file_path,自动上传 COS)或已托管的图片 URL(image_url),二选一。登记免费;内容检查是一次小额视觉审核,按用量后付。', {
1084
1087
  character_id: z.number().int().positive(),
1085
1088
  file_path: z.string().optional().describe('本地定妆图路径(与 image_url 二选一;自动上传 COS)'),
@@ -1142,6 +1145,14 @@ export function registerProduceTools(server, client) {
1142
1145
  const video_url = await client.uploadLocalFile(file_path, 'footage');
1143
1146
  return jsonResult(await client.producePost(`/storyboards/${storyboard_id}/footage`, { video_url }));
1144
1147
  });
1148
+ server.tool('clear_shot_frame', '清除某镜的尾帧(解除引用,免费)。用于换了定妆图/改了剧情后,旧尾帧会把旧人物/旧画面带进重生的视频时,先清掉它再 regenerate_shot_video。' +
1149
+ '只能清尾帧:首帧是出视频的起点,要换首帧用 generate_shot_frame 重生或 upload_shot_frame 替换。' +
1150
+ '★这是解除引用,不是删除:文件不会被删,响应里 unlinked[].in_history=true 的可在 get_asset_versions 找回,physically_deleted 恒为空——如实告诉客户。' +
1151
+ '本镜已有视频会被标为过期(video_stale)。尾帧已定稿(pinned)会返回 409,客户确认后带 release_pin:true(会一并解除定稿);尾帧正在生成也会 409,等它结束再清。' +
1152
+ '响应的 still_referenced_by 列出同剧仍在用这张图的其它镜(典型:下一镜首帧是它的裸拷贝)——这些不会被连带清掉,需要的话逐镜重生。', {
1153
+ storyboard_id: z.number().int().positive(),
1154
+ release_pin: z.boolean().optional().describe('尾帧已定稿时,客户确认后传 true:清除并解除定稿'),
1155
+ }, async ({ storyboard_id, release_pin }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/frame/clear`, { frame_type: 'last_frame', ...(release_pin ? { release_pin: true } : {}) })));
1145
1156
  server.tool('clear_shot_footage', '清除某镜的实拍素材(video_url 置空、来源标记清掉),让这一镜恢复可 AI 生成视频。免费。', { storyboard_id: z.number().int().positive() }, async ({ storyboard_id }) => jsonResult(await client.produceDelete(`/storyboards/${storyboard_id}/footage`)));
1146
1157
  server.tool('upload_scene_image', '用客户自有图片作为某场景的场景图(空景基板·背景锚:同场景每一镜都锚在它上面)。自动上传+登记。' +
1147
1158
  '★★图片规范(登记前平台会自动检查,不合规返回 422 且不登记):**空景,画面里不能有任何人物**' +
@@ -1844,12 +1855,17 @@ export function registerProduceTools(server, client) {
1844
1855
  '\n★台词栏为空也能用:以实际音频为准——平台用已标定的人声探测确认所选区间里有人声,并把转写文字当锚文本;' +
1845
1856
  '探测不到人声、或转写不出可用文字就拒(锚选错会污染此后所有镜的嗓音,宁拒不猜)。响应里 text_source 标明文本来自台词还是转写。' +
1846
1857
  '\n★先 preview:true 试听:只截取并返回 preview_url 与锚文本,**不写入角色**;听着对再去掉 preview、用同样的 start_s/dur_s 正式提交。' +
1858
+ '\n★去环境音与验收(平台按剧开启时生效,响应里有 hygiene 字段):自动剔除两句之间的纯环境音停顿,并测样本底噪(noise_floor_before/after,阈值 threshold)。' +
1859
+ 'preview 时 preview_url 是**清理后**的样本、raw_preview_url 是原样本——**请让客户前后对比试听**。' +
1860
+ 'verdict=fail 表示人声下面垫着明显的环境声或音乐(剔停顿救不了,克隆和视频厂商会把它当音色学走),正式提交会被拒:' +
1861
+ '换一镜念得更干净的、或调 start_s/dur_s 避开背景声;只有客户听过后明确坚持,才带 allow_issues:true 写入。' +
1847
1862
  '\n★有客户授权的外部音源时改用 clone_voice + set_character_voice;两者二选一,后设的覆盖先设的。', {
1848
1863
  character_id: z.number().int().positive(),
1849
1864
  storyboard_id: z.number().int().positive().describe('本剧里已出视频、该角色在里面说话的镜(台词栏为空时以实际音频为准)'),
1850
1865
  start_s: z.number().min(0).optional().describe('可选:从该镜第几秒开始截'),
1851
1866
  dur_s: z.number().positive().optional().describe('可选:截多长(秒)'),
1852
1867
  preview: z.boolean().optional().describe('true=只截取试听、返回 preview_url 与锚文本,不写入角色。建议先试听再正式提交'),
1868
+ allow_issues: z.boolean().optional().describe('声线样本验收未达标(hygiene.verdict=fail)时,客户听过试听后明确坚持使用才传 true;否则不要传'),
1853
1869
  }, async ({ character_id, ...rest }) => jsonResult(await client.producePost(`/characters/${character_id}/voice-anchor-from-shot`, rest)));
1854
1870
  // ── 素材交接包:客户自己拼片的通道 ──────────────────────────────────────
1855
1871
  // 与 compose_episode 的分工:compose_episode = 「平台替你拼」;本组工具 = 「素材给你,
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.117",
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.117 tool surface (operationIds match MCP tool names 1:1)."
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)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -373,7 +373,7 @@
373
373
  "post": {
374
374
  "operationId": "set_character_portrait",
375
375
  "summary": "用客户自有图片作为角色定妆图(身份锚,优先级高于 AI 生成;之后 AI 重生默认不覆盖)",
376
- "description": "用客户自有图片作为角色定妆图(身份锚,优先级高于 AI 生成;之后 AI 重生默认不覆盖)。★★图片规范(登记前平台会自动检查,不合规返回 422 且不登记):**只有该角色一人**(不能有其他人/合影/背景路人);**单张单一角度**(不是拼图/九宫格/多视角设定图——设定图由平台据定妆图生成);正面或 3/4 侧、面部清晰无遮挡、干净背景;**图上无任何文字**(水印/字幕/名字标签/logo/衣服印字都不行,字样会被复刻进每一镜)。上传前先看一眼客户给的图,不合规就先请客户换图,别直接传。被拒时把 message 里的问题原样告诉客户;只有客户看过问题后明确坚持用这张图,才带 allow_issues:true 重传(自动检查可能误判)。★换图会失效原有派生资产(设定图/多角度头像/发型·身材参考)并重建人脸锁,但**设定图不会自动重出**——换完必须 generate_character_sheet(character_id) 据新定妆图重出设定图(响应里的 next_step 会提示),否则该角色只剩定妆图一个锚。★换图后响应含 stale_frames=[{storyboard_id,storyboard_number,frames}]——这些镜的首帧还是旧定妆图生成的、已被污染。要让新定妆图生效:对每个 stale_frame 用 quote_shot_frame+generate_shot_frame 重生该镜(平台会自动以新定妆图/设定图/人脸锁作锚,保全片一致)。不必逐镜自己指定模型/首尾帧。★千万别自制首尾帧再 upload_shot_frame——外部图没有角色身份锚/画风锚,人物·服装·画风必漂,那才是废片根源(不是\"杜绝废片\")。传本地文件(file_path,自动上传 COS)或已托管的图片 URL(image_url),二选一。登记免费;内容检查是一次小额视觉审核,按用量后付。",
376
+ "description": "用客户自有图片作为角色定妆图(身份锚,优先级高于 AI 生成;之后 AI 重生默认不覆盖)。★★图片规范(登记前平台会自动检查,不合规返回 422 且不登记):**只有该角色一人**(不能有其他人/合影/背景路人);**单张单一角度**(不是拼图/九宫格/多视角设定图——设定图由平台据定妆图生成);正面或 3/4 侧、面部清晰无遮挡、干净背景;**图上无任何文字**(水印/字幕/名字标签/logo/衣服印字都不行,字样会被复刻进每一镜)。上传前先看一眼客户给的图,不合规就先请客户换图,别直接传。被拒时把 message 里的问题原样告诉客户;只有客户看过问题后明确坚持用这张图,才带 allow_issues:true 重传(自动检查可能误判)。★换图会失效原有派生资产(设定图/多角度头像/发型·身材参考)并重建人脸锁,但**设定图不会自动重出**——换完必须 generate_character_sheet(character_id) 据新定妆图重出设定图(响应里的 next_step 会提示),否则该角色只剩定妆图一个锚。★换图后响应含 stale_frames=[{storyboard_id,storyboard_number,frames}]——这些镜的首帧还是旧定妆图生成的、已被污染。要让新定妆图生效:对每个 stale_frame 用 quote_shot_frame+generate_shot_frame 重生该镜(平台会自动以新定妆图/设定图/人脸锁作锚,保全片一致)。不必逐镜自己指定模型/首尾帧。★千万别自制首尾帧再 upload_shot_frame——外部图没有角色身份锚/画风锚,人物·服装·画风必漂,那才是废片根源(不是\"杜绝废片\")。★换图只是**解除引用**,旧定妆图/设定图的文件不会被删除。响应里的 old_assets 逐项列出被解除的旧资产:unlinked=[{kind,url,in_history}](in_history=false 表示平台没留记录——典型是客户上传的旧定妆图,要留就把 url 存下来),physically_deleted 恒为空。客户说「删掉旧图」时,如实告诉他只是不再使用、文件仍在,别说成已删除。传本地文件(file_path,自动上传 COS)或已托管的图片 URL(image_url),二选一。登记免费;内容检查是一次小额视觉审核,按用量后付。",
377
377
  "tags": [
378
378
  "characters"
379
379
  ],
@@ -567,7 +567,7 @@
567
567
  "post": {
568
568
  "operationId": "set_voice_anchor_from_shot",
569
569
  "summary": "从本剧某一镜选定角色的声线(声音基准)",
570
- "description": "从本剧某一镜选定角色的声线(声音基准)。免费。不需要客户提供外部音源——就用片子里这个角色已经念出来的声音。\n★★【原声剧(use_clip_audio=true,默认)里这就是「锁声线」】选定后,之后生成的视频会把这段声音交给视频厂商当参考音频,同一角色前后镜的嗓音跟它走;不锁的话每镜由厂商各自采样,前后镜声线会漂。\n★选哪一镜:该角色**独自说话、台词较长、没有背景音乐和别人插话**的镜;start_s/dur_s 可只截其中一段(不传则取默认窗口,时长会按各引擎上限自动钳制)。\n★只对**之后**生成的视频生效。锁之前已经出好的镜会出现在 get_pipeline_status 的 native_voice_anchor.stale_shots 里,用 regenerate_shot_video 重出才会统一。所以最省的做法是:每个说话角色先出一镜、选定声线,再批量出其余镜。\n★台词栏为空也能用:以实际音频为准——平台用已标定的人声探测确认所选区间里有人声,并把转写文字当锚文本;探测不到人声、或转写不出可用文字就拒(锚选错会污染此后所有镜的嗓音,宁拒不猜)。响应里 text_source 标明文本来自台词还是转写。\n★先 preview:true 试听:只截取并返回 preview_url 与锚文本,**不写入角色**;听着对再去掉 preview、用同样的 start_s/dur_s 正式提交。\n★有客户授权的外部音源时改用 clone_voice + set_character_voice;两者二选一,后设的覆盖先设的。",
570
+ "description": "从本剧某一镜选定角色的声线(声音基准)。免费。不需要客户提供外部音源——就用片子里这个角色已经念出来的声音。\n★★【原声剧(use_clip_audio=true,默认)里这就是「锁声线」】选定后,之后生成的视频会把这段声音交给视频厂商当参考音频,同一角色前后镜的嗓音跟它走;不锁的话每镜由厂商各自采样,前后镜声线会漂。\n★选哪一镜:该角色**独自说话、台词较长、没有背景音乐和别人插话**的镜;start_s/dur_s 可只截其中一段(不传则取默认窗口,时长会按各引擎上限自动钳制)。\n★只对**之后**生成的视频生效。锁之前已经出好的镜会出现在 get_pipeline_status 的 native_voice_anchor.stale_shots 里,用 regenerate_shot_video 重出才会统一。所以最省的做法是:每个说话角色先出一镜、选定声线,再批量出其余镜。\n★台词栏为空也能用:以实际音频为准——平台用已标定的人声探测确认所选区间里有人声,并把转写文字当锚文本;探测不到人声、或转写不出可用文字就拒(锚选错会污染此后所有镜的嗓音,宁拒不猜)。响应里 text_source 标明文本来自台词还是转写。\n★先 preview:true 试听:只截取并返回 preview_url 与锚文本,**不写入角色**;听着对再去掉 preview、用同样的 start_s/dur_s 正式提交。\n★去环境音与验收(平台按剧开启时生效,响应里有 hygiene 字段):自动剔除两句之间的纯环境音停顿,并测样本底噪(noise_floor_before/after,阈值 threshold)。preview 时 preview_url 是**清理后**的样本、raw_preview_url 是原样本——**请让客户前后对比试听**。verdict=fail 表示人声下面垫着明显的环境声或音乐(剔停顿救不了,克隆和视频厂商会把它当音色学走),正式提交会被拒:换一镜念得更干净的、或调 start_s/dur_s 避开背景声;只有客户听过后明确坚持,才带 allow_issues:true 写入。\n★有客户授权的外部音源时改用 clone_voice + set_character_voice;两者二选一,后设的覆盖先设的。",
571
571
  "tags": [
572
572
  "characters"
573
573
  ],
@@ -604,6 +604,9 @@
604
604
  },
605
605
  "preview": {
606
606
  "type": "boolean"
607
+ },
608
+ "allow_issues": {
609
+ "type": "boolean"
607
610
  }
608
611
  },
609
612
  "required": [
@@ -10421,6 +10424,72 @@
10421
10424
  }
10422
10425
  }
10423
10426
  },
10427
+ "/storyboards/{storyboard_id}/frame/clear": {
10428
+ "post": {
10429
+ "operationId": "clear_shot_frame",
10430
+ "summary": "清除某镜的尾帧(解除引用,免费)",
10431
+ "description": "清除某镜的尾帧(解除引用,免费)。用于换了定妆图/改了剧情后,旧尾帧会把旧人物/旧画面带进重生的视频时,先清掉它再 regenerate_shot_video。只能清尾帧:首帧是出视频的起点,要换首帧用 generate_shot_frame 重生或 upload_shot_frame 替换。★这是解除引用,不是删除:文件不会被删,响应里 unlinked[].in_history=true 的可在 get_asset_versions 找回,physically_deleted 恒为空——如实告诉客户。本镜已有视频会被标为过期(video_stale)。尾帧已定稿(pinned)会返回 409,客户确认后带 release_pin:true(会一并解除定稿);尾帧正在生成也会 409,等它结束再清。响应的 still_referenced_by 列出同剧仍在用这张图的其它镜(典型:下一镜首帧是它的裸拷贝)——这些不会被连带清掉,需要的话逐镜重生。",
10432
+ "tags": [
10433
+ "storyboards"
10434
+ ],
10435
+ "parameters": [
10436
+ {
10437
+ "name": "storyboard_id",
10438
+ "in": "path",
10439
+ "required": true,
10440
+ "schema": {
10441
+ "type": "integer",
10442
+ "exclusiveMinimum": 0
10443
+ }
10444
+ }
10445
+ ],
10446
+ "requestBody": {
10447
+ "required": false,
10448
+ "content": {
10449
+ "application/json": {
10450
+ "schema": {
10451
+ "type": "object",
10452
+ "properties": {
10453
+ "frame_type": {
10454
+ "type": "string",
10455
+ "description": "(assembled by the client from tool args — see tool 'clear_shot_frame')"
10456
+ },
10457
+ "release_pin": {
10458
+ "type": "boolean"
10459
+ }
10460
+ }
10461
+ }
10462
+ }
10463
+ }
10464
+ },
10465
+ "responses": {
10466
+ "200": {
10467
+ "description": "StarReel envelope",
10468
+ "content": {
10469
+ "application/json": {
10470
+ "schema": {
10471
+ "type": "object",
10472
+ "properties": {
10473
+ "code": {
10474
+ "type": "integer"
10475
+ },
10476
+ "message": {
10477
+ "type": "string"
10478
+ },
10479
+ "data": {
10480
+ "description": "Operation result payload"
10481
+ }
10482
+ }
10483
+ }
10484
+ }
10485
+ }
10486
+ },
10487
+ "402": {
10488
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
10489
+ }
10490
+ }
10491
+ }
10492
+ },
10424
10493
  "/storyboards/{storyboard_id}/frame/generate": {
10425
10494
  "post": {
10426
10495
  "operationId": "generate_shot_frame",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.117",
3
+ "version": "0.1.119",
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.117",
5
+ "version": "0.1.119",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.117",
11
+ "version": "0.1.119",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },