goatedit-mcp 1.1.23 → 1.1.25

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.
@@ -20208,7 +20208,8 @@ var BASE_TOOLS = [
20208
20208
  detail: { type: "string", enum: ["lean", "full"], description: "lean (default) or full, which adds effect parameters and every field." },
20209
20209
  trackId: str("Only this track."),
20210
20210
  from: num("Only clips that end after this time, in seconds."),
20211
- to: num("Only clips that start before this time, in seconds.")
20211
+ to: num("Only clips that start before this time, in seconds."),
20212
+ clipIds: { type: "array", items: { type: "string" }, description: 'Only these clips. Every filter applies to detail "full" too, so full detail for a few clips stays small.' }
20212
20213
  }
20213
20214
  },
20214
20215
  method: "getTimeline"
@@ -20219,10 +20220,10 @@ var BASE_TOOLS = [
20219
20220
  inputSchema: {
20220
20221
  type: "object",
20221
20222
  properties: {
20223
+ clipId: str("One clip id. Use clipIds for several."),
20222
20224
  clipIds: { type: "array", items: { type: "string" }, description: "Clip ids from get_timeline, up to 50." },
20223
20225
  includeHtml: bool("For HTML clips, also return the markup (html), its slot fills and vars \u2014 what update_html_clip starts from. Long markup is cut at 200 KB.")
20224
- },
20225
- required: ["clipIds"]
20226
+ }
20226
20227
  },
20227
20228
  method: "getClips"
20228
20229
  },
@@ -20250,8 +20251,16 @@ var BASE_TOOLS = [
20250
20251
  },
20251
20252
  {
20252
20253
  name: "get_media_bin",
20253
- description: "List every media file imported into the project, with id, name, type and duration.",
20254
- inputSchema: { type: "object", properties: {} },
20254
+ description: 'List the media files imported into the project. A bin of 40 files or fewer, asked with no filter, comes back whole. A bigger one, or any filtered ask, comes back as one short row per file (id, name, type, duration, size, status) under { total, matched, files }; narrow it with name, type or ids, and pass detail: "full" for whole records. To see what a file looks like, use preview_media.',
20255
+ inputSchema: {
20256
+ type: "object",
20257
+ properties: {
20258
+ name: str("Only files whose name contains this (any case)."),
20259
+ type: { type: "string", description: "Only this type: video, audio, image, html, lottie, model3d, showcase, text." },
20260
+ ids: { type: "array", items: { type: "string" }, description: "Only these file ids." },
20261
+ detail: { type: "string", enum: ["lean", "full"], description: "full: whole records for the files matched." }
20262
+ }
20263
+ },
20255
20264
  method: "getMediaFiles"
20256
20265
  },
20257
20266
  {
@@ -21177,6 +21186,7 @@ var BASE_TOOLS = [
21177
21186
  items: { type: "object" }
21178
21187
  },
21179
21188
  clear: bool("Remove this property's keyframes instead of setting them, leaving the clip's flat value in charge again."),
21189
+ offset: { description: 'With prop "position" or "scale" and no keyframes: move the animation as it is. Every existing key of both halves is shifted ([dx, dy] added to position) or scaled (a number or [sx, sy] multiplying scale), times and eases kept; a track with no keys has its resting value moved instead. The way to nudge an animated layer or a whole pile without rewriting its keys.' },
21180
21190
  relative: bool("Values are relative to where the layer rests: multiples of its scale/opacity (1.1 = 10% bigger than it is), offsets for everything else (posX +0.05, rotation +15). A punch-in on a card scaled 0.3 stays a punch-in instead of jumping to full size."),
21181
21191
  expression: {
21182
21192
  type: "string",
@@ -21196,7 +21206,7 @@ var BASE_TOOLS = [
21196
21206
  clipId: CLIP_ID,
21197
21207
  type: {
21198
21208
  type: "string",
21199
- description: "Effect type: blur, invert, hue, saturation, brightness, contrast, exposure, grayscale, sepia, gradientMap, vignette, filmGrain, flicker, posterizeTime, lensDistortion, chromaticAberration, lensFlare, liquidGlass, opacityFx, colorCorrection, depthMap, depthParticles, gradientMap, vegas, glow, pixelDissolve, motionBlur, dropShadow, reflection, colorama, outline, echo, flutedGlass, lightRays, halftone, datamosh, roughenEdges, filmStock, halation, starGlow, filmDamage, lightLeak, thermal, colorBalance, duotone, levels, monochrome, channelMixer, dither, threshold, fourColorGradient, lensBlur, boxBlur, directionalBlur, spinBlur, zoomBlur, sharpen, cameraShake, bulge, twirl, ripple, waveWarp, polarCoords, turbulentDisplace, elasticGrid, gridSplit, cubify, glitch, vhs, ntsc, crtScreen, ledScreen, rgbSplit, jpegGlitch, ascii, macpaint, modulation, stripe, risograph, emboss, bevel, inkBleed, paperTexture, paperCutout, crossHatch, scatter, blobTracker, edgeGlow, pageTurn, lightSweep, deepGlow, twister, fill, compositeOriginal, grid, repeater, plus transform, cornerPin (AE Corner Pin: perspective quad from four corners), layer3d, camera3d (on a camera clip; use set_camera), model3d and showcase. Call describe_effect with a type for its parameters, their ranges and what they do before setting anything but the obvious. An unknown name comes back with the full list."
21209
+ description: "Effect type: blur, invert, hue, saturation, brightness, contrast, exposure, grayscale, sepia, gradientMap, vignette, filmGrain, flicker, posterizeTime, lensDistortion, chromaticAberration, lensFlare, liquidGlass, opacityFx, colorCorrection, depthMap, depthParticles, gradientMap, vegas, glow, pixelDissolve, motionBlur, dropShadow, reflection, colorama, outline, echo, flutedGlass, lightRays, halftone, datamosh, roughenEdges, filmStock, halation, starGlow, filmDamage, lightLeak, thermal, colorBalance, duotone, levels, monochrome, channelMixer, dither, threshold, fourColorGradient, fractalNoise, lensBlur, boxBlur, directionalBlur, spinBlur, zoomBlur, sharpen, cameraShake, bulge, twirl, ripple, waveWarp, polarCoords, turbulentDisplace, elasticGrid, gridSplit, cubify, glitch, vhs, ntsc, crtScreen, ledScreen, rgbSplit, jpegGlitch, ascii, macpaint, modulation, stripe, risograph, emboss, bevel, inkBleed, paperTexture, paperCutout, crossHatch, scatter, blobTracker, edgeGlow, pageTurn, lightSweep, deepGlow, twister, fill, compositeOriginal, grid, repeater, plus transform, cornerPin (AE Corner Pin: perspective quad from four corners), layer3d, camera3d (on a camera clip; use set_camera), model3d and showcase. Call describe_effect with a type for its parameters, their ranges and what they do before setting anything but the obvious. An unknown name comes back with the full list."
21200
21210
  },
21201
21211
  params: {
21202
21212
  type: "object",
@@ -21438,7 +21448,8 @@ var BASE_TOOLS = [
21438
21448
  posX: num("Horizontal centre as a fraction of the frame, 0..1. 0.5 is centre."),
21439
21449
  posY: num("Vertical centre as a fraction of the frame, 0..1. 0.5 is centre."),
21440
21450
  scale: num('Uniform scale, 1 being unchanged. With size "native", a multiplier on the native size.'),
21441
- size: str(`"fit" (default): like any picture, the width x height box is fitted inside the frame, so a 600x200 card fills the frame width. "native": one authored px is one frame px, so a 600x200 card is 600x200 on screen. Use native for UI pieces authored at their real size. The result's onScreen gives the box in frame px either way.`),
21451
+ rotation: num("Rotation in degrees."),
21452
+ size: str(`"fit" (default): like any picture, the width x height box is fitted inside the frame, so a 600x200 card fills the frame width. "native": one authored px is one frame px, so a 600x200 card is 600x200 on screen. Use native for UI pieces authored at their real size. The result's onScreen gives the box in frame px either way. The clip's stored scale stays relative to the fitted box (onScreen.nativeScale is native size), so set_clip_transform and scale keys later take that number, not 1; set_clip_transform on an html clip replies with onScreen too.`),
21442
21453
  opacity: num("Opacity, 0..1. Defaults to 1."),
21443
21454
  name: str("Display name for the clip and its bin entry.")
21444
21455
  },
@@ -21448,12 +21459,17 @@ var BASE_TOOLS = [
21448
21459
  },
21449
21460
  {
21450
21461
  name: "update_html_clip",
21451
- description: "Change an HTML clip made with create_html_clip in place: new markup, some of its --custom-property `vars`, its `slots`, or its render size. The clip keeps its id, position, keyframes, parent and effects \u2014 revise a snippet with this, never by removing and re-creating it. `vars` and `slots` merge over the current values, so pass only what changes. New `html` clears slot overrides (slot ids are element order) unless `slots` is given in the same call. Every clip playing the same snippet changes with it; the reply says how many.",
21462
+ description: "Change an HTML clip made with create_html_clip in place: new markup (or a find-and-replace patch on it), some of its --custom-property `vars`, its `slots`, or its render size. The clip keeps its id, position, keyframes, parent and effects \u2014 revise a snippet with this, never by removing and re-creating it. `vars` and `slots` merge over the current values, so pass only what changes. New `html` clears slot overrides (slot ids are element order) unless `slots` is given in the same call. Every clip playing the same snippet changes with it; the reply says how many.",
21452
21463
  inputSchema: {
21453
21464
  type: "object",
21454
21465
  properties: {
21455
21466
  clipId: str("The HTML clip."),
21456
21467
  html: str("Replacement markup, with its <style> inline."),
21468
+ replace: {
21469
+ type: "array",
21470
+ description: "Patch the current markup instead of resending it: [{ find, with, all? }], exact text, applied in order. Each find must appear once unless all: true. Read the markup with get_clip includeHtml: true. Not with html.",
21471
+ items: { type: "object", properties: { find: { type: "string" }, with: { type: "string" }, all: { type: "boolean" } }, required: ["find", "with"] }
21472
+ },
21457
21473
  vars: { type: "object", description: 'CSS custom properties to change, e.g. { "--accent": "#ff5a1f" }. Merged over the current ones.' },
21458
21474
  slots: { type: "object", description: "Slot fills to change, keyed by slot id, as in create_html_clip. Merged over the current ones." },
21459
21475
  width: num("New render width in pixels."),
@@ -25694,6 +25710,13 @@ async function callTool(name, args) {
25694
25710
  }
25695
25711
  if (name === "import_local_file") return withOpIdHint(importLocalFile(forwarded, target), forwarded.opId);
25696
25712
  const result = await withOpIdHint(sendToBrowser(tool.method, forwarded, target), forwarded.opId);
25713
+ if (!projectId && target && !READ_ONLY_TOOLS.has(tool.name) && result && typeof result === "object" && !Array.isArray(result)) {
25714
+ const open = connectedProjects();
25715
+ if (open.length > 1) {
25716
+ const landed = open.find((p) => p.projectId === target);
25717
+ result.routedTo = `${landed?.name ?? "untitled"} (${target}), the use_project default. ${open.length} projects are open; pass projectId if you meant another.`;
25718
+ }
25719
+ }
25697
25720
  const withFile = saveFileToDisk(result);
25698
25721
  return saveToDisk ? saveFramesToDisk(withFile, name) : withFile;
25699
25722
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goatedit-mcp",
3
- "version": "1.1.23",
3
+ "version": "1.1.25",
4
4
  "description": "Local MCP server for the GoatEdit video editor: drive your open editor tab from Claude Code or any MCP client",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",