@vibeframe/mcp-server 0.110.0 → 0.111.1

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.
Files changed (3) hide show
  1. package/README.md +17 -0
  2. package/dist/index.js +251 -23
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -323,6 +323,23 @@ API keys are read from the host's environment (`~/.zshrc`, MCP config `env` bloc
323
323
  - Node.js 20+
324
324
  - FFmpeg on `PATH` (export, editing, pipelines)
325
325
 
326
+ ## Privacy Policy
327
+
328
+ VibeFrame is local-first: no telemetry, no VibeFrame-operated servers in the
329
+ data path. Projects and generated media stay in the workspace folder you
330
+ choose; content is sent only to the AI providers you configure (Anthropic,
331
+ OpenAI, Google, ElevenLabs, …) when you explicitly invoke them, and API keys
332
+ live only on your machine. Tools that reach external services are marked with
333
+ `openWorldHint` in their MCP annotations; everything else (timeline edits,
334
+ ffmpeg operations, linting, rendering, local Kokoro TTS) runs fully locally.
335
+
336
+ Full policy: <https://vibeframe.ai/privacy> (source:
337
+ [PRIVACY.md](https://github.com/vericontext/vibeframe/blob/main/PRIVACY.md)).
338
+
339
+ > Installing the `.mcpb` file directly shows a standard "not verified by
340
+ > Anthropic" sideload notice in Claude Desktop — that is expected for
341
+ > extensions distributed outside the official directory.
342
+
326
343
  ## License
327
344
 
328
345
  MIT
package/dist/index.js CHANGED
@@ -34586,7 +34586,7 @@ var require_source_map = __commonJS({
34586
34586
  var require_previous_map = __commonJS({
34587
34587
  "../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/previous-map.js"(exports, module) {
34588
34588
  "use strict";
34589
- var { existsSync: existsSync65, readFileSync: readFileSync12 } = __require("fs");
34589
+ var { existsSync: existsSync66, readFileSync: readFileSync12 } = __require("fs");
34590
34590
  var { dirname: dirname33, join: join44 } = __require("path");
34591
34591
  var { SourceMapConsumer, SourceMapGenerator } = require_source_map();
34592
34592
  function fromBase64(str2) {
@@ -34649,7 +34649,7 @@ var require_previous_map = __commonJS({
34649
34649
  }
34650
34650
  loadFile(path14) {
34651
34651
  this.root = dirname33(path14);
34652
- if (existsSync65(path14)) {
34652
+ if (existsSync66(path14)) {
34653
34653
  this.mapFile = path14;
34654
34654
  return readFileSync12(path14, "utf-8").toString().trim();
34655
34655
  }
@@ -39915,8 +39915,8 @@ var require_common2 = __commonJS({
39915
39915
  }
39916
39916
  return debug9;
39917
39917
  }
39918
- function extend(namespace, delimiter) {
39919
- const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace);
39918
+ function extend(namespace, delimiter2) {
39919
+ const newDebug = createDebug(this.namespace + (typeof delimiter2 === "undefined" ? ":" : delimiter2) + namespace);
39920
39920
  newDebug.log = this.log;
39921
39921
  return newDebug;
39922
39922
  }
@@ -90548,10 +90548,10 @@ var require_parseListMLSD = __commonJS({
90548
90548
  // available on the server's operating system." The parser by Apache Commons tries to translate these
90549
90549
  // to Unix permissions – this is misleading users and might not even be correct.
90550
90550
  };
90551
- function splitStringOnce(str2, delimiter) {
90552
- const pos = str2.indexOf(delimiter);
90551
+ function splitStringOnce(str2, delimiter2) {
90552
+ const pos = str2.indexOf(delimiter2);
90553
90553
  const a2 = str2.substr(0, pos);
90554
- const b2 = str2.substr(pos + delimiter.length);
90554
+ const b2 = str2.substr(pos + delimiter2.length);
90555
90555
  return [a2, b2];
90556
90556
  }
90557
90557
  function testLine(line) {
@@ -359330,8 +359330,8 @@ var init_dist2 = __esm({
359330
359330
  }
359331
359331
  return debug62;
359332
359332
  }
359333
- function extend(namespace, delimiter) {
359334
- const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace);
359333
+ function extend(namespace, delimiter2) {
359334
+ const newDebug = createDebug(this.namespace + (typeof delimiter2 === "undefined" ? ":" : delimiter2) + namespace);
359335
359335
  newDebug.log = this.log;
359336
359336
  return newDebug;
359337
359337
  }
@@ -407094,10 +407094,10 @@ Closing reason: ${this._closingError.stack}`;
407094
407094
  // available on the server's operating system." The parser by Apache Commons tries to translate these
407095
407095
  // to Unix permissions – this is misleading users and might not even be correct.
407096
407096
  };
407097
- function splitStringOnce(str2, delimiter) {
407098
- const pos = str2.indexOf(delimiter);
407097
+ function splitStringOnce(str2, delimiter2) {
407098
+ const pos = str2.indexOf(delimiter2);
407099
407099
  const a2 = str2.substr(0, pos);
407100
- const b2 = str2.substr(pos + delimiter.length);
407100
+ const b2 = str2.substr(pos + delimiter2.length);
407101
407101
  return [a2, b2];
407102
407102
  }
407103
407103
  function testLine(line) {
@@ -458340,10 +458340,10 @@ async function* iterSSEChunks(iterator3) {
458340
458340
  yield data;
458341
458341
  }
458342
458342
  }
458343
- function partition(str2, delimiter) {
458344
- const index = str2.indexOf(delimiter);
458343
+ function partition(str2, delimiter2) {
458344
+ const index = str2.indexOf(delimiter2);
458345
458345
  if (index !== -1) {
458346
- return [str2.substring(0, index), delimiter, str2.substring(index + delimiter.length)];
458346
+ return [str2.substring(0, index), delimiter2, str2.substring(index + delimiter2.length)];
458347
458347
  }
458348
458348
  return [str2, "", ""];
458349
458349
  }
@@ -462204,10 +462204,10 @@ async function* iterSSEChunks2(iterator3) {
462204
462204
  yield data;
462205
462205
  }
462206
462206
  }
462207
- function partition2(str2, delimiter) {
462208
- const index = str2.indexOf(delimiter);
462207
+ function partition2(str2, delimiter2) {
462208
+ const index = str2.indexOf(delimiter2);
462209
462209
  if (index !== -1) {
462210
- return [str2.substring(0, index), delimiter, str2.substring(index + delimiter.length)];
462210
+ return [str2.substring(0, index), delimiter2, str2.substring(index + delimiter2.length)];
462211
462211
  }
462212
462212
  return [str2, "", ""];
462213
462213
  }
@@ -488359,6 +488359,8 @@ var sceneStylesTool = defineTool({
488359
488359
  name: "scene_list_styles",
488360
488360
  category: "scene",
488361
488361
  cost: "free",
488362
+ title: "List Visual Styles",
488363
+ annotations: { readOnly: true, openWorld: false },
488362
488364
  description: "List the 8 vendored visual identities available for `init --visual-style` (Swiss Pulse, Data Drift, \u2026) or, when `name` is provided, return the full DESIGN.md hard-gate body for one style. The DESIGN.md content is what the LLM uses as a non-negotiable visual rulebook during compose-scenes-with-skills.",
488363
488365
  schema: sceneStylesSchema,
488364
488366
  async execute(args) {
@@ -488420,6 +488422,8 @@ var sceneInitTool = defineTool({
488420
488422
  name: "init",
488421
488423
  category: "scene",
488422
488424
  cost: "free",
488425
+ title: "Initialize Video Project",
488426
+ annotations: { readOnly: false, destructive: false, idempotent: true, openWorld: false },
488423
488427
  description: "Scaffold a new VibeFrame video scene project. Supports minimal, agent, and full profiles; full includes the current HTML render backend metadata. Idempotent: re-running keeps user-authored files and merges backend config instead of overwriting. No API keys required.",
488424
488428
  schema: sceneInitSchema,
488425
488429
  async execute(args, ctx) {
@@ -488470,6 +488474,8 @@ var sceneAddTool = defineTool({
488470
488474
  name: "scene_add",
488471
488475
  category: "scene",
488472
488476
  cost: "low",
488477
+ title: "Add Scene from Preset",
488478
+ annotations: { readOnly: false, openWorld: true },
488473
488479
  description: "Add a single scene to an existing scene project. Optionally generates narration audio (ElevenLabs) and/or a backdrop image (Gemini/OpenAI), then emits compositions/scene-<id>.html with a paused GSAP timeline and splices a clip reference into the root index.html. Use skipAudio:true and skipImage:true for text-only scenes that need no API calls.",
488474
488480
  schema: sceneAddSchema,
488475
488481
  async execute(args, ctx) {
@@ -488548,6 +488554,8 @@ var sceneLintTool = defineTool({
488548
488554
  name: "scene_lint",
488549
488555
  category: "scene",
488550
488556
  cost: "free",
488557
+ title: "Lint Scene Compositions",
488558
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
488551
488559
  description: "Validate every scene file in a project against the public Hyperframes lint rules (in-process, no Chrome required). Returns errors, warnings, and info findings per file. Optional fix:true mechanically repairs `timed_element_missing_clip_class` only \u2014 other issues surface with fixHints.",
488552
488560
  schema: sceneLintSchema,
488553
488561
  async execute(args, ctx) {
@@ -488585,6 +488593,8 @@ var sceneRepairTool = defineTool({
488585
488593
  name: "scene_repair",
488586
488594
  category: "scene",
488587
488595
  cost: "free",
488596
+ title: "Repair Scene Compositions",
488597
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
488588
488598
  description: "Apply deterministic mechanical scene repairs. Currently uses the safe lint auto-fix allow-list and never performs semantic creative rewrites.",
488589
488599
  schema: sceneRepairSchema,
488590
488600
  async execute(args, ctx) {
@@ -488665,6 +488675,8 @@ var sceneRenderTool = defineTool({
488665
488675
  name: "render",
488666
488676
  category: "scene",
488667
488677
  cost: "free",
488678
+ title: "Render Video to MP4",
488679
+ annotations: { readOnly: false, openWorld: false },
488668
488680
  description: "Render a scene project to MP4/WebM/MOV via the Hyperframes producer. Requires Chrome installed locally. Output defaults to renders/<projectName>-<isoStamp>.<format>. Long runs: over MCP, calls exceeding ~45s return immediately with { promoted: true, jobId, status: 'running' } \u2014 poll status_job every 15-30s until completed/failed instead of re-invoking render. Emits MCP progress notifications when the client supplies a progressToken.",
488669
488681
  schema: sceneRenderSchema,
488670
488682
  async execute(args, ctx) {
@@ -488794,6 +488806,8 @@ var sceneBuildTool = defineTool({
488794
488806
  name: "build",
488795
488807
  category: "scene",
488796
488808
  cost: "high",
488809
+ title: "Build Video from Storyboard",
488810
+ annotations: { readOnly: false, openWorld: true },
488797
488811
  description: "v0.60 one-shot orchestrator: read STORYBOARD.md per-beat YAML cues (narration / backdrop / duration), dispatch TTS + image generation per beat, compose scene HTML via the compose-scenes-with-skills pipeline, then render to MP4. Use this instead of chaining init + scene_add + render manually. Caches by SHA256 of (DESIGN.md + cue body) so re-runs are idempotent and cheap. Long runs: over MCP, calls exceeding ~45s return immediately with { promoted: true, jobId, status: 'running' } \u2014 poll status_job every 15-30s until completed/failed instead of re-invoking build. Emits MCP progress notifications when the client supplies a progressToken. When the MCP host supports elicitation, unspecified asset choices (narration provider, backdrop images, cost cap) are confirmed with the user via a form before the build starts.",
488798
488812
  schema: sceneBuildSchema,
488799
488813
  async execute(args, ctx) {
@@ -488876,6 +488890,8 @@ var sceneInstallSkillTool = defineTool({
488876
488890
  name: "scene_install_skill",
488877
488891
  category: "scene",
488878
488892
  cost: "free",
488893
+ title: "Install Hyperframes Skill",
488894
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
488879
488895
  description: "Install the vendored Hyperframes skill bundle into a scene project so the host agent (Claude Code, Cursor, Codex, Aider) can read framework rules + house style directly. Writes a universal SKILL.md + references/ at the project root, plus per-host layouts (.claude/skills/hyperframes/ for Claude Code, .cursor/rules/hyperframes.mdc for Cursor) when those hosts are detected. Phase H1 of the agentic-native composer plan \u2014 once installed, the host agent itself can author scene HTML using the rules instead of relying on vibe's internal LLM call.",
488880
488896
  schema: sceneInstallSkillSchema,
488881
488897
  async execute(args, ctx) {
@@ -488922,6 +488938,8 @@ var sceneComposePromptsTool = defineTool({
488922
488938
  name: "scene_compose_prompts",
488923
488939
  category: "scene",
488924
488940
  cost: "free",
488941
+ title: "Get Scene Authoring Prompts",
488942
+ annotations: { readOnly: true, openWorld: false },
488925
488943
  description: "Emit the per-beat compose plan for the host agent to author scene HTML itself. Reads STORYBOARD.md + DESIGN.md and returns each beat's outputPath + userPrompt + cues + body, plus references to the project's SKILL.md (Hyperframes rules) and DESIGN.md (visual identity). The host agent writes each compositions/scene-<id>.html file directly \u2014 VibeFrame makes NO LLM call here. Hosts that cannot write files (e.g. Claude Desktop) submit each authored beat with scene_submit instead. Pairs with scene_install_skill (Phase H1). Phase H2 of the agentic-native composer plan; the internal-LLM batch path (build) remains as a fallback for non-agent contexts.",
488926
488944
  schema: sceneComposePromptsSchema,
488927
488945
  async execute(args, ctx) {
@@ -488964,6 +488982,8 @@ var sceneSubmitTool = defineTool({
488964
488982
  name: "scene_submit",
488965
488983
  category: "scene",
488966
488984
  cost: "free",
488985
+ title: "Submit Scene HTML",
488986
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
488967
488987
  description: "Submit host-authored Hyperframes scene HTML for one beat. Validates with the same lint as the batch composer and writes compositions/scene-<id>.html on pass; on lint errors it returns the findings WITHOUT writing so you can fix and resubmit. This completes agent-mode compose for hosts that cannot write files (e.g. Claude Desktop): build (mode agent) \u2192 needs-author plan \u2192 author each beat from its composePrompts userPrompt \u2192 scene_submit per beat \u2192 build (stage sync) \u2192 render. No internal LLM call \u2014 the submitting agent is the composer.",
488968
488988
  schema: sceneSubmitSchema,
488969
488989
  async execute(args, ctx) {
@@ -489006,6 +489026,8 @@ var audioTranscribeTool = defineTool({
489006
489026
  name: "audio_transcribe",
489007
489027
  category: "audio",
489008
489028
  cost: "low",
489029
+ title: "Transcribe Audio",
489030
+ annotations: { readOnly: false, openWorld: true },
489009
489031
  description: "Transcribe audio using OpenAI Whisper. Outputs text, SRT, or VTT. Requires OPENAI_API_KEY.",
489010
489032
  schema: z3.object({
489011
489033
  audioPath: z3.string().describe("Input audio file path"),
@@ -489035,6 +489057,8 @@ var audioIsolateTool = defineTool({
489035
489057
  name: "audio_isolate",
489036
489058
  category: "audio",
489037
489059
  cost: "low",
489060
+ title: "Isolate Vocals from Audio",
489061
+ annotations: { readOnly: false, openWorld: true },
489038
489062
  description: "Isolate vocals from audio using ElevenLabs. Requires ELEVENLABS_API_KEY.",
489039
489063
  schema: z3.object({
489040
489064
  audioPath: z3.string().describe("Input audio file path"),
@@ -489054,6 +489078,8 @@ var audioVoiceCloneTool = defineTool({
489054
489078
  name: "audio_clone_voice",
489055
489079
  category: "audio",
489056
489080
  cost: "low",
489081
+ title: "Clone Voice from Samples",
489082
+ annotations: { readOnly: false, destructive: false, openWorld: true },
489057
489083
  description: "Clone a voice from audio samples using ElevenLabs. Requires ELEVENLABS_API_KEY.",
489058
489084
  schema: z3.object({
489059
489085
  samplePaths: z3.array(z3.string()).describe("Audio sample file paths (1-25 files)"),
@@ -489075,6 +489101,8 @@ var audioDubTool = defineTool({
489075
489101
  name: "audio_dub",
489076
489102
  category: "audio",
489077
489103
  cost: "high",
489104
+ title: "Dub Audio to Another Language",
489105
+ annotations: { readOnly: false, openWorld: true },
489078
489106
  description: "Dub audio/video to another language (transcribe + translate + TTS). Requires OPENAI_API_KEY, ANTHROPIC_API_KEY, ELEVENLABS_API_KEY.",
489079
489107
  schema: z3.object({
489080
489108
  mediaPath: z3.string().describe("Input media file (video or audio)"),
@@ -489105,6 +489133,8 @@ var audioDuckTool = defineTool({
489105
489133
  name: "audio_duck",
489106
489134
  category: "audio",
489107
489135
  cost: "free",
489136
+ title: "Duck Background Music",
489137
+ annotations: { readOnly: false, openWorld: false },
489108
489138
  description: "Auto-duck background music when voice is present using FFmpeg sidechain compression. Free, no API key needed.",
489109
489139
  schema: z3.object({
489110
489140
  musicPath: z3.string().describe("Background music file path"),
@@ -489402,6 +489432,8 @@ var editSilenceCutTool = defineTool({
489402
489432
  name: "edit_silence_cut",
489403
489433
  category: "edit",
489404
489434
  cost: "free",
489435
+ title: "Cut Silence from Video",
489436
+ annotations: { readOnly: false, openWorld: true },
489405
489437
  description: "Remove silent segments from a video using FFmpeg or Gemini AI detection. No API key needed for FFmpeg mode.",
489406
489438
  schema: z4.object({
489407
489439
  videoPath: z4.string().describe("Path to the input video file"),
@@ -489432,6 +489464,8 @@ var editCaptionTool = defineTool({
489432
489464
  name: "edit_caption",
489433
489465
  category: "edit",
489434
489466
  cost: "low",
489467
+ title: "Burn Captions into Video",
489468
+ annotations: { readOnly: false, openWorld: true },
489435
489469
  description: "Transcribe audio and burn styled captions into video. Requires OPENAI_API_KEY for Whisper transcription.",
489436
489470
  schema: z4.object({
489437
489471
  videoPath: z4.string().describe("Path to the input video file"),
@@ -489456,6 +489490,8 @@ var editFadeTool = defineTool({
489456
489490
  name: "edit_fade",
489457
489491
  category: "edit",
489458
489492
  cost: "free",
489493
+ title: "Apply Fade Effects",
489494
+ annotations: { readOnly: false, openWorld: false },
489459
489495
  description: "Apply fade in/out effects to video and/or audio. No API key needed.",
489460
489496
  schema: z4.object({
489461
489497
  videoPath: z4.string().describe("Path to the input video file"),
@@ -489479,6 +489515,8 @@ var editNoiseReduceTool = defineTool({
489479
489515
  name: "edit_noise_reduce",
489480
489516
  category: "edit",
489481
489517
  cost: "free",
489518
+ title: "Reduce Audio Noise",
489519
+ annotations: { readOnly: false, openWorld: false },
489482
489520
  description: "Reduce audio/video noise using FFmpeg filters. No API key needed.",
489483
489521
  schema: z4.object({
489484
489522
  inputPath: z4.string().describe("Path to the input media file"),
@@ -489500,6 +489538,8 @@ var editJumpCutTool = defineTool({
489500
489538
  name: "edit_jump_cut",
489501
489539
  category: "edit",
489502
489540
  cost: "low",
489541
+ title: "Remove Filler Words",
489542
+ annotations: { readOnly: false, openWorld: true },
489503
489543
  description: "Remove filler words (um, uh, like, etc.) from video using Whisper transcription. Requires OPENAI_API_KEY.",
489504
489544
  schema: z4.object({
489505
489545
  videoPath: z4.string().describe("Path to the input video file"),
@@ -489523,6 +489563,8 @@ var editTextOverlayTool = defineTool({
489523
489563
  name: "edit_text_overlay",
489524
489564
  category: "edit",
489525
489565
  cost: "free",
489566
+ title: "Overlay Static Text",
489567
+ annotations: { readOnly: false, openWorld: false },
489526
489568
  description: "Apply simple static text burn-in on video using FFmpeg drawtext. No API key needed. For designed or animated overlays, use edit_motion_overlay.",
489527
489569
  schema: z4.object({
489528
489570
  videoPath: z4.string().describe("Path to the input video file"),
@@ -489549,6 +489591,8 @@ var editMotionOverlayTool = defineTool({
489549
489591
  name: "edit_motion_overlay",
489550
489592
  category: "edit",
489551
489593
  cost: "low",
489594
+ title: "Apply Motion Graphics Overlay",
489595
+ annotations: { readOnly: false, openWorld: true },
489552
489596
  description: "Apply designed motion graphics overlays to an existing video. Generates Remotion overlays from a prompt, or overlays a user-provided .json/.lottie animation via the Hyperframes renderer.",
489553
489597
  schema: z4.object({
489554
489598
  videoPath: z4.string().describe("Path to the input video file"),
@@ -489585,6 +489629,8 @@ var editTranslateSrtTool = defineTool({
489585
489629
  name: "edit_translate_srt",
489586
489630
  category: "edit",
489587
489631
  cost: "low",
489632
+ title: "Translate SRT Subtitles",
489633
+ annotations: { readOnly: false, openWorld: true },
489588
489634
  description: "Translate SRT subtitle files using Claude or OpenAI. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY.",
489589
489635
  schema: z4.object({
489590
489636
  srtPath: z4.string().describe("Path to the input SRT file"),
@@ -489607,6 +489653,8 @@ var editGradeTool = defineTool({
489607
489653
  name: "edit_grade",
489608
489654
  category: "edit",
489609
489655
  cost: "low",
489656
+ title: "Apply Color Grading",
489657
+ annotations: { readOnly: false, openWorld: true },
489610
489658
  description: "Apply AI-generated color grading using Claude + FFmpeg. Use preset for free built-in grades, or style for custom AI-generated grades (needs ANTHROPIC_API_KEY).",
489611
489659
  schema: z4.object({
489612
489660
  videoPath: z4.string().describe("Input video file path"),
@@ -489629,6 +489677,8 @@ var editSpeedRampTool = defineTool({
489629
489677
  name: "edit_speed_ramp",
489630
489678
  category: "edit",
489631
489679
  cost: "low",
489680
+ title: "Apply Content-Aware Speed Ramping",
489681
+ annotations: { readOnly: false, openWorld: true },
489632
489682
  description: "Apply content-aware speed ramping. Analyzes speech with Whisper, plans speed changes with Claude, applies with FFmpeg. Requires OPENAI_API_KEY + ANTHROPIC_API_KEY.",
489633
489683
  schema: z4.object({
489634
489684
  videoPath: z4.string().describe("Input video file path (must have audio)"),
@@ -489653,6 +489703,8 @@ var editReframeTool = defineTool({
489653
489703
  name: "edit_reframe",
489654
489704
  category: "edit",
489655
489705
  cost: "free",
489706
+ title: "Reframe Video Aspect Ratio",
489707
+ annotations: { readOnly: false, openWorld: false },
489656
489708
  description: "Auto-reframe video to a different aspect ratio using smart cropping. Free (FFmpeg only).",
489657
489709
  schema: z4.object({
489658
489710
  videoPath: z4.string().describe("Input video file path"),
@@ -489675,6 +489727,8 @@ var editInterpolateTool = defineTool({
489675
489727
  name: "edit_interpolate",
489676
489728
  category: "edit",
489677
489729
  cost: "free",
489730
+ title: "Create Slow Motion with Frame Interpolation",
489731
+ annotations: { readOnly: false, openWorld: false },
489678
489732
  description: "Create slow motion with AI frame interpolation using FFmpeg minterpolate. Free, no API key needed.",
489679
489733
  schema: z4.object({
489680
489734
  videoPath: z4.string().describe("Input video file path"),
@@ -489697,6 +489751,8 @@ var editUpscaleTool = defineTool({
489697
489751
  name: "edit_upscale",
489698
489752
  category: "edit",
489699
489753
  cost: "free",
489754
+ title: "Upscale Video Resolution",
489755
+ annotations: { readOnly: false, openWorld: false },
489700
489756
  description: "Upscale video resolution using FFmpeg (Lanczos scaling). Free, no API key needed.",
489701
489757
  schema: z4.object({
489702
489758
  videoPath: z4.string().describe("Input video file path"),
@@ -489718,6 +489774,8 @@ var editAnimatedCaptionTool = defineTool({
489718
489774
  name: "edit_animated_caption",
489719
489775
  category: "edit",
489720
489776
  cost: "low",
489777
+ title: "Add Animated Captions",
489778
+ annotations: { readOnly: false, openWorld: true },
489721
489779
  description: "Add animated word-by-word captions (TikTok/Reels style). Supports highlight, bounce, pop-in, neon, karaoke-sweep, typewriter styles. Requires OPENAI_API_KEY for Whisper.",
489722
489780
  schema: z4.object({
489723
489781
  videoPath: z4.string().describe("Path to the input video file"),
@@ -489750,6 +489808,8 @@ var editImageTool = defineTool({
489750
489808
  name: "edit_image",
489751
489809
  category: "edit",
489752
489810
  cost: "low",
489811
+ title: "Edit Image with AI",
489812
+ annotations: { readOnly: false, openWorld: true },
489753
489813
  description: "Edit image(s) using Gemini (Nano Banana). Provide image paths and an edit prompt. Requires GOOGLE_API_KEY.",
489754
489814
  schema: z4.object({
489755
489815
  imagePaths: z4.array(z4.string()).describe("Input image file path(s)"),
@@ -489773,6 +489833,8 @@ var editFillGapsTool = defineTool({
489773
489833
  name: "edit_fill_gaps",
489774
489834
  category: "edit",
489775
489835
  cost: "high",
489836
+ title: "Fill Timeline Gaps with AI Video",
489837
+ annotations: { readOnly: false, openWorld: true },
489776
489838
  description: "Fill timeline gaps with AI-generated video using Kling image-to-video. Detects empty regions in a project's timeline, extracts the last frame of the preceding clip, and generates a continuation video. Requires KLING_API_KEY and IMGBB_API_KEY (image hosting for Kling).",
489777
489839
  schema: z4.object({
489778
489840
  projectPath: z4.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -491256,6 +491318,8 @@ var inspectProjectTool = defineTool({
491256
491318
  name: "inspect_project",
491257
491319
  category: "analyze",
491258
491320
  cost: "free",
491321
+ title: "Inspect Project",
491322
+ annotations: { readOnly: false, openWorld: false },
491259
491323
  description: "Local project inspection: checks STORYBOARD.md, DESIGN.md, config, build-report, scene lint, composition files, and referenced assets. Writes review-report.json by default.",
491260
491324
  schema: z5.object({
491261
491325
  projectDir: z5.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
@@ -491290,6 +491354,8 @@ var inspectRenderTool = defineTool({
491290
491354
  name: "inspect_render",
491291
491355
  category: "analyze",
491292
491356
  cost: "low",
491357
+ title: "Inspect Render",
491358
+ annotations: { readOnly: false, openWorld: false },
491293
491359
  description: "Render inspection: runs cheap local video checks by default, optionally adds Gemini AI review with ai: true, and writes review-report.json by default.",
491294
491360
  schema: z5.object({
491295
491361
  projectDir: z5.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
@@ -491354,6 +491420,8 @@ var analyzeMediaTool = defineTool({
491354
491420
  name: "inspect_media",
491355
491421
  category: "analyze",
491356
491422
  cost: "low",
491423
+ title: "Inspect Media with AI",
491424
+ annotations: { readOnly: true, openWorld: true },
491357
491425
  description: "Analyze media (image, video, or YouTube URL) using Gemini AI. Requires GOOGLE_API_KEY.",
491358
491426
  schema: z5.object({
491359
491427
  source: z5.string().describe("Path to image/video or YouTube URL"),
@@ -491382,6 +491450,8 @@ var analyzeVideoTool = defineTool({
491382
491450
  name: "inspect_video",
491383
491451
  category: "analyze",
491384
491452
  cost: "low",
491453
+ title: "Inspect Video with AI",
491454
+ annotations: { readOnly: true, openWorld: true },
491385
491455
  description: "Analyze video content using Gemini AI with temporal understanding. Requires GOOGLE_API_KEY.",
491386
491456
  schema: z5.object({
491387
491457
  source: z5.string().describe("Path to video file"),
@@ -491410,6 +491480,8 @@ var analyzeReviewTool = defineTool({
491410
491480
  name: "inspect_review",
491411
491481
  category: "analyze",
491412
491482
  cost: "low",
491483
+ title: "Review Video with AI",
491484
+ annotations: { readOnly: false, openWorld: true },
491413
491485
  description: "AI video review: analyzes quality, suggests fixes, and optionally auto-applies them. Requires GOOGLE_API_KEY.",
491414
491486
  schema: z5.object({
491415
491487
  videoPath: z5.string().describe("Path to the video file to review"),
@@ -491438,6 +491510,8 @@ var analyzeSuggestTool = defineTool({
491438
491510
  name: "inspect_suggest",
491439
491511
  category: "analyze",
491440
491512
  cost: "low",
491513
+ title: "Suggest Edits with AI",
491514
+ annotations: { readOnly: false, openWorld: true },
491441
491515
  description: "Get natural-language edit suggestions for a project from Gemini. Returns suggestions array with type/confidence/clipIds. With `apply: true`, applies the first suggestion in place. Requires GOOGLE_API_KEY.",
491442
491516
  schema: z5.object({
491443
491517
  projectPath: z5.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -491486,6 +491560,8 @@ var generateMotionTool = defineTool({
491486
491560
  name: "generate_motion",
491487
491561
  category: "generate",
491488
491562
  cost: "low",
491563
+ title: "Generate Motion Graphics",
491564
+ annotations: { readOnly: false, openWorld: true },
491489
491565
  description: "Generate standalone motion graphics using Claude or Gemini + Remotion. For overlays on an existing video, prefer edit_motion_overlay. Requires ANTHROPIC_API_KEY (Claude) or GOOGLE_API_KEY (Gemini).",
491490
491566
  schema: z6.object({
491491
491567
  description: z6.string().describe("Description of the motion graphic to generate"),
@@ -491525,6 +491601,8 @@ var generateSpeechTool = defineTool({
491525
491601
  name: "generate_speech",
491526
491602
  category: "generate",
491527
491603
  cost: "low",
491604
+ title: "Generate Speech Audio",
491605
+ annotations: { readOnly: false, openWorld: true },
491528
491606
  description: "Generate speech from text using ElevenLabs TTS. Requires ELEVENLABS_API_KEY.",
491529
491607
  schema: z6.object({
491530
491608
  text: z6.string().describe("Text to convert to speech"),
@@ -491545,6 +491623,8 @@ var generateNarrationTool = defineTool({
491545
491623
  name: "generate_narration",
491546
491624
  category: "generate",
491547
491625
  cost: "low",
491626
+ title: "Generate Narration Audio",
491627
+ annotations: { readOnly: false, openWorld: true },
491548
491628
  description: "Generate narration from text using ElevenLabs TTS. Product-facing alias for generate_speech. Requires ELEVENLABS_API_KEY.",
491549
491629
  schema: z6.object({
491550
491630
  text: z6.string().describe("Narration text to convert to speech"),
@@ -491569,6 +491649,8 @@ var generateSoundEffectTool = defineTool({
491569
491649
  name: "generate_sound_effect",
491570
491650
  category: "generate",
491571
491651
  cost: "low",
491652
+ title: "Generate Sound Effect",
491653
+ annotations: { readOnly: false, openWorld: true },
491572
491654
  description: "Generate sound effects using ElevenLabs. Requires ELEVENLABS_API_KEY.",
491573
491655
  schema: z6.object({
491574
491656
  prompt: z6.string().describe("Description of the sound effect"),
@@ -491590,6 +491672,8 @@ var generateMusicTool = defineTool({
491590
491672
  name: "generate_music",
491591
491673
  category: "generate",
491592
491674
  cost: "low",
491675
+ title: "Generate Music",
491676
+ annotations: { readOnly: false, openWorld: true },
491593
491677
  description: "Generate background music from text prompt. ElevenLabs (default, up to 10min) or Replicate MusicGen (max 30s). Requires ELEVENLABS_API_KEY or REPLICATE_API_TOKEN.",
491594
491678
  schema: z6.object({
491595
491679
  prompt: z6.string().describe("Description of the music to generate"),
@@ -491635,6 +491719,8 @@ var generateMusicStatusTool = defineTool({
491635
491719
  name: "generate_music_status",
491636
491720
  category: "generate",
491637
491721
  cost: "free",
491722
+ title: "Check Music Generation Status",
491723
+ annotations: { readOnly: true, openWorld: true },
491638
491724
  description: "Check Replicate music generation task status. `generate_music` returns a task id; this tool polls it until the audio URL is ready. Requires REPLICATE_API_TOKEN.",
491639
491725
  schema: z6.object({
491640
491726
  taskId: z6.string().describe("Task ID returned from generate_music")
@@ -491658,6 +491744,8 @@ var generateImageTool = defineTool({
491658
491744
  name: "generate_image",
491659
491745
  category: "generate",
491660
491746
  cost: "low",
491747
+ title: "Generate Image",
491748
+ annotations: { readOnly: false, openWorld: true },
491661
491749
  description: "Generate an image using AI. Supports Gemini (free), OpenAI GPT Image, or Grok Imagine. Requires GOOGLE_API_KEY (Gemini), OPENAI_API_KEY (OpenAI), or XAI_API_KEY (Grok).",
491662
491750
  schema: z6.object({
491663
491751
  prompt: z6.string().describe("Image description prompt"),
@@ -491691,6 +491779,8 @@ var generateStoryboardTool = defineTool({
491691
491779
  name: "generate_storyboard",
491692
491780
  category: "generate",
491693
491781
  cost: "low",
491782
+ title: "Generate Storyboard",
491783
+ annotations: { readOnly: false, openWorld: true },
491694
491784
  description: "Generate a video storyboard from text content using Claude. Returns scene segments with descriptions, visuals, and narration. Requires ANTHROPIC_API_KEY.",
491695
491785
  schema: z6.object({
491696
491786
  content: z6.string().describe("Text content to analyze (script, article, etc.)"),
@@ -491714,6 +491804,8 @@ var generateBackgroundTool = defineTool({
491714
491804
  name: "generate_background",
491715
491805
  category: "generate",
491716
491806
  cost: "low",
491807
+ title: "Generate Background Image",
491808
+ annotations: { readOnly: false, openWorld: true },
491717
491809
  description: "Generate a cinematic backdrop image (OpenAI gpt-image-2 / DALL\xB7E variant tuned for video backgrounds). Returns the image URL and, when `output` is provided, downloads the PNG to disk. Requires OPENAI_API_KEY.",
491718
491810
  schema: z6.object({
491719
491811
  description: z6.string().describe("Background description / image prompt."),
@@ -491738,6 +491830,8 @@ var generateThumbnailTool = defineTool({
491738
491830
  name: "generate_thumbnail",
491739
491831
  category: "generate",
491740
491832
  cost: "low",
491833
+ title: "Generate Thumbnail",
491834
+ annotations: { readOnly: false, openWorld: true },
491741
491835
  description: "Extract the best thumbnail frame from a video using Gemini AI analysis. Requires GOOGLE_API_KEY.",
491742
491836
  schema: z6.object({
491743
491837
  videoPath: z6.string().describe("Path to the video file"),
@@ -491759,6 +491853,8 @@ var generateVideoTool = defineTool({
491759
491853
  name: "generate_video",
491760
491854
  category: "generate",
491761
491855
  cost: "high",
491856
+ title: "Generate Video",
491857
+ annotations: { readOnly: false, openWorld: true },
491762
491858
  description: "Generate video using AI. Supports Seedance 2.0 via fal.ai, Grok, Kling, Runway, and Veo. Requires FAL_API_KEY, XAI_API_KEY, KLING_API_KEY, RUNWAY_API_SECRET, or GOOGLE_API_KEY.",
491763
491859
  schema: z6.object({
491764
491860
  prompt: z6.string().describe("Text prompt describing the video"),
@@ -491820,6 +491916,8 @@ var generateVideoStatusTool = defineTool({
491820
491916
  name: "generate_video_status",
491821
491917
  category: "generate",
491822
491918
  cost: "free",
491919
+ title: "Check Video Generation Status",
491920
+ annotations: { readOnly: false, openWorld: true },
491823
491921
  description: "Check video generation status for Grok, Runway, Kling, or Veo tasks.",
491824
491922
  schema: z6.object({
491825
491923
  taskId: z6.string().describe("Task ID from video generation"),
@@ -491850,6 +491948,8 @@ var generateVideoCancelTool = defineTool({
491850
491948
  name: "generate_video_cancel",
491851
491949
  category: "generate",
491852
491950
  cost: "free",
491951
+ title: "Cancel Video Generation",
491952
+ annotations: { readOnly: false, openWorld: true },
491853
491953
  description: "Cancel a Runway video generation task.",
491854
491954
  schema: z6.object({
491855
491955
  taskId: z6.string().describe("Task ID to cancel")
@@ -491868,6 +491968,8 @@ var generateVideoExtendTool = defineTool({
491868
491968
  name: "generate_video_extend",
491869
491969
  category: "generate",
491870
491970
  cost: "high",
491971
+ title: "Extend Generated Video",
491972
+ annotations: { readOnly: false, openWorld: true },
491871
491973
  description: "Extend video duration using Kling or Veo. Requires the video/operation ID from a previous generation.",
491872
491974
  schema: z6.object({
491873
491975
  videoId: z6.string().describe("Video ID (Kling) or operation name (Veo)"),
@@ -492270,6 +492372,8 @@ var storyboardListTool = defineTool({
492270
492372
  name: "storyboard_list",
492271
492373
  category: "storyboard",
492272
492374
  cost: "free",
492375
+ title: "List Storyboard Beats",
492376
+ annotations: { readOnly: true, openWorld: false },
492273
492377
  description: "List beats, ids, durations, and cue blocks from a project's STORYBOARD.md.",
492274
492378
  schema: projectDirSchema,
492275
492379
  async execute(args, ctx) {
@@ -492296,6 +492400,8 @@ var storyboardValidateTool = defineTool({
492296
492400
  name: "storyboard_validate",
492297
492401
  category: "storyboard",
492298
492402
  cost: "free",
492403
+ title: "Validate Storyboard",
492404
+ annotations: { readOnly: true, openWorld: false },
492299
492405
  description: "Validate STORYBOARD.md beat ids and cue blocks.",
492300
492406
  schema: projectDirSchema,
492301
492407
  async execute(args, ctx) {
@@ -492326,6 +492432,8 @@ var storyboardGetTool = defineTool({
492326
492432
  name: "storyboard_get",
492327
492433
  category: "storyboard",
492328
492434
  cost: "free",
492435
+ title: "Get Storyboard Beat",
492436
+ annotations: { readOnly: true, openWorld: false },
492329
492437
  description: "Return one STORYBOARD.md beat as structured data.",
492330
492438
  schema: z7.object({
492331
492439
  projectDir: z7.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -492348,6 +492456,8 @@ var storyboardSetTool = defineTool({
492348
492456
  name: "storyboard_set",
492349
492457
  category: "storyboard",
492350
492458
  cost: "free",
492459
+ title: "Set Storyboard Cue",
492460
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
492351
492461
  description: "Set or unset one cue on one beat in STORYBOARD.md.",
492352
492462
  schema: z7.object({
492353
492463
  projectDir: z7.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -492384,6 +492494,8 @@ var storyboardMoveTool = defineTool({
492384
492494
  name: "storyboard_move",
492385
492495
  category: "storyboard",
492386
492496
  cost: "free",
492497
+ title: "Reorder Storyboard Beat",
492498
+ annotations: { readOnly: false, openWorld: false },
492387
492499
  description: "Move one beat after another beat in STORYBOARD.md.",
492388
492500
  schema: z7.object({
492389
492501
  projectDir: z7.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -492414,6 +492526,8 @@ var storyboardReviseTool = defineTool({
492414
492526
  name: "storyboard_revise",
492415
492527
  category: "storyboard",
492416
492528
  cost: "low",
492529
+ title: "Revise Storyboard with AI",
492530
+ annotations: { readOnly: false, openWorld: true },
492417
492531
  description: "Revise an existing STORYBOARD.md from a natural-language request. Reads project context, validates the revised storyboard, and writes unless dryRun is true.",
492418
492532
  schema: z7.object({
492419
492533
  projectDir: z7.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -492445,6 +492559,8 @@ var planTool = defineTool({
492445
492559
  name: "plan",
492446
492560
  category: "storyboard",
492447
492561
  cost: "free",
492562
+ title: "Plan Build Cost and Stages",
492563
+ annotations: { readOnly: true, openWorld: false },
492448
492564
  description: "Read STORYBOARD.md and return the build plan, missing artifacts, provider needs, and estimated cost.",
492449
492565
  schema: z7.object({
492450
492566
  projectDir: z7.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -494143,6 +494259,8 @@ var pipelineHighlightsTool = defineTool({
494143
494259
  name: "remix_highlights",
494144
494260
  category: "pipeline",
494145
494261
  cost: "low",
494262
+ title: "Extract Video Highlights",
494263
+ annotations: { readOnly: false, openWorld: true },
494146
494264
  description: "Extract highlight clips from a longer video using AI analysis. Requires OPENAI_API_KEY+ANTHROPIC_API_KEY or GOOGLE_API_KEY (with --use-gemini).",
494147
494265
  schema: z8.object({
494148
494266
  media: z8.string().describe("Path to the input video file"),
@@ -494176,6 +494294,8 @@ var pipelineAutoShortsTool = defineTool({
494176
494294
  name: "remix_auto_shorts",
494177
494295
  category: "pipeline",
494178
494296
  cost: "medium",
494297
+ title: "Generate Auto Shorts",
494298
+ annotations: { readOnly: false, openWorld: true },
494179
494299
  description: "Automatically generate short-form content (Reels/TikTok/Shorts) from a longer video. Same API key requirements as remix_highlights.",
494180
494300
  schema: z8.object({
494181
494301
  video: z8.string().describe("Path to the input video file"),
@@ -494213,6 +494333,8 @@ var pipelineRunTool = defineTool({
494213
494333
  name: "run",
494214
494334
  category: "pipeline",
494215
494335
  cost: "very-high",
494336
+ title: "Run YAML Pipeline",
494337
+ annotations: { readOnly: false, openWorld: true },
494216
494338
  surfaces: ["mcp"],
494217
494339
  description: "Execute a declarative YAML pipeline (Video as Code). Accepts either a file path or inline YAML. Supports dry-run, resume-from-checkpoint, and budget limits. Cost depends on the steps \u2014 use dryRun: true first to preview.",
494218
494340
  schema: z8.object({
@@ -494292,6 +494414,8 @@ var pipelineRegenerateSceneTool = defineTool({
494292
494414
  name: "remix_regenerate_scene",
494293
494415
  category: "pipeline",
494294
494416
  cost: "high",
494417
+ title: "Regenerate Storyboard Scenes",
494418
+ annotations: { readOnly: false, openWorld: true },
494295
494419
  description: "Regenerate specific scenes against an existing storyboard.{yaml,json} on disk. Can regenerate video, image, or narration independently.",
494296
494420
  schema: z8.object({
494297
494421
  projectDir: z8.string().describe("Path to the project output directory containing storyboard.json"),
@@ -494329,6 +494453,8 @@ var detectScenesTool = defineTool({
494329
494453
  name: "detect_scenes",
494330
494454
  category: "detect",
494331
494455
  cost: "free",
494456
+ title: "Detect Scene Cuts",
494457
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
494332
494458
  description: "Detect scene changes in video using FFmpeg. No API key needed.",
494333
494459
  schema: z9.object({
494334
494460
  videoPath: z9.string().describe("Path to the input video file"),
@@ -494353,6 +494479,8 @@ var detectSilenceTool = defineTool({
494353
494479
  name: "detect_silence",
494354
494480
  category: "detect",
494355
494481
  cost: "free",
494482
+ title: "Detect Silence Periods",
494483
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
494356
494484
  description: "Detect silence periods in audio/video using FFmpeg. No API key needed.",
494357
494485
  schema: z9.object({
494358
494486
  mediaPath: z9.string().describe("Path to the audio/video file"),
@@ -494374,6 +494502,8 @@ var detectBeatsTool = defineTool({
494374
494502
  name: "detect_beats",
494375
494503
  category: "detect",
494376
494504
  cost: "free",
494505
+ title: "Detect Audio Beats",
494506
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
494377
494507
  description: "Detect beats in audio for music sync using FFmpeg loudness analysis. No API key needed.",
494378
494508
  schema: z9.object({
494379
494509
  audioPath: z9.string().describe("Path to the audio file"),
@@ -494436,6 +494566,8 @@ var timelineCreateTool = defineTool({
494436
494566
  name: "timeline_create",
494437
494567
  category: "timeline",
494438
494568
  cost: "free",
494569
+ title: "Create Timeline",
494570
+ annotations: { readOnly: false, openWorld: false },
494439
494571
  description: "Create a low-level timeline JSON file for FFmpeg-style editing",
494440
494572
  schema: z10.object({
494441
494573
  name: z10.string().describe("Timeline name or directory path"),
@@ -494466,6 +494598,8 @@ var timelineInfoTool = defineTool({
494466
494598
  name: "timeline_info",
494467
494599
  category: "timeline",
494468
494600
  cost: "free",
494601
+ title: "Get Timeline Info",
494602
+ annotations: { readOnly: true, openWorld: false },
494469
494603
  description: "Get information about a timeline JSON file. Legacy *.vibe.json files are supported.",
494470
494604
  schema: z10.object({
494471
494605
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file")
@@ -494493,6 +494627,8 @@ var timelineAddSourceTool = defineTool({
494493
494627
  name: "timeline_add_source",
494494
494628
  category: "timeline",
494495
494629
  cost: "free",
494630
+ title: "Add Source to Timeline",
494631
+ annotations: { readOnly: false, openWorld: false },
494496
494632
  description: "Add a media source (video, audio, image) to the timeline",
494497
494633
  schema: z10.object({
494498
494634
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494518,6 +494654,8 @@ var timelineAddClipTool = defineTool({
494518
494654
  name: "timeline_add_clip",
494519
494655
  category: "timeline",
494520
494656
  cost: "free",
494657
+ title: "Add Clip to Timeline",
494658
+ annotations: { readOnly: false, openWorld: false },
494521
494659
  description: "Add a clip to the timeline from an existing source",
494522
494660
  schema: z10.object({
494523
494661
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494549,6 +494687,8 @@ var timelineSplitClipTool = defineTool({
494549
494687
  name: "timeline_split_clip",
494550
494688
  category: "timeline",
494551
494689
  cost: "free",
494690
+ title: "Split Clip",
494691
+ annotations: { readOnly: false, openWorld: false },
494552
494692
  description: "Split a clip at a specific time",
494553
494693
  schema: z10.object({
494554
494694
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494567,6 +494707,8 @@ var timelineTrimClipTool = defineTool({
494567
494707
  name: "timeline_trim_clip",
494568
494708
  category: "timeline",
494569
494709
  cost: "free",
494710
+ title: "Trim Clip",
494711
+ annotations: { readOnly: false, openWorld: false },
494570
494712
  description: "Trim a clip by adjusting its start or end",
494571
494713
  schema: z10.object({
494572
494714
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494586,6 +494728,8 @@ var timelineMoveClipTool = defineTool({
494586
494728
  name: "timeline_move_clip",
494587
494729
  category: "timeline",
494588
494730
  cost: "free",
494731
+ title: "Move Clip",
494732
+ annotations: { readOnly: false, openWorld: false },
494589
494733
  description: "Move a clip to a new position or track",
494590
494734
  schema: z10.object({
494591
494735
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494608,6 +494752,8 @@ var timelineDeleteClipTool = defineTool({
494608
494752
  name: "timeline_delete_clip",
494609
494753
  category: "timeline",
494610
494754
  cost: "free",
494755
+ title: "Delete Clip",
494756
+ annotations: { readOnly: false, openWorld: false },
494611
494757
  description: "Delete a clip from the timeline",
494612
494758
  schema: z10.object({
494613
494759
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494624,6 +494770,8 @@ var timelineDuplicateClipTool = defineTool({
494624
494770
  name: "timeline_duplicate_clip",
494625
494771
  category: "timeline",
494626
494772
  cost: "free",
494773
+ title: "Duplicate Clip",
494774
+ annotations: { readOnly: false, openWorld: false },
494627
494775
  description: "Duplicate a clip on the timeline (optionally at a new start time)",
494628
494776
  schema: z10.object({
494629
494777
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494642,6 +494790,8 @@ var timelineAddEffectTool = defineTool({
494642
494790
  name: "timeline_add_effect",
494643
494791
  category: "timeline",
494644
494792
  cost: "free",
494793
+ title: "Add Effect to Clip",
494794
+ annotations: { readOnly: false, openWorld: false },
494645
494795
  description: "Add an effect to a clip",
494646
494796
  schema: z10.object({
494647
494797
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494668,6 +494818,8 @@ var timelineAddTrackTool = defineTool({
494668
494818
  name: "timeline_add_track",
494669
494819
  category: "timeline",
494670
494820
  cost: "free",
494821
+ title: "Add Track to Timeline",
494822
+ annotations: { readOnly: false, openWorld: false },
494671
494823
  description: "Add a new track to the timeline",
494672
494824
  schema: z10.object({
494673
494825
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -494694,6 +494846,8 @@ var timelineListTool = defineTool({
494694
494846
  name: "timeline_list",
494695
494847
  category: "timeline",
494696
494848
  cost: "free",
494849
+ title: "List Timeline Contents",
494850
+ annotations: { readOnly: true, openWorld: false },
494697
494851
  description: "List all sources, tracks, and clips in a project",
494698
494852
  schema: z10.object({
494699
494853
  projectPath: z10.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file")
@@ -494736,6 +494890,8 @@ var projectCreateTool = defineTool({
494736
494890
  name: "project_create",
494737
494891
  category: "project",
494738
494892
  cost: "free",
494893
+ title: "Create Project",
494894
+ annotations: { readOnly: false, openWorld: false },
494739
494895
  description: "Deprecated alias for creating low-level timeline state. Prefer timeline_create.",
494740
494896
  schema: z11.object({
494741
494897
  name: z11.string().describe("Project name"),
@@ -494760,6 +494916,8 @@ var projectInfoTool = defineTool({
494760
494916
  name: "project_info",
494761
494917
  category: "project",
494762
494918
  cost: "free",
494919
+ title: "Get Project Info",
494920
+ annotations: { readOnly: true, openWorld: false },
494763
494921
  description: "Deprecated alias for timeline_info. Legacy *.vibe.json files remain supported.",
494764
494922
  schema: z11.object({
494765
494923
  projectPath: z11.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file")
@@ -495647,6 +495805,8 @@ var exportVideoTool = defineTool({
495647
495805
  name: "export_video",
495648
495806
  category: "export",
495649
495807
  cost: "free",
495808
+ title: "Export Timeline to Video",
495809
+ annotations: { readOnly: false, openWorld: false },
495650
495810
  description: "Export a VibeFrame timeline to a video file (MP4, WebM, or MOV). Requires FFmpeg.",
495651
495811
  schema: z12.object({
495652
495812
  projectPath: z12.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -495738,6 +495898,8 @@ var fsListTool = defineTool({
495738
495898
  name: "fs_list",
495739
495899
  category: "agent-only",
495740
495900
  cost: "free",
495901
+ title: "List Files",
495902
+ annotations: { readOnly: true, openWorld: false },
495741
495903
  surfaces: ["agent"],
495742
495904
  description: "List files and directories in a path",
495743
495905
  schema: z13.object({
@@ -495771,6 +495933,8 @@ var fsReadTool = defineTool({
495771
495933
  name: "fs_read",
495772
495934
  category: "agent-only",
495773
495935
  cost: "free",
495936
+ title: "Read File",
495937
+ annotations: { readOnly: true, openWorld: false },
495774
495938
  surfaces: ["agent"],
495775
495939
  description: "Read contents of a text file",
495776
495940
  schema: z13.object({
@@ -495793,6 +495957,8 @@ var fsWriteTool = defineTool({
495793
495957
  name: "fs_write",
495794
495958
  category: "agent-only",
495795
495959
  cost: "free",
495960
+ title: "Write File",
495961
+ annotations: { readOnly: false, openWorld: false },
495796
495962
  surfaces: ["agent"],
495797
495963
  description: "Write content to a file",
495798
495964
  schema: z13.object({
@@ -495813,6 +495979,8 @@ var fsExistsTool = defineTool({
495813
495979
  name: "fs_exists",
495814
495980
  category: "agent-only",
495815
495981
  cost: "free",
495982
+ title: "Check Path Exists",
495983
+ annotations: { readOnly: true, openWorld: false },
495816
495984
  surfaces: ["agent"],
495817
495985
  description: "Check if a file or directory exists",
495818
495986
  schema: z13.object({
@@ -495834,6 +496002,8 @@ var batchImportTool = defineTool({
495834
496002
  name: "batch_import",
495835
496003
  category: "agent-only",
495836
496004
  cost: "free",
496005
+ title: "Batch Import Media",
496006
+ annotations: { readOnly: false, openWorld: false },
495837
496007
  surfaces: ["agent"],
495838
496008
  description: "Import multiple media files from a directory into a project. Scans directory for video, audio, and image files.",
495839
496009
  schema: z13.object({
@@ -495903,6 +496073,8 @@ var batchConcatTool = defineTool({
495903
496073
  name: "batch_concat",
495904
496074
  category: "agent-only",
495905
496075
  cost: "free",
496076
+ title: "Batch Concatenate Sources",
496077
+ annotations: { readOnly: false, openWorld: false },
495906
496078
  surfaces: ["agent"],
495907
496079
  description: "Concatenate multiple sources into sequential clips on the timeline",
495908
496080
  schema: z13.object({
@@ -495972,6 +496144,8 @@ var batchApplyEffectTool = defineTool({
495972
496144
  name: "batch_apply_effect",
495973
496145
  category: "agent-only",
495974
496146
  cost: "free",
496147
+ title: "Batch Apply Effect",
496148
+ annotations: { readOnly: false, openWorld: false },
495975
496149
  surfaces: ["agent"],
495976
496150
  description: "Apply an effect to multiple clips at once",
495977
496151
  schema: z13.object({
@@ -496028,6 +496202,8 @@ var timelineClearTool = defineTool({
496028
496202
  name: "timeline_clear",
496029
496203
  category: "agent-only",
496030
496204
  cost: "free",
496205
+ title: "Clear Timeline",
496206
+ annotations: { readOnly: false, openWorld: false },
496031
496207
  surfaces: ["agent"],
496032
496208
  description: "Clear timeline contents (remove clips, tracks, or sources)",
496033
496209
  schema: z13.object({
@@ -496102,6 +496278,8 @@ var projectSetTool = defineTool({
496102
496278
  name: "project_set",
496103
496279
  category: "agent-only",
496104
496280
  cost: "free",
496281
+ title: "Update Project Settings",
496282
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
496105
496283
  surfaces: ["agent"],
496106
496284
  description: "Update timeline settings (name, aspect ratio, frame rate)",
496107
496285
  schema: z13.object({
@@ -496147,6 +496325,8 @@ var projectOpenTool = defineTool({
496147
496325
  name: "project_open",
496148
496326
  category: "agent-only",
496149
496327
  cost: "free",
496328
+ title: "Open Project",
496329
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
496150
496330
  surfaces: ["agent"],
496151
496331
  description: "Open an existing project and set it as the current context",
496152
496332
  schema: z13.object({
@@ -496185,6 +496365,8 @@ var projectSaveTool = defineTool({
496185
496365
  name: "project_save",
496186
496366
  category: "agent-only",
496187
496367
  cost: "free",
496368
+ title: "Save Project",
496369
+ annotations: { readOnly: false, openWorld: false },
496188
496370
  surfaces: ["agent"],
496189
496371
  description: "Save the current project (uses ctx.agent.projectPath if no path given)",
496190
496372
  schema: z13.object({
@@ -496219,6 +496401,8 @@ var exportAudioTool = defineTool({
496219
496401
  name: "export_audio",
496220
496402
  category: "agent-only",
496221
496403
  cost: "free",
496404
+ title: "Export Audio",
496405
+ annotations: { readOnly: false, openWorld: false },
496222
496406
  surfaces: ["agent"],
496223
496407
  description: "Export audio track from a project. Not implemented \u2014 use export_video then strip audio with FFmpeg.",
496224
496408
  schema: z13.object({
@@ -496237,6 +496421,8 @@ var exportSubtitlesTool = defineTool({
496237
496421
  name: "export_subtitles",
496238
496422
  category: "agent-only",
496239
496423
  cost: "free",
496424
+ title: "Export Subtitles",
496425
+ annotations: { readOnly: false, openWorld: false },
496240
496426
  surfaces: ["agent"],
496241
496427
  description: "Export subtitles from transcription. Not implemented \u2014 use audio_transcribe to generate subtitles from audio.",
496242
496428
  schema: z13.object({
@@ -496255,6 +496441,8 @@ var mediaInfoTool = defineTool({
496255
496441
  name: "media_info",
496256
496442
  category: "agent-only",
496257
496443
  cost: "free",
496444
+ title: "Get Media Info",
496445
+ annotations: { readOnly: true, openWorld: false },
496258
496446
  surfaces: ["agent"],
496259
496447
  description: "Get information about a media file (duration, resolution, codec, etc.)",
496260
496448
  schema: z13.object({
@@ -496339,6 +496527,8 @@ var mediaCompressTool = defineTool({
496339
496527
  name: "media_compress",
496340
496528
  category: "agent-only",
496341
496529
  cost: "free",
496530
+ title: "Compress Media",
496531
+ annotations: { readOnly: false, openWorld: false },
496342
496532
  surfaces: ["agent"],
496343
496533
  description: "Compress a video or audio file using FFmpeg",
496344
496534
  schema: z13.object({
@@ -496400,6 +496590,8 @@ var mediaConvertTool = defineTool({
496400
496590
  name: "media_convert",
496401
496591
  category: "agent-only",
496402
496592
  cost: "free",
496593
+ title: "Convert Media",
496594
+ annotations: { readOnly: false, openWorld: false },
496403
496595
  surfaces: ["agent"],
496404
496596
  description: "Convert media file to a different format using FFmpeg",
496405
496597
  schema: z13.object({
@@ -496447,6 +496639,8 @@ var mediaConcatTool = defineTool({
496447
496639
  name: "media_concat",
496448
496640
  category: "agent-only",
496449
496641
  cost: "free",
496642
+ title: "Concatenate Media Files",
496643
+ annotations: { readOnly: false, openWorld: false },
496450
496644
  surfaces: ["agent"],
496451
496645
  description: "Concatenate multiple media files into one using FFmpeg",
496452
496646
  schema: z13.object({
@@ -496986,6 +497180,8 @@ var guideTool = defineTool({
496986
497180
  name: "guide",
496987
497181
  category: "agent",
496988
497182
  cost: "free",
497183
+ title: "Load Workflow Guide",
497184
+ annotations: { readOnly: true, openWorld: false },
496989
497185
  description: "Load the step-by-step guide for a vibe workflow (motion overlays, BUILD scene authoring, YAML pipeline authoring, architecture choices). Universal CLI-equivalent of `vibe guide <topic>` and Claude Code's /vibe-* slash commands. Without a topic, returns the guide catalog for discovery.",
496990
497186
  schema: guideSchema,
496991
497187
  async execute(args) {
@@ -497022,6 +497218,8 @@ var statusJobTool = defineTool({
497022
497218
  name: "status_job",
497023
497219
  category: "status",
497024
497220
  cost: "free",
497221
+ title: "Check Job Status",
497222
+ annotations: { readOnly: false, destructive: false, openWorld: true },
497025
497223
  description: "Read one local async job record and optionally refresh supported provider status. Supports Runway/Kling video and Replicate music live checks. Also tracks long-running MCP build/render jobs (jobType build/render, provider local): their records are updated in-process \u2014 on completion result.payload carries the full tool result; status 'unknown' means the MCP server restarted mid-job (check build-report.json / render-report.json on disk).",
497026
497224
  schema: z15.object({
497027
497225
  jobId: z15.string().describe("Local job id returned by a no-wait command."),
@@ -497057,6 +497255,8 @@ var statusProjectTool = defineTool({
497057
497255
  name: "status_project",
497058
497256
  category: "status",
497059
497257
  cost: "free",
497258
+ title: "Check Project Status",
497259
+ annotations: { readOnly: false, destructive: false, openWorld: true },
497060
497260
  description: "Summarize build-report.json, review-report.json, and local async job records for a VibeFrame project.",
497061
497261
  schema: z15.object({
497062
497262
  projectDir: z15.string().optional().describe(PROJECT_DIR_DESCRIPTION4),
@@ -497313,16 +497513,29 @@ function manifestToMcpTools(manifest2) {
497313
497513
  const inputSchema = zodToJsonSchema(t2.schema);
497314
497514
  return {
497315
497515
  name: t2.name,
497516
+ title: t2.title,
497316
497517
  description: t2.description,
497317
497518
  inputSchema: {
497318
497519
  type: "object",
497319
497520
  properties: inputSchema.properties ?? {},
497320
497521
  required: inputSchema.required ?? [],
497321
497522
  ...inputSchema.description ? { description: inputSchema.description } : {}
497322
- }
497523
+ },
497524
+ annotations: toMcpAnnotations(t2.annotations)
497323
497525
  };
497324
497526
  });
497325
497527
  }
497528
+ function toMcpAnnotations(a2) {
497529
+ if (a2.readOnly) {
497530
+ return { readOnlyHint: true, openWorldHint: a2.openWorld };
497531
+ }
497532
+ return {
497533
+ readOnlyHint: false,
497534
+ destructiveHint: a2.destructive ?? true,
497535
+ ...a2.idempotent !== void 0 ? { idempotentHint: a2.idempotent } : {},
497536
+ openWorldHint: a2.openWorld
497537
+ };
497538
+ }
497326
497539
  function buildMcpDispatcher(manifest2) {
497327
497540
  const byName = /* @__PURE__ */ new Map();
497328
497541
  for (const t2 of manifest2) {
@@ -497804,8 +498017,21 @@ This creates a music video-style edit where cuts happen in rhythm with the music
497804
498017
  }
497805
498018
 
497806
498019
  // src/instructions.ts
497807
- import { mkdirSync as mkdirSync13 } from "node:fs";
497808
- import { isAbsolute as isAbsolute9, resolve as resolve78 } from "node:path";
498020
+ import { existsSync as existsSync65, mkdirSync as mkdirSync13 } from "node:fs";
498021
+ import { delimiter, isAbsolute as isAbsolute9, resolve as resolve78 } from "node:path";
498022
+ var DEFAULT_EXTRA_PATH_DIRS = process.platform === "darwin" ? ["/opt/homebrew/bin", "/usr/local/bin", "/opt/local/bin"] : ["/usr/local/bin"];
498023
+ function ensureSystemPath(env4 = process.env, extraDirs = DEFAULT_EXTRA_PATH_DIRS) {
498024
+ const current = (env4.PATH ?? "").split(delimiter).filter(Boolean);
498025
+ const added = [];
498026
+ for (const dir of extraDirs) {
498027
+ if (!current.includes(dir) && existsSync65(dir)) {
498028
+ current.push(dir);
498029
+ added.push(dir);
498030
+ }
498031
+ }
498032
+ if (added.length > 0) env4.PATH = current.join(delimiter);
498033
+ return added;
498034
+ }
497809
498035
  function scrubUnresolvedUserConfigEnv(env4 = process.env) {
497810
498036
  const removed = [];
497811
498037
  for (const [key2, value] of Object.entries(env4)) {
@@ -497844,7 +498070,8 @@ function buildServerInstructions(cwd = resolveServerWorkspaceRoot()) {
497844
498070
  "When creating projects with init, use a project name or workspace-relative path under the workspace root.",
497845
498071
  "Do not create projects in /tmp, /home/claude, /workspace, or other synthetic roots unless the user explicitly asks.",
497846
498072
  "Before high or very-high cost provider work, run a dry-run or plan when available and ask the user to confirm provider spend.",
497847
- "When the user's request leaves them unspecified, ask the user before building instead of silently picking defaults: narration provider (kokoro = free local, elevenlabs = cloud credits), backdrop image generation (paid; skipping is free), and visual style (list options via scene_list_styles). Present the choices and wait for the answer."
498073
+ "When the user's request leaves them unspecified, ask the user before building instead of silently picking defaults: narration provider (kokoro = free local, elevenlabs = cloud credits), backdrop image generation (paid; skipping is free), and visual style (list options via scene_list_styles). Present the choices and wait for the answer.",
498074
+ "Narration and backdrop choices are independent \u2014 kokoro narration with OpenAI backdrops is a common combination. Pass each answer explicitly to build (ttsProvider plus skipBackdrop/imageProvider); never let one choice imply the other."
497848
498075
  ].join("\n");
497849
498076
  }
497850
498077
 
@@ -497865,11 +498092,12 @@ console.info = (...args) => console.error(...args);
497865
498092
  console.debug = (...args) => console.error(...args);
497866
498093
  scrubUnresolvedUserConfigEnv();
497867
498094
  applyWorkspaceEnv();
498095
+ ensureSystemPath();
497868
498096
  var server2 = new Server(
497869
498097
  {
497870
498098
  name: "vibeframe",
497871
498099
  // Stamped with the package version by build.js at bundle time.
497872
- version: "0.110.0"
498100
+ version: "0.111.1"
497873
498101
  },
497874
498102
  {
497875
498103
  capabilities: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.110.0",
3
+ "version": "0.111.1",
4
4
  "description": "VibeFrame MCP Server - AI-native video editing via Model Context Protocol",
5
5
  "type": "module",
6
6
  "bin": {
@@ -60,8 +60,8 @@
60
60
  "tsx": "^4.21.0",
61
61
  "typescript": "^5.3.3",
62
62
  "vitest": "^1.2.2",
63
- "@vibeframe/core": "0.110.0",
64
- "@vibeframe/cli": "0.110.0"
63
+ "@vibeframe/cli": "0.111.1",
64
+ "@vibeframe/core": "0.111.1"
65
65
  },
66
66
  "engines": {
67
67
  "node": ">=20"