# clip_enhance MCP tool

Zooms and chroma key.

{/* Generated by landing/scripts/generate-mcp-docs.ts. Do not edit. */}

MCP name `clip_enhance` dispatches to renderer `clipEnhance`.

Does not use hosted quota. Local editor operation.

Zooms and chroma key. action addZoom adds Vidova zoom segments. action manageZooms lists/adds/updates/deletes zooms; pass zoomAction as list, add, update, or delete. action chromaKey keys a video or image clip. Editor must be open. Does not use hosted quota. Local editor operation.

## Advertised MCP input

This tool is registered with **passthrough**. The fields below are what `listTools` advertises. The renderer still validates the child fields for the chosen action or kind. Extra advertised-only values are documented under Reachable behavior.

| Field | Type | Required | Constraints | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `action` | enum("addZoom", "manageZooms", "chromaKey") | yes | — | — | action for clip_enhance |
| `resultStart` | integer | no | min 0; max 9007199254740991 | 0 | First character offset to return. Use 0 for the first call. |
| `resultEnd` | integer | no | min 1; max 9007199254740991 | 8000 | Exclusive end offset. resultEnd - resultStart must be at most 8000. Increment resultStart by 8000 to page through large results. |

## Reachable behavior

Advertised action values match the renderer children: `addZoom`, `manageZooms`, `chromaKey`.

## Renderer child fields

These are the authoritative fields for each `action`. Send them on the same MCP call. Grouped MCP tools use passthrough, so these fields are not all listed in the advertised schema.

### `action=addZoom`

Renderer tool: `addZoomToVidovaClip`.

Add zoom effects to a vidova (screen recording) clip. Creates zoom clips on the associated zoom layer. Each zoom segment defines when the zoom starts, its duration, magnification factor, and behavior. Use 'tracking' zoomEffectType for cursor-following zooms (great for tutorials) and 'manual' for fixed-point zooms. Use getTimelineState first to find the vidova clip ID.

| Field | Type | Required | Constraints | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `clipId` | string | yes | minLength 1 | — | — |
| `zooms` | object[] | yes | minItems 1 | — | Array of zoom segments to add to the vidova clip |
| `zooms[].start` | number | yes | min 0 | — | Start time in seconds (relative to the vidova clip start) |
| `zooms[].duration` | number | yes | exclusiveMin 0 | — | Duration of the zoom effect in seconds |
| `zooms[].factor` | number | no | min 1; max 10 | 1.5 | Zoom magnification factor (1 = no zoom, 2 = 2x, etc.) |
| `zooms[].anchorX` | number | no | min -1; max 1 | 0 | Anchor X in range -1 to 1. 0 = center. Only used for manual zoom. |
| `zooms[].anchorY` | number | no | min -1; max 1 | 0 | Anchor Y in range -1 to 1. 0 = center. Only used for manual zoom. |
| `zooms[].zoomEffectType` | enum("tracking", "manual") | no | — | "tracking" | 'tracking' follows the cursor (default for screen recordings), 'manual' zooms to a fixed anchor point |
| `zooms[].trackType` | enum("cinematic", "centered") | no | — | "cinematic" | 'cinematic' = smooth follow, 'centered' = lock to cursor. Only applies when zoomEffectType is 'tracking'. |
| `zooms[].name` | string | no | — | — | Optional name for this zoom segment |
| `zooms[].depth` | object | no | strict | — | Optional 3D zoom. Set enabled:true to re-project the frame onto a tilted plane with real perspective instead of a flat scale. Angles (tiltX/tiltY/roll and glideTiltX/glideTiltY/glideRoll) are RADIANS in -0.35..0.35; focalLength is 24-120mm. The zoom eases into the tilt/roll/dolly pose, glides to the glide* pose while held, then eases flat. Omitted fields fall back to the defaults. |
| `zooms[].depth.enabled` | boolean | no | — | — | — |
| `zooms[].depth.intensity` | number | no | min 0; max 2 | — | — |
| `zooms[].depth.focalLength` | number | no | min 24; max 120 | — | — |
| `zooms[].depth.tiltX` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.tiltY` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.roll` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.dolly` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.glideTiltX` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.glideTiltY` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.glideRoll` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.glideDolly` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.anchorInfluence` | number | no | min 0; max 1 | — | — |
| `zooms[].depth.depthShading` | number | no | min 0; max 0.6 | — | — |
| `zooms[].depth.rim` | number | no | min 0; max 0.5 | — | — |
| `zooms[].depth.sheen` | number | no | min 0; max 0.6 | — | — |
| `zooms[].depth.depthBlur` | number | no | min 0; max 10 | — | — |
| `zooms[].depth.shadow` | number | no | min 0; max 0.6 | — | — |

### `action=manageZooms`

Renderer tool: `manageVidovaZooms`.

List, add, update, or delete the zoom regions on a vidova (screen recording) clip. Zoom regions live on the clip's linked zoom layer. Use zoomAction 'list' to discover zoom clip IDs before updating or deleting them.

| Field | Type | Required | Constraints | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `clipId` | string | yes | minLength 1 | — | — |
| `zoomAction` | enum("list", "add", "update", "delete") | yes | — | — | — |
| `zooms` | object[] | no | minItems 1 | — | — |
| `zooms[].start` | number | yes | min 0 | — | — |
| `zooms[].duration` | number | yes | exclusiveMin 0 | — | — |
| `zooms[].factor` | number | no | min 1; max 10 | 1.5 | — |
| `zooms[].anchorX` | number | no | min -1; max 1 | 0 | — |
| `zooms[].anchorY` | number | no | min -1; max 1 | 0 | — |
| `zooms[].zoomEffectType` | enum("tracking", "manual") | no | — | "tracking" | — |
| `zooms[].trackType` | enum("cinematic", "centered") | no | — | "cinematic" | — |
| `zooms[].name` | string | no | — | — | — |
| `zooms[].depth` | object | no | strict | — | — |
| `zooms[].depth.enabled` | boolean | no | — | — | — |
| `zooms[].depth.intensity` | number | no | min 0; max 2 | — | — |
| `zooms[].depth.focalLength` | number | no | min 24; max 120 | — | — |
| `zooms[].depth.tiltX` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.tiltY` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.roll` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.dolly` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.glideTiltX` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.glideTiltY` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.glideRoll` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.glideDolly` | number | no | min -0.35; max 0.35 | — | — |
| `zooms[].depth.anchorInfluence` | number | no | min 0; max 1 | — | — |
| `zooms[].depth.depthShading` | number | no | min 0; max 0.6 | — | — |
| `zooms[].depth.rim` | number | no | min 0; max 0.5 | — | — |
| `zooms[].depth.sheen` | number | no | min 0; max 0.6 | — | — |
| `zooms[].depth.depthBlur` | number | no | min 0; max 10 | — | — |
| `zooms[].depth.shadow` | number | no | min 0; max 0.6 | — | — |
| `updates` | object[] | no | minItems 1 | — | — |
| `updates[].zoomClipId` | string | yes | minLength 1 | — | — |
| `updates[].start` | number | no | min 0 | — | — |
| `updates[].duration` | number | no | exclusiveMin 0 | — | — |
| `updates[].factor` | number | no | min 1; max 10 | — | — |
| `updates[].anchorX` | number | no | min -1; max 1 | — | — |
| `updates[].anchorY` | number | no | min -1; max 1 | — | — |
| `updates[].zoomEffectType` | enum("tracking", "manual") | no | — | — | — |
| `updates[].trackType` | enum("cinematic", "centered") | no | — | — | — |
| `updates[].name` | string | no | — | — | — |
| `updates[].depth` | object | no | strict | — | — |
| `updates[].depth.enabled` | boolean | no | — | — | — |
| `updates[].depth.intensity` | number | no | min 0; max 2 | — | — |
| `updates[].depth.focalLength` | number | no | min 24; max 120 | — | — |
| `updates[].depth.tiltX` | number | no | min -0.35; max 0.35 | — | — |
| `updates[].depth.tiltY` | number | no | min -0.35; max 0.35 | — | — |
| `updates[].depth.roll` | number | no | min -0.35; max 0.35 | — | — |
| `updates[].depth.dolly` | number | no | min -0.35; max 0.35 | — | — |
| `updates[].depth.glideTiltX` | number | no | min -0.35; max 0.35 | — | — |
| `updates[].depth.glideTiltY` | number | no | min -0.35; max 0.35 | — | — |
| `updates[].depth.glideRoll` | number | no | min -0.35; max 0.35 | — | — |
| `updates[].depth.glideDolly` | number | no | min -0.35; max 0.35 | — | — |
| `updates[].depth.anchorInfluence` | number | no | min 0; max 1 | — | — |
| `updates[].depth.depthShading` | number | no | min 0; max 0.6 | — | — |
| `updates[].depth.rim` | number | no | min 0; max 0.5 | — | — |
| `updates[].depth.sheen` | number | no | min 0; max 0.6 | — | — |
| `updates[].depth.depthBlur` | number | no | min 0; max 10 | — | — |
| `updates[].depth.shadow` | number | no | min 0; max 0.6 | — | — |
| `zoomClipIds` | string[] | no | minItems 1 | — | — |

### `action=chromaKey`

Renderer tool: `applyChromaKeyToClip`.

Apply a chroma key (green screen) effect to a video or image clip. Makes the chosen key color transparent so you can composite over another background. Use getTimelineState to find clip IDs.

| Field | Type | Required | Constraints | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `clipId` | string | yes | minLength 1 | — | — |
| `color` | string | yes | pattern `^#[0-9a-fA-F]{3,6}$` | — | Key color to make transparent (hex) |
| `threshold` | number | no | min 0; max 1 | 0.4 | Tolerance 0–1: higher = more pixels become transparent |
| `smoothness` | number | no | min 0; max 1 | 0.1 | Edge softness 0–1 (optional) |

## Result window

Every local MCP tool accepts `resultStart` and `resultEnd` so large payloads can be paged.

- `resultStart` — first character offset. Default `0`.
- `resultEnd` — exclusive end offset. Default `8000`.
- `resultEnd - resultStart` must be at most **8000** characters.
- Increment `resultStart` by 8000 to read the next window.
