@starreel/mcp 0.1.89 → 0.1.91

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
@@ -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
@@ -683,7 +709,11 @@ the mouth isn't readable (back turned, wide, off-screen) that is invisible; on
683
709
  sustained close-ups, regenerate instead. Reach for `regenerate_shot_video` when
684
710
  the shot is a close-up, or when the picture itself is also wrong.
685
711
  `repair_episode_dialogue` runs in the background — poll it with
686
- `get_dialogue_repair_status`.
712
+ `get_dialogue_repair_status`. If the status carries `aborted`, the batch stopped
713
+ early on an account-level failure (`credits` = out of points; `account_overdue` =
714
+ the platform's upstream vendor account, not yours) and the `remaining` shots never
715
+ ran. Resubmitting unchanged will fail the same way — top up for `credits`; for
716
+ `account_overdue`, tell the user and retry later instead of looping.
687
717
  Either way, `compose_episode` afterwards — the final cut still holds the old audio until you do.
688
718
 
689
719
  Four distinct causes; they need **opposite** fixes, so identify the family first.
@@ -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(念的大半不是台词:自说自话、重复上一镜、只有环境音) / '
@@ -1260,7 +1274,10 @@ export function registerProduceTools(server, client) {
1260
1274
  })));
1261
1275
  server.tool('get_dialogue_repair_status', '查台词修复的进度(免费)。repair_episode_dialogue 是后台异步串行跑的,用这个轮询。'
1262
1276
  + '\n★这个工具此前**不存在**,而 repair_episode_dialogue 的描述里却写着「进度用 '
1263
- + '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`)));
1277
+ + 'dialogue-repair-status 查」——第三方照着找会扑空(2026-09-21 由 MCP 覆盖闸抓出)。'
1278
+ + '\n★返回里带 **aborted** = 上一批因整账户级失败被提前中止(kind=account_overdue 平台上游账户欠费 / '
1279
+ + 'credits 点数不足),remaining 镜未执行。此时**原样重提必然同因失败**:credits 先充值;'
1280
+ + 'account_overdue 不是你的点数问题,停下告知用户稍后再试,别反复重提。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/dialogue-repair-status`)));
1264
1281
  server.tool('get_shot_name_card', '读这一镜的**人物名片**现值(免费):名字、头衔、显示位置那些。'
1265
1282
  + '\n★改之前先读一遍——set_shot_name_card 是**整体覆盖**,不读就改会把没打算动的字段清掉。', { storyboard_id: z.number().int().positive() }, async ({ storyboard_id }) => jsonResult(await client.produceGet(`/storyboards/${storyboard_id}/name-card`)));
1266
1283
  server.tool('generate_bgm', '给整集生成/更换 AI 配乐(按情绪弧线)。后台异步,按用量后付不欠费。返回情绪弧线段数与预估耗时;' +
@@ -1488,8 +1505,10 @@ export function registerProduceTools(server, client) {
1488
1505
  aspects: z.array(z.enum(['9:16', '16:9', '1:1', '4:5'])).optional().describe('目标画幅集'),
1489
1506
  }, async ({ episode_id, aspects }) => jsonResult(await client.producePost(`/episodes/${episode_id}/render-multi-aspect`, aspects ? { aspects } : {})));
1490
1507
  // ========== P2 · 口型 / 海报封面 ==========
1491
- server.tool('lipsync_shot', '给单镜做口型同步(对白与人物嘴型对齐)。按用量后付。', { storyboard_id: z.number().int().positive() }, async ({ storyboard_id }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/lipsync`)));
1492
- server.tool('lipsync_episode', '给整集批量口型同步。后台异步,按用量后付。用 get_lipsync_status 查进度。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/lipsync-batch`)));
1508
+ const LIPSYNC_UNAVAILABLE_HINT = '\n★收到 **503 code=lipsync.unavailable** = 平台当前没有可用的口型服务,本次未提交、未扣费,重试无用;' +
1509
+ '按返回的 alternatives 改走别的路(重生该镜视频 / 定向编辑 / 只换音频——最后一个不改嘴型)。';
1510
+ server.tool('lipsync_shot', '给单镜做口型同步(对白与人物嘴型对齐)。按用量后付。' + LIPSYNC_UNAVAILABLE_HINT, { storyboard_id: z.number().int().positive() }, async ({ storyboard_id }) => jsonResult(await client.producePost(`/storyboards/${storyboard_id}/lipsync`)));
1511
+ server.tool('lipsync_episode', '给整集批量口型同步。后台异步,按用量后付。用 get_lipsync_status 查进度。' + LIPSYNC_UNAVAILABLE_HINT, { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/lipsync-batch`)));
1493
1512
  server.tool('get_lipsync_status', '查整集口型同步进度。免费。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/lipsync-status`)));
1494
1513
  server.tool('generate_episode_poster', '给某一集生成海报图。图片步,按用量后付。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.producePost(`/episodes/${episode_id}/poster`)));
1495
1514
  server.tool('generate_drama_poster', '给整部剧生成海报图(KV)。图片步,按用量后付。', { drama_id: z.number().int().positive() }, async ({ drama_id }) => jsonResult(await client.producePost(`/dramas/${drama_id}/poster`)));
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.89",
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.89 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.91",
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.91 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -3543,7 +3543,7 @@
3543
3543
  "get": {
3544
3544
  "operationId": "get_dialogue_repair_status",
3545
3545
  "summary": "查台词修复的进度(免费)",
3546
- "description": "查台词修复的进度(免费)。repair_episode_dialogue 是后台异步串行跑的,用这个轮询。\n★这个工具此前**不存在**,而 repair_episode_dialogue 的描述里却写着「进度用 dialogue-repair-status 查」——第三方照着找会扑空(2026-09-21 由 MCP 覆盖闸抓出)。",
3546
+ "description": "查台词修复的进度(免费)。repair_episode_dialogue 是后台异步串行跑的,用这个轮询。\n★这个工具此前**不存在**,而 repair_episode_dialogue 的描述里却写着「进度用 dialogue-repair-status 查」——第三方照着找会扑空(2026-09-21 由 MCP 覆盖闸抓出)。\n★返回里带 **aborted** = 上一批因整账户级失败被提前中止(kind=account_overdue 平台上游账户欠费 / credits 点数不足),remaining 镜未执行。此时**原样重提必然同因失败**:credits 先充值;account_overdue 不是你的点数问题,停下告知用户稍后再试,别反复重提。",
3547
3547
  "tags": [
3548
3548
  "episodes"
3549
3549
  ],
@@ -4629,7 +4629,7 @@
4629
4629
  "post": {
4630
4630
  "operationId": "lipsync_episode",
4631
4631
  "summary": "给整集批量口型同步",
4632
- "description": "给整集批量口型同步。后台异步,按用量后付。用 get_lipsync_status 查进度。",
4632
+ "description": "给整集批量口型同步。后台异步,按用量后付。用 get_lipsync_status 查进度。\n★收到 **503 code=lipsync.unavailable** = 平台当前没有可用的口型服务,本次未提交、未扣费,重试无用;按返回的 alternatives 改走别的路(重生该镜视频 / 定向编辑 / 只换音频——最后一个不改嘴型)。",
4633
4633
  "tags": [
4634
4634
  "episodes"
4635
4635
  ],
@@ -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",
@@ -8924,7 +9093,7 @@
8924
9093
  "post": {
8925
9094
  "operationId": "lipsync_shot",
8926
9095
  "summary": "给单镜做口型同步(对白与人物嘴型对齐)",
8927
- "description": "给单镜做口型同步(对白与人物嘴型对齐)。按用量后付。",
9096
+ "description": "给单镜做口型同步(对白与人物嘴型对齐)。按用量后付。\n★收到 **503 code=lipsync.unavailable** = 平台当前没有可用的口型服务,本次未提交、未扣费,重试无用;按返回的 alternatives 改走别的路(重生该镜视频 / 定向编辑 / 只换音频——最后一个不改嘴型)。",
8928
9097
  "tags": [
8929
9098
  "storyboards"
8930
9099
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.89",
3
+ "version": "0.1.91",
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.89",
5
+ "version": "0.1.91",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.89",
11
+ "version": "0.1.91",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },