此 MCP 可以做什么
Enables creating, animating, and exporting layered short-form video projects.
工具
输入模式
{'type': 'object', 'required': ['filename', 'startFrame', 'projectId'], 'properties': {'gain': {'type': 'number', 'description': 'Linear gain 0..2. Default 1.'}, 'name': {'type': 'string', 'description': "Optional label people see on the track: pass the upload's returned `name`."}, 'endFrame': {'type': 'number', 'description': "Optional end frame; omit to play the asset's full natural length from startFrame."}, 'filename': {'type': 'string', 'description': 'The stored audio filename an upload returned.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'startFrame': {'type': 'number', 'description': 'Frame at which the overlay starts (0-indexed, 30 fps).'}, 'fadeInFrames': {'type': 'number', 'description': 'Linear fade-in length in frames. Default 0.'}, 'fadeOutFrames': {'type': 'number', 'description': 'Linear fade-out length in frames. Default 0.'}, 'sourceLayerId': {'type': 'string', 'description': 'Optional video layer element id ("video.<id>") to weld this overlay to. When set, the editor renders the overlay as a waveform footer on that clip and drags it with the clip instead of showing a standalone bottom row.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['lines', 'projectId'], 'properties': {'x': {'type': 'number', 'description': 'Caption band centre x. Default canvas centre.'}, 'y': {'type': 'number', 'description': 'Caption band centre y. Default lower third (~80% of height).'}, 'mode': {'enum': ['line-sync', 'static'], 'type': 'string', 'description': '"line-sync" (default): one timed layer per line. "static": one layer with all lines.'}, 'lines': {'type': 'array', 'items': {'type': 'object', 'required': ['text', 'startFrame'], 'properties': {'text': {'type': 'string'}, 'endFrame': {'type': 'number', 'description': 'Project frame the line disappears (defaults to startFrame + 30).'}, 'startFrame': {'type': 'number', 'description': 'Project frame the line appears.'}, 'clip_element_id': {'type': 'string', 'description': 'Optional per-line weld clip ("video.<id>"), overriding the top-level clip_element_id. Routes THIS line onto a specific lane clip — used to spread one montage\'s lines across the several clips that a single source was split into, so each line rides the clip that shows its words.'}}}, 'description': 'Caption lines in order. Each: { text, startFrame, endFrame } — frames are 0-indexed at 30fps.'}, 'style': {'enum': ['classic', 'bold-outline', 'word-pop'], 'type': 'string', 'description': 'Caption look preset. Default "classic".'}, 'width': {'type': 'number', 'description': 'Band width. Default ~86% of canvas width.'}, 'height': {'type': 'number', 'description': 'Band height. Default ~16% of canvas height.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'clip_element_id': {'type': 'string', 'description': 'Optional "video.<id>" to WELD the caption lines to (line-sync mode). When set, each line\'s startFrame/endFrame are treated as its window in the clip\'s OWN source timeline and the on-timeline position is derived live from the clip\'s trim — so trimming or sliding the clip retimes/clips the captions, exactly like the clip\'s welded audio. Omit for fixed project-frame captions.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'property', 'frame', 'value', 'projectId'], 'properties': {'frame': {'type': 'number', 'description': 'Frame number, 0-indexed. 30 fps so frame 30 = 1 second.'}, 'value': {'type': ['string', 'object'], 'description': 'Either \'#rrggbb\' (promoted to solid) or a Fill object: {type:"solid",color} / {type:"linear",stops:[{pos:0..1,color}],angle?} / {type:"radial",stops:[{pos:0..1,color}],cx?,cy?,radius?}. Adjacent keyframes crossfade the gradient stop-by-stop.'}, 'easing': {'enum': ['linear', 'easeIn', 'easeOut', 'easeInOut', 'outQuart', 'outExpo', 'outBack', 'inBack', 'inOutBack', 'cubicBezier', 'hold'], 'type': 'string', 'description': 'Interpolation to the next keyframe. Default linear.'}, 'property': {'enum': ['fill'], 'type': 'string', 'description': "Currently only 'fill' is supported."}, 'elementId': {'type': 'string', 'description': "Element id (shapes/image/video/group prefixed). The pinned is_background image_layer is the canvas backdrop; 'background.canvas' is also accepted as a synonym."}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['x1', 'y1', 'x2', 'y2', 'projectId'], 'properties': {'x1': {'type': 'number', 'description': 'Start x (canvas px).'}, 'x2': {'type': 'number', 'description': 'End x (canvas px) — the arrowhead end.'}, 'y1': {'type': 'number', 'description': 'Start y (canvas px).'}, 'y2': {'type': 'number', 'description': 'End y (canvas px).'}, 'bend': {'type': 'number', 'description': 'Perpendicular bow of the curve in px. 0 = straight.'}, 'color': {'type': 'string', 'description': 'Stroke colour as #rrggbb.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'arrow_head': {'enum': ['none', 'end', 'both'], 'type': 'string'}, 'stroke_width': {'type': 'number', 'description': 'Line thickness in px.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['origin', 'projectId'], 'properties': {'origin': {'type': 'string', 'description': 'Hostname or URL to allow, e.g. "example.com" or "https://example.com". Normalized to a bare lowercased hostname.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'sourceProjectId', 'elementId'], 'properties': {'elementId': {'type': 'string', 'description': "The item's element id (from list_collection) — any leaf or group.<id>."}, 'projectId': {'type': 'string', 'description': 'Destination project the item is copied INTO.'}, 'sourceProjectId': {'type': 'string', 'description': "The item's home project id (from list_collection)."}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['filename', 'x', 'y', 'width', 'height', 'projectId'], 'properties': {'x': {'type': 'number', 'description': 'Centre x in 1080-wide base coords.'}, 'y': {'type': 'number', 'description': 'Centre y in 1920-tall base coords.'}, 'name': {'type': 'string', 'description': "Optional label people see in the Inspector and Timeline: pass the upload's returned `name`. Without it the layer is labelled by an older project's own filename, or by kind; never by a stored id."}, 'block': {'type': 'object', 'required': ['start', 'duration'], 'properties': {'start': {'type': 'number', 'description': 'First visible composition frame (≥ 0).'}, 'duration': {'type': 'number', 'description': 'Length of the window in frames (≥ 1).'}}, 'description': "OPTIONAL timeline window — {start, duration} in composition frames. OMIT IT (the default) and the layer is ALWAYS PRESENT: a persistent overlay that holds for the whole composition, which is what an agent-placed watermark / lower-third almost always wants. Pass it to place a bounded CLIP instead (what the editor's own add does: 5 s at the playhead). Keyframes on a blocked layer are sampled RELATIVE to `start`."}, 'width': {'type': 'number', 'description': 'Width in px (must be > 0).'}, 'height': {'type': 'number', 'description': 'Height in px (must be > 0).'}, 'filename': {'type': 'string', 'description': "The stored filename an upload returned (an id such as 3f2a9c1e-….png, or an older project's own name)."}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'property', 'frame', 'value', 'projectId'], 'properties': {'frame': {'type': 'number', 'description': 'Frame number, 0-indexed. 30 fps so frame 30 = 1 second.'}, 'value': {'type': 'number', 'description': 'Track value at this frame.'}, 'easing': {'enum': ['linear', 'easeIn', 'easeOut', 'easeInOut', 'outQuart', 'outExpo', 'outBack', 'inBack', 'inOutBack', 'cubicBezier', 'hold'], 'type': 'string', 'description': 'Interpolation to the next keyframe. Default linear.'}, 'property': {'enum': ['x', 'y', 'width', 'height', 'scale', 'rotation', 'opacity', 'curve'], 'type': 'string'}, 'elementId': {'type': 'string', 'description': 'Layer id (video.<id>, image.<id>, shapes.<id>, or group.<id>).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'property', 'keyframes', 'projectId'], 'properties': {'loop': {'enum': ['hold', 'loop', 'ping-pong', 'cycle'], 'type': 'string', 'description': "Optional extrapolation mode applied to this track in the same call. Default 'hold'."}, 'property': {'enum': ['x', 'y', 'width', 'height', 'scale', 'rotation', 'opacity', 'curve'], 'type': 'string'}, 'elementId': {'type': 'string', 'description': 'Layer id (video.<id>, image.<id>, shapes.<id>, text.<id>, or group.<id>).'}, 'keyframes': {'type': 'array', 'items': {'type': 'object', 'required': ['frame', 'value'], 'properties': {'frame': {'type': 'number', 'description': 'Frame number, 0-indexed (30 fps).'}, 'value': {'type': 'number', 'description': 'Track value at this frame.'}, 'easing': {'enum': ['linear', 'easeIn', 'easeOut', 'easeInOut', 'outQuart', 'outExpo', 'outBack', 'inBack', 'inOutBack', 'cubicBezier', 'hold'], 'type': 'string', 'description': 'Interpolation to the next keyframe. Default linear.'}}}, 'description': 'Keyframes for this track (one or more).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['source_morpha_id', 'projectId'], 'properties': {'version': {'type': 'string', 'description': 'Optional version label of the source to pin (e.g. "v3"). Omit to pin the source\'s latest saved version.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'source_morpha_id': {'type': 'string', 'description': 'The id of the project to embed. Must not be this project.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'name': {'type': 'string', 'description': 'Optional name for the new page.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'duplicate_index': {'type': 'number', 'description': 'Optional. 0-based index of an existing page to deep-copy instead of appending a blank one.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['kind', 'projectId'], 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}, 'kind': {'enum': ['rect', 'ellipse', 'triangle', 'star', 'pentagon', 'hexagon', 'arrow', 'heart', 'rounded-rect', 'diamond', 'parallelogram', 'trapezoid', 'semicircle', 'ring', 'pill', 'cross', 'heptagon', 'octagon', 'star-4', 'star-6', 'sparkle', 'burst', 'arrow-left', 'double-arrow', 'chevron', 'block-arrow-up', 'curve', 'lightning', 'speech-bubble', 'location-pin', 'checkmark', 'x-mark', 'shield', 'cloud', 'crescent', 'teardrop', 'banner'], 'type': 'string'}, 'block': {'type': 'object', 'required': ['start', 'duration'], 'properties': {'start': {'type': 'number', 'description': 'First visible composition frame (≥ 0).'}, 'duration': {'type': 'number', 'description': 'Length of the window in frames (≥ 1).'}}, 'description': "OPTIONAL timeline window — {start, duration} in composition frames. OMIT IT (the default) and the layer is ALWAYS PRESENT: a persistent overlay that holds for the whole composition, which is what an agent-placed watermark / lower-third almost always wants. Pass it to place a bounded CLIP instead (what the editor's own add does: 5 s at the playhead). Keyframes on a blocked layer are sampled RELATIVE to `start`."}, 'color': {'type': 'string', 'description': 'Fill colour as #rrggbb.'}, 'width': {'type': 'number'}, 'height': {'type': 'number'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'frame', 'rate', 'projectId'], 'properties': {'rate': {'type': 'number', 'description': 'Playback rate at this frame (1 = real-time, in [0.1, 8]).'}, 'frame': {'type': 'number', 'description': 'Project-timeline frame number.'}, 'elementId': {'type': 'string', 'description': 'video.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'x': {'type': 'number', 'description': 'Centre x in canvas px. Defaults to canvas centre.'}, 'y': {'type': 'number', 'description': 'Centre y in canvas px. Defaults to canvas centre.'}, 'text': {'type': 'string', 'description': 'The text to render. Newlines are honoured as hard line breaks.'}, 'block': {'type': 'object', 'required': ['start', 'duration'], 'properties': {'start': {'type': 'number', 'description': 'First visible composition frame (≥ 0).'}, 'duration': {'type': 'number', 'description': 'Length of the window in frames (≥ 1).'}}, 'description': "OPTIONAL timeline window — {start, duration} in composition frames. OMIT IT (the default) and the layer is ALWAYS PRESENT: a persistent overlay that holds for the whole composition, which is what an agent-placed watermark / lower-third almost always wants. Pass it to place a bounded CLIP instead (what the editor's own add does: 5 s at the playhead). Keyframes on a blocked layer are sampled RELATIVE to `start`."}, 'curve': {'type': 'number', 'description': 'Curve the text onto an arc, in degrees of total sweep. 0 = straight (default). POSITIVE = a SMILE (⌣, ends rise); NEGATIVE = an ARCH (⌒, rainbow). Clamped ±135. A tasteful smile is ~+60. Single line only (multi-line is joined while curved).'}, 'width': {'type': 'number', 'description': 'Box width in px (> 0). Default 900.'}, 'height': {'type': 'number', 'description': 'Box height in px (> 0). Default 320.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'text_size': {'type': 'number', 'description': 'Font size in px. Omit to derive from existing text layers (median) or the canvas height.'}, 'font_style': {'enum': ['normal', 'italic'], 'type': 'string', 'description': 'Italic toggle. Default normal.'}, 'text_align': {'enum': ['left', 'center', 'right'], 'type': 'string', 'description': 'Horizontal alignment of each line. Default center.'}, 'text_color': {'type': 'string', 'description': 'Text fill colour as #rrggbb. Defaults to white.'}, 'decorations': {'type': ['object', 'null'], 'properties': {'underline': {'type': 'array', 'items': {'type': 'object', 'properties': {'end': {'type': 'number'}, 'start': {'type': 'number'}}}}, 'strikethrough': {'type': 'array', 'items': {'type': 'object', 'properties': {'end': {'type': 'number'}, 'start': {'type': 'number'}}}}}, 'description': 'Per-character underline / strikethrough. { underline?: [{start,end}], strikethrough?: [{start,end}] } — half-open character ranges [start,end) (UTF-16 offsets) into `text`. E.g. underline the first word of "Big news": underline:[{start:0,end:3}]. Ranges are normalized (sorted + merged). Not rendered on curved text.'}, 'font_family': {'type': 'string', 'description': 'Google Fonts family name, e.g. "Anton". Defaults to "Hanken Grotesk".'}, 'font_weight': {'type': 'number', 'description': 'Font weight 100..900 (400 regular, 700 bold, 800 black). Default 400.'}, 'line_height': {'type': 'number', 'description': 'Line height as a multiple of font size (1.2 = 120%).'}, 'text_shadow': {'type': ['object', 'null'], 'properties': {'blur': {'type': 'number'}, 'color': {'type': 'string'}, 'offsetX': {'type': 'number'}, 'offsetY': {'type': 'number'}}, 'description': 'Drop shadow { offsetX, offsetY, blur, color }; color is any CSS colour (rgba allowed). null clears it.'}, 'text_valign': {'enum': ['top', 'middle', 'bottom'], 'type': 'string', 'description': 'Vertical alignment of the text block within its box. "middle" (default) centres it; "bottom" pins it to the box floor so extra wrapped lines grow upward from a fixed baseline (captions use this so a wrapped line doesn\'t shift the others); "top" pins the ceiling.'}, 'stroke_color': {'type': 'string', 'description': 'Outline colour as #rrggbb. Defaults to white when a width is set.'}, 'stroke_width': {'type': 'number', 'description': 'Outline width in px (0 = no outline).'}, 'text_autofit': {'enum': ['fit', 'shrink', 'wrap', 'hug'], 'type': 'string', 'description': 'How text fits its box. "hug" (default for new layers): hold text_size FIXED and DERIVE the box from the measured text plus padding, honouring the literal newlines you pass — the box shrink-wraps the exact content and grows/shrinks live as the text changes, so it can never re-wrap differently between the editor preview and the export (bake your own "\\n" breaks; pair with set_text_background for a rounded caption box). "wrap": hold text_size FIXED in a fixed-size box and only word-wrap (hard-breaking a single over-wide word), never resize. "fit": ignore text_size and auto-size the font BOTH ways (grow and shrink) to the largest size whose wrapped block fills the box — resizing the box resizes the text. "shrink" (legacy): word-wrap then auto-shrink the font from text_size until the block fits; never grows.'}, 'letter_spacing': {'type': 'number', 'description': 'Tracking between glyphs in px; may be negative. Default 0.'}, 'text_transform': {'enum': ['none', 'uppercase', 'lowercase'], 'type': 'string', 'description': 'Case transform applied before layout. Default none.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'projectId'], 'properties': {'elementId': {'type': 'string', 'description': 'The element id to add — any leaf (text/image/video/shapes.<id>) or a group.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['clip', 'x', 'y', 'width', 'height', 'projectId'], 'properties': {'x': {'type': 'number', 'description': 'Centre x in 1080-wide base coords.'}, 'y': {'type': 'number', 'description': 'Centre y in 1920-tall base coords.'}, 'clip': {'type': 'string', 'description': "The stored clip filename an upload returned (an id such as 3f2a9c1e-….mp4, or an older project's own name)."}, 'name': {'type': 'string', 'description': "Optional label people see in the Inspector and Timeline: pass the upload's returned `name`."}, 'width': {'type': 'number', 'description': 'Width in px (must be > 0).'}, 'height': {'type': 'number', 'description': 'Height in px (must be > 0).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'preset', 'projectId'], 'properties': {'preset': {'enum': ['fade-in', 'fade-out', 'pulse', 'slide-in-left', 'slide-in-right', 'slide-up', 'shake', 'pop'], 'type': 'string'}, 'elementId': {'type': 'string'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'startFrame': {'type': 'number', 'description': 'Frame to anchor on. Default 0.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementIds', 'preset', 'projectId'], 'properties': {'preset': {'enum': ['fade-in', 'fade-out', 'pulse', 'slide-in-left', 'slide-in-right', 'slide-up', 'shake', 'pop'], 'type': 'string'}, 'stagger': {'type': 'number', 'description': 'Frames between successive elements. Default 1.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'elementIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Layers to animate, ordered as the cascade should fire (first id gets startFrame; each next gets +stagger frames).'}, 'startFrame': {'type': 'number', 'description': 'Base frame for the first element. Default 0.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'clip': {'type': 'string', 'description': 'Optional clip filename (video.<id>.clip). Omit to report every video clip in the project.'}, 'projectId': {'type': 'string', 'description': 'Project the clip(s) belong to.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': "Recommended human-readable label, shown verbatim in the editor's project picker (the only user-facing handle for the project). Omit and the picker falls back to the opaque id."}, 'workspaceId': {'type': ['string', 'null'], 'description': "Where to place the project. Omit to FOLLOW THE SOURCE (a clone inherits its source's workspace; a blank project is personal). A workspace id (from list_workspaces) places it there — requires an edit-capable role. null forces the caller's personal space."}, 'fromProjectId': {'type': 'string', 'description': 'Optional id of an existing project to CLONE (copies its JSON + uploaded assets + clips). Omit to create a fresh blank project.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': 'object', 'required': ['projectId', 'editorUrl'], 'properties': {'claimUrl': {'type': 'string', 'description': 'Present only when the caller is an anonymous account: the link that hands its projects to a person.'}, 'editorUrl': {'type': 'string', 'description': 'A link that opens this project in the editor.'}, 'projectId': {'type': 'string', 'description': "The new project's opaque id."}, 'clipsCopied': {'type': 'number', 'description': 'How many source clips the clone copied.'}, 'workspaceId': {'type': ['string', 'null'], 'description': 'The workspace it landed in, or null for Personal.'}, 'assetsCopied': {'type': 'number', 'description': 'How many assets the clone copied.'}, 'fromProjectId': {'type': ['string', 'null'], 'description': 'The project it was cloned from, or null for a blank one.'}}, 'description': 'The project that was created, blank or cloned.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'name'], 'properties': {'name': {'type': 'string', 'description': "The file's own name or path on disk, with its extension (e.g. hero.jpg). `command` uploads that path, people see its last segment, and the file is stored under a new id."}, 'projectId': {'type': 'string', 'description': 'Project the file goes into.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': 'object', 'required': ['uploadUrl', 'filename', 'name', 'contentType', 'maxBytes', 'expiresAt', 'command'], 'properties': {'name': {'type': 'string', 'description': "The file's display name, what people see: the last segment of the name you passed."}, 'command': {'type': 'string', 'description': 'The curl line to run from a shell; it names the file as you passed it.'}, 'filename': {'type': 'string', 'description': "The file's id: what add_image_layer, add_audio_overlay and set_custom_font take. Never shown to a person."}, 'maxBytes': {'type': 'number', 'description': 'The largest file the link takes, in bytes.'}, 'expiresAt': {'type': 'string', 'description': 'When the link stops working, ISO 8601.'}, 'uploadUrl': {'type': 'string', 'description': "Where to PUT the file's raw bytes. Good for 15 minutes."}, 'contentType': {'type': 'string', 'description': 'The MIME type the file will be served as.'}}, 'description': "A link that takes one file from the caller's disk, and the command that sends it."}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Human-readable workspace name, shown verbatim in the workspace switcher.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['startFrame', 'endFrame', 'projectId'], 'properties': {'endFrame': {'type': 'number', 'description': 'End frame of the window to remove (0-indexed, EXCLUSIVE). Must be > startFrame; clamped to the composition length.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'startFrame': {'type': 'number', 'description': 'First frame of the window to remove (0-indexed, inclusive).'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['index', 'projectId'], 'properties': {'index': {'type': 'number', 'description': '0-based index of the page to remove.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'projectId': {'type': 'string', 'description': 'Project to delete.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'versionId'], 'properties': {'projectId': {'type': 'string', 'description': 'Project whose version to delete.'}, 'versionId': {'type': 'string', 'description': 'Version to delete. UUID `id` or `v<N>` shorthand.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'clip': {'type': 'string', 'description': 'Video clip filename (the same value as `video.<id>.clip`). Pass this OR `image`.'}, 'image': {'type': 'string', 'description': 'Image layer filename (the same value as `image.<id>.filename`). Pass this OR `clip`.'}, 'projectId': {'type': 'string', 'description': 'Project the clip/image belongs to.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'count', 'projectId'], 'properties': {'dx': {'type': 'number', 'description': 'Per-step x offset in px.'}, 'dy': {'type': 'number', 'description': 'Per-step y offset in px.'}, 'count': {'type': 'number', 'description': 'Number of copies to create.'}, 'd_scale': {'type': 'number', 'description': 'Per-step size multiplier (1 = no change).'}, 'elementId': {'type': 'string', 'description': 'Leaf to clone (e.g. shapes.chevron-1).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'd_rotation': {'type': 'number', 'description': 'Per-step rotation in degrees.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'name': {'type': 'string', 'description': 'Optional name for the copy. Shown verbatim in the picker; defaults to "<source name> copy".'}, 'projectId': {'type': 'string', 'description': 'Id of the existing project to duplicate (the source).'}, 'workspaceId': {'type': ['string', 'null'], 'description': 'Optional override for where the copy lives. Omit to FOLLOW THE SOURCE (a workspace project stays in its workspace; a personal one stays personal). A workspace id (from list_workspaces) places the copy there — you need an edit-capable role. null forces the copy into your personal space.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'fromFrame', 'toFrame', 'fromOpacity', 'toOpacity', 'projectId'], 'properties': {'toFrame': {'type': 'number'}, 'elementId': {'type': 'string'}, 'fromFrame': {'type': 'number'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'toOpacity': {'type': 'number', 'description': '0..1.'}, 'fromOpacity': {'type': 'number', 'description': '0..1.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'frame', 'image', 'projectId'], 'properties': {'frame': {'type': 'number', 'description': 'Project-timeline frame to freeze at — must be strictly inside the clip.'}, 'image': {'type': 'string', 'description': "Filename of an already-uploaded PNG of the frozen frame, in the project's assets."}, 'elementId': {'type': 'string', 'description': 'video.<id> to freeze.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'holdFrames': {'type': 'number', 'description': 'How long the still holds, in frames. Defaults to 150 (5s at 30fps), the same default every added clip gets.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementIds', 'projectId'], 'properties': {'name': {'type': 'string', 'description': 'Optional human-readable label.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'elementIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Element ids of the elements to wrap. Must all share the same parent.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementIds', 'projectId'], 'properties': {'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'elementIds': {'type': 'array', 'items': {'type': 'string'}, 'description': "Element ids to inspect (image.<id>, video.<id>, text.<id>, shapes.<id>, group.<id>). Read them from describe_video's tree."}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': [], 'properties': {}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'q': {'type': 'string', 'description': 'Case-insensitive substring filter on family name. Omit to list everything.'}, 'limit': {'type': 'number', 'description': 'Max entries to return (default 50, max 1000).'}, 'source': {'enum': ['google', 'bunny', 'fontshare', 'fontsource', 'velvetyne', 'custom'], 'type': 'string', 'description': 'Restrict to one source. Omit to span every source. "custom" returns only the project\'s uploaded faces.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': [], 'properties': {'workspaceId': {'type': 'string', 'description': "Optional workspace id (from list_workspaces). When given, lists that workspace's projects instead of the caller's personal ones; requires membership. Omit for personal projects."}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': 'object', 'required': ['projects'], 'properties': {'claimUrl': {'type': 'string', 'description': 'Present only when the caller is an anonymous account: the link that hands its projects to a person.'}, 'projects': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'editorUrl'], 'properties': {'id': {'type': 'string', 'description': "Opaque project id: what every other tool's `projectId` takes."}, 'name': {'type': 'string', 'description': 'The label a person sees ("Untitled" when unnamed). Refer to a project by this, never by its id.'}, 'editorUrl': {'type': 'string', 'description': 'A link that opens this project in the editor.'}}, 'description': 'One project.'}, 'description': 'One entry per project, newest first.'}}, 'description': "The caller's projects."}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'projectId': {'type': 'string', 'description': 'Project whose versions to list.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': [], 'properties': {}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementIds', 'projectId'], 'properties': {'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'elementIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Two or more caption lines, each "text.<id>".'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['bandId', 'start', 'projectId'], 'properties': {'start': {'type': 'number', 'description': 'Host-timeline frame where the band begins (0-indexed, 30 fps).'}, 'bandId': {'type': 'string', 'description': "The embedded band's group id (group.<id> or the bare <id>)."}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'projectId'], 'properties': {'x': {'type': 'number', 'description': "Centre x in the element's OWN frame. At root that is canvas coords (1080 wide); INSIDE A GROUP it is the group's space, so it is not where the layer sits on the canvas. inspect_layers reports both — write back the `x` it gave you, and read `canvas_x` for the on-canvas position."}, 'y': {'type': 'number', 'description': "Centre y in the element's OWN frame — canvas coords (1920 tall) at root, the group's space inside a group. See `x`."}, 'scale': {'type': 'number', 'description': "Uniform scale multiplier about the layer's pivot. 1 = natural size. Every layer kind carries it."}, 'width': {'type': 'number', 'description': 'Width in px (must be > 0).'}, 'height': {'type': 'number', 'description': 'Height in px (must be > 0).'}, 'opacity': {'type': 'number', 'description': "Layer opacity, 0..1 (values outside are allowed and clamp at paint time). Composes with any ancestor group's opacity."}, 'rotation': {'type': 'number', 'description': 'Rotation in degrees, clockwise.'}, 'elementId': {'type': 'string', 'description': 'video.<id>, image.<id>, shapes.<id>, or group.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'clear_animation': {'type': 'boolean', 'description': 'Only meaningful when setting `scale` / `opacity` on a layer where that property is animated. true = the static value REPLACES the keyframe track. Omitted / false = the call is refused rather than writing a value the animation would hide.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'workspaceId'], 'properties': {'projectId': {'type': 'string', 'description': 'Id of the project to move.'}, 'workspaceId': {'type': ['string', 'null'], 'description': "Target workspace id (from list_workspaces), or null to move the project back to the caller's personal space."}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'projectId': {'type': 'string', 'description': 'Id of the project to open.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': 'object', 'required': ['name', 'editorUrl'], 'properties': {'name': {'type': 'string', 'description': "The project's name."}, 'claimUrl': {'type': 'string', 'description': 'Present only when the caller is an anonymous account: the link that hands its projects to a person.'}, 'editorUrl': {'type': 'string', 'description': 'A link that opens this project in the editor.'}}, 'description': 'The project, as a person would refer to it.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'newId': {'type': 'string', 'description': 'Optional new id — must be a v4 UUID. Omit to mint a fresh UUID automatically.'}, 'projectId': {'type': 'string', 'description': 'Current id of the project to re-key.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['id', 'projectId'], 'properties': {'id': {'type': 'string', 'description': 'Overlay id (e.g. audio_1).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'property', 'frame', 'projectId'], 'properties': {'frame': {'type': 'number'}, 'property': {'enum': ['fill'], 'type': 'string'}, 'elementId': {'type': 'string', 'description': "Element id. The canvas backdrop is the pinned is_background image_layer; 'background.canvas' is accepted as a synonym."}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['origin', 'projectId'], 'properties': {'origin': {'type': 'string', 'description': 'Hostname or URL to remove. Normalized the same way as add_embed_origin before matching.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'projectId'], 'properties': {'elementId': {'type': 'string', 'description': 'The element id to remove from the Collection.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'property', 'frame', 'projectId'], 'properties': {'frame': {'type': 'number'}, 'property': {'enum': ['x', 'y', 'width', 'height', 'scale', 'rotation', 'opacity', 'curve'], 'type': 'string'}, 'elementId': {'type': 'string'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'projectId'], 'properties': {'elementId': {'type': 'string', 'description': 'video.<id>, image.<id>, text.<id>, or shapes.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'frame', 'projectId'], 'properties': {'frame': {'type': 'number', 'description': 'Project-timeline frame number.'}, 'elementId': {'type': 'string', 'description': 'video.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['groupId', 'name', 'projectId'], 'properties': {'name': {'type': 'string'}, 'groupId': {'type': 'string'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'name', 'projectId'], 'properties': {'name': {'type': 'string', 'description': 'New label. Empty string clears it (callers fall back to the filename stem).'}, 'elementId': {'type': 'string', 'description': 'video.<id>, image.<id>, shapes.<id>, or text.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'name'], 'properties': {'name': {'type': 'string', 'description': 'New human-readable label. Empty string clears the name and reverts to the id fallback.'}, 'projectId': {'type': 'string', 'description': 'Project to rename.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'versionId', 'name'], 'properties': {'name': {'type': 'string', 'description': 'New human-readable label. Must be a non-empty string.'}, 'projectId': {'type': 'string', 'description': 'Project whose version to rename.'}, 'versionId': {'type': 'string', 'description': 'Version to rename. UUID `id` or `v<N>` shorthand.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['workspaceId', 'name'], 'properties': {'name': {'type': 'string', 'description': 'New human-readable name.'}, 'workspaceId': {'type': 'string', 'description': 'Id of the workspace to rename (from list_workspaces).'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['renderId'], 'properties': {'renderId': {'type': 'string', 'description': 'The renderId render_video returned.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'page': {'type': 'number', 'description': "Optional 0-based page index for a multi-page project. Omit for the project's active page; render one page per call."}, 'scale': {'type': 'number', 'description': "Optional output scale: 2 (the default) renders at twice the canvas, roughly 4K for a portrait project; 1 renders at the canvas's own size for a faster, cheaper file. Nothing else is accepted."}, 'projectId': {'type': 'string', 'description': 'Project to render.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'newIndex', 'projectId'], 'properties': {'newIndex': {'type': 'number', 'description': '0-based index among siblings of the same parent.'}, 'elementId': {'type': 'string'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['from_index', 'to_index', 'projectId'], 'properties': {'to_index': {'type': 'number', 'description': '0-based destination index for the page.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'from_index': {'type': 'number', 'description': '0-based index of the page to move.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'versionId'], 'properties': {'projectId': {'type': 'string', 'description': 'Project to restore into.'}, 'versionId': {'type': 'string', 'description': 'Version to restore. UUID `id` or `v<N>` shorthand (partner-facing bookmark number).'}, 'page_index': {'type': 'number', 'description': "Optional. 0-based index into the project's CURRENT pages (same indexing as select_page / delete_page). Restores only that page from the version; omit to restore the whole project."}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'clip'], 'properties': {'clip': {'type': 'string', 'description': 'Clip filename (video.<id>.clip).'}, 'projectId': {'type': 'string'}, 'bandHeight': {'type': 'number', 'description': 'Vertical granularity in source pixels (default 32).'}, 'minConfidence': {'type': 'number', 'description': 'OCR confidence floor (0–100) for considering a text region (default 70).'}, 'occupancyThreshold': {'type': 'number', 'description': 'Fraction of frames that must contain text in a band to mark it occupied (default 0.10).'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'name': {'type': 'string', 'description': 'Short label describing what this set of changes accomplished. Defaults to a timestamp if omitted, but a description is much more useful to the user.'}, 'projectId': {'type': 'string', 'description': 'Project to save a version of (filename stem).'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['index', 'projectId'], 'properties': {'index': {'type': 'number', 'description': '0-based index of the page to make active.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['width', 'height', 'projectId'], 'properties': {'width': {'type': 'number', 'description': 'Canvas width in px (positive integer).'}, 'height': {'type': 'number', 'description': 'Canvas height in px (positive integer).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'speed', 'projectId'], 'properties': {'speed': {'type': 'number', 'description': 'Constant playback rate (1 = source speed, 0.5 = half, 2 = double), in [0.1, 8].'}, 'elementId': {'type': 'string', 'description': 'video.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['family', 'src', 'projectId'], 'properties': {'src': {'type': 'string', 'description': "A full font URL (https://…/font.woff2) OR an uploaded asset filename in the project's bucket."}, 'style': {'enum': ['normal', 'italic'], 'type': 'string', 'description': 'Optional face style. Defaults to normal.'}, 'family': {'type': 'string', 'description': 'Family name text layers will reference via font_family, e.g. "Mylius Modern".'}, 'weight': {'type': 'number', 'description': 'Optional specific weight (1-1000) this src provides. Omit for the 400/normal baseline.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['seconds', 'projectId'], 'properties': {'seconds': {'type': 'number', 'description': 'Composition length in seconds (1-second floor, no ceiling). 30 fps; durationInFrames = ceil(seconds*30).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['origins', 'projectId'], 'properties': {'origins': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Full desired allowlist. Each entry may be a bare hostname or a URL; it is normalized to a bare lowercased hostname. Empty array disables embedding.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'box_width', 'box_height', 'projectId'], 'properties': {'box_width': {'type': 'number', 'description': 'Backdrop width in px (non-negative).'}, 'elementId': {'type': 'string', 'description': 'group.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'box_height': {'type': 'number', 'description': 'Backdrop height in px (non-negative).'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'parentGroupId', 'projectId'], 'properties': {'index': {'type': 'number', 'description': "0-based insert position among the new parent's children. Defaults to end."}, 'elementId': {'type': 'string', 'description': 'Full element id: video.<id>, image.<id>, shapes.<id>, or group.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'parentGroupId': {'type': ['string', 'null'], 'description': 'Bare group id of the new parent, or null to move to root.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'start', 'duration', 'projectId'], 'properties': {'start': {'type': 'number', 'description': 'First frame the group is drawn on, in its parent timeline (0-indexed, 30 fps).'}, 'duration': {'type': 'number', 'description': "How many frames the group stays drawn for (≥ 1). Grown automatically if it would hide the group's own keyframes."}, 'elementId': {'type': 'string', 'description': "The group's id (group.<id> or the bare <id>)."}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'filename', 'projectId'], 'properties': {'name': {'type': ['string', 'null'], 'description': "Optional label people see for the layer: pass the upload's returned `name`. Omit to keep the current label; null or an empty string clears it."}, 'filename': {'type': 'string', 'description': "The uploaded file's id: the `filename` its upload returned."}, 'elementId': {'type': 'string', 'description': 'Image layer id, image.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['keyframes', 'projectId'], 'properties': {'keyframes': {'type': 'array', 'items': {'type': 'object', 'required': ['elementId', 'property', 'frame', 'value'], 'properties': {'frame': {'type': 'number', 'description': 'Frame number, 0-indexed (30 fps).'}, 'value': {'type': 'number', 'description': 'Track value at this frame.'}, 'easing': {'enum': ['linear', 'easeIn', 'easeOut', 'easeInOut', 'outQuart', 'outExpo', 'outBack', 'inBack', 'inOutBack', 'cubicBezier', 'hold'], 'type': 'string', 'description': 'Interpolation to the next keyframe. Default linear.'}, 'property': {'enum': ['x', 'y', 'width', 'height', 'scale', 'rotation', 'opacity', 'curve'], 'type': 'string'}, 'elementId': {'type': 'string', 'description': 'Layer id (video.<id>, image.<id>, shapes.<id>, text.<id>, or group.<id>).'}}}, 'description': 'One or more keyframe entries to apply.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'start', 'duration', 'projectId'], 'properties': {'start': {'type': 'number', 'description': 'First frame the layer appears (0-indexed, 30 fps), in its parent timeline.'}, 'duration': {'type': 'number', 'description': 'How many frames the layer lasts (≥ 1). Hidden outside [start, start+duration).'}, 'elementId': {'type': 'string', 'description': 'Element id of the layer (image.<id>, video.<id>, text.<id>, shapes.<id>, or group.<id>).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'fill', 'projectId'], 'properties': {'fill': {'type': ['string', 'object', 'null'], 'description': 'Either \'#rrggbb\' (promoted to solid) or a Fill object: {type:"solid",color} / {type:"linear",stops:[{pos:0..1,color}],angle?} / {type:"radial",stops:[{pos:0..1,color}],cx?,cy?,radius?} / {type:"mask",layer_id,color}. A gradient is ONE fill — don\'t fake it with stacked shapes. null (image/video/text/group only) clears the backdrop, including any fill colour keyframes on it.'}, 'elementId': {'type': 'string', 'description': "shapes.<id> / image.<id> / video.<id> / group.<id>. The pinned is_background image_layer is the canvas backdrop; the literal 'background.canvas' is accepted as a synonym."}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'clear_animation': {'type': 'boolean', 'description': 'Only meaningful on a layer whose fill is animated. true = this fill REPLACES the colour animation (its keyframes are deleted). Omitted / false = the call is refused rather than writing a fill the animation would hide.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'projectId'], 'properties': {'text': {'type': 'string', 'description': 'The text to render. Newlines are honoured as hard line breaks.'}, 'curve': {'type': 'number', 'description': 'Curve the text onto an arc, in degrees of total sweep. 0 = straight (default). POSITIVE = a SMILE (⌣, ends rise); NEGATIVE = an ARCH (⌒, rainbow). Clamped ±135. A tasteful smile is ~+60. Applies to a SINGLE line — multi-line text is joined to one line while curved (the stored text is untouched, so curve:0 restores it).'}, 'elementId': {'type': 'string', 'description': 'Text layer id, text.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'text_size': {'type': 'number', 'description': 'Font size in px.'}, 'font_style': {'enum': ['normal', 'italic'], 'type': 'string', 'description': 'Italic toggle. Default normal.'}, 'text_align': {'enum': ['left', 'center', 'right'], 'type': 'string', 'description': 'Horizontal alignment of each line. Default center.'}, 'text_color': {'type': 'string', 'description': 'Text fill colour as #rrggbb.'}, 'decorations': {'type': ['object', 'null'], 'properties': {'underline': {'type': 'array', 'items': {'type': 'object', 'properties': {'end': {'type': 'number'}, 'start': {'type': 'number'}}}}, 'strikethrough': {'type': 'array', 'items': {'type': 'object', 'properties': {'end': {'type': 'number'}, 'start': {'type': 'number'}}}}}, 'description': 'Per-character underline / strikethrough. { underline?: [{start,end}], strikethrough?: [{start,end}] } — each a list of half-open character ranges [start,end) (UTF-16 offsets) into `text`. E.g. underline the first word of "Big news": underline:[{start:0,end:3}]. Ranges are normalized (sorted + merged). null clears all decorations; editing `text` in the SAME call re-indexes existing ranges against the new text. Not rendered on curved text.'}, 'font_family': {'type': 'string', 'description': 'Google Fonts family name, e.g. "Anton".'}, 'font_weight': {'type': 'number', 'description': "Font weight 100..900 (400 regular, 700 bold, 800 black). Default 400; the canvas synthesizes weights a static font doesn't ship."}, 'line_height': {'type': 'number', 'description': 'Line height as a multiple of font size (1.2 = 120%).'}, 'text_shadow': {'type': ['object', 'null'], 'properties': {'blur': {'type': 'number'}, 'color': {'type': 'string'}, 'offsetX': {'type': 'number'}, 'offsetY': {'type': 'number'}}, 'description': 'Drop shadow { offsetX, offsetY, blur, color }; color is any CSS colour (rgba allowed). null clears it.'}, 'text_valign': {'enum': ['top', 'middle', 'bottom'], 'type': 'string', 'description': 'Vertical alignment of the text block within its box. "middle" (default) centres it; "bottom" pins it to the box floor so extra wrapped lines grow upward from a fixed baseline (captions use this so a wrapped line doesn\'t shift the others); "top" pins the ceiling.'}, 'stroke_color': {'type': 'string', 'description': 'Outline colour as #rrggbb. Defaults to white when a width is set.'}, 'stroke_width': {'type': 'number', 'description': 'Outline width in px (0 = no outline).'}, 'text_autofit': {'enum': ['fit', 'shrink', 'wrap', 'hug'], 'type': 'string', 'description': 'How text fits its box. "hug" (default for new layers): hold text_size FIXED and DERIVE the box from the measured text plus padding, honouring the literal newlines you pass — the box shrink-wraps the exact content and grows/shrinks live as the text changes, so it can never re-wrap differently between the editor preview and the export (bake your own "\\n" breaks; pair with set_text_background for a rounded caption box). "wrap": hold text_size FIXED in a fixed-size box and only word-wrap (hard-breaking a single over-wide word), never resize. "fit": ignore text_size and auto-size the font BOTH ways (grow and shrink) to the largest size whose wrapped block fills the box — resizing the box resizes the text. "shrink" (legacy): word-wrap then auto-shrink the font from text_size until the block fits; never grows.'}, 'letter_spacing': {'type': 'number', 'description': 'Tracking between glyphs in px; may be negative. Default 0.'}, 'text_transform': {'enum': ['none', 'uppercase', 'lowercase'], 'type': 'string', 'description': 'Case transform applied before layout. Default none.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'edge', 'kind', 'projectId'], 'properties': {'edge': {'enum': ['in', 'out', 'both'], 'type': 'string', 'description': 'Which edge to set. "in" is the start of the layer\'s window, "out" the end.'}, 'kind': {'enum': ['cut', 'fade', 'slide', 'pop'], 'type': 'string', 'description': 'The look. "cut" = hard edge (clears any transition). "fade" = opacity ramp. "slide" = travels in/out from a direction while fading. "pop" = scales up from 80% with an overshoot.'}, 'curve': {'type': 'string', 'description': 'Optional easing override (linear, easeIn, easeOut, easeInOut, outQuart, outExpo, outBack, inBack, inOutBack). Defaults suit the kind: entries decelerate in, exits accelerate away.'}, 'frames': {'type': 'number', 'description': 'Ramp length in frames (30 fps). Default 6. Ignored for kind "cut".'}, 'direction': {'enum': ['left', 'right', 'up', 'down'], 'type': 'string', 'description': 'For kind "slide" only. On the IN edge this is where the layer comes FROM; on the OUT edge, where it goes TO. Default "left".'}, 'elementId': {'type': 'string', 'description': 'Element id of the layer (image.<id>, video.<id>, text.<id>, shapes.<id>, or group.<id>).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'visible', 'projectId'], 'properties': {'visible': {'type': 'boolean'}, 'elementId': {'type': 'string'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'values', 'projectId'], 'properties': {'field': {'type': 'string', 'description': 'The layer field each pass overrides — e.g. "text", "text_color", "filename". Defaults to "text".'}, 'values': {'type': 'array', 'items': {'type': 'string'}, 'description': 'One value per loop pass. Empty array clears the loop.'}, 'elementId': {'type': 'string', 'description': 'Target layer — text.<id>, image.<id>, shapes.<id>, or video.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'matte_source_id', 'projectId'], 'properties': {'elementId': {'type': 'string', 'description': 'Host being masked: image/video/shapes/text.<id>, or group.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'matte_inverted': {'type': 'boolean', 'description': 'Optional. Invert the mask (knock-out): the host shows everywhere EXCEPT where the source is opaque — a punch-through / spotlight. Honored on leaf hosts; ignored on group hosts. Omitted = preserve current; clearing the mask resets it.'}, 'matte_source_id': {'type': ['string', 'null'], 'description': 'Element id of the layer whose alpha drives the mask, or null to clear.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'anchor', 'projectId'], 'properties': {'anchor': {'enum': ['tl', 't', 'tr', 'l', 'c', 'r', 'bl', 'b', 'br'], 'type': 'string', 'description': 'Which of the 9 bbox anchors to pivot around. tl/t/tr = top row; l/c/r = middle row; bl/b/br = bottom row. c = centre (the default).'}, 'elementId': {'type': 'string', 'description': 'image.<id>, video.<id>, shapes.<id>, or text.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'projectId'], 'properties': {'fit': {'enum': ['stretch', 'cover', 'contain'], 'type': 'string', 'description': 'Fit mode (image + video layers). Default: stretch for image layers, cover for video layers.'}, 'anchorX': {'type': 'number', 'description': 'Object-position X (0..1). 0=left, 1=right, 0.5=centre. Only meaningful with fit=cover|contain.'}, 'anchorY': {'type': 'number', 'description': 'Object-position Y (0..1). 0=top, 1=bottom, 0.5=centre. Only meaningful with fit=cover|contain.'}, 'alphaMask': {'type': ['object', 'null'], 'required': ['stops'], 'properties': {'type': {'enum': ['linear'], 'type': 'string'}, 'angle': {'type': 'number'}, 'stops': {'type': 'array', 'items': {'type': 'object', 'required': ['offset', 'alpha'], 'properties': {'alpha': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'offset': {'type': 'number', 'maximum': 1, 'minimum': 0}}}, 'minItems': 2}}, 'description': "Linear alpha-mask gradient (image layers). Multiplies the layer's alpha along a gradient line — used to fade a layer out partway across (the front half of a 'sandwich' covering text below it). Object: { type: 'linear', angle: number (deg, CSS-style; 0=to top, 90=to right, 180=to bottom, 270=to left), stops: [{offset:0..1, alpha:0..1}, ...] (≥2 stops, ordered by offset) }. Pass null to clear."}, 'boxShadow': {'type': ['string', 'null'], 'description': 'CSS box-shadow string, e.g. "0 4px 12px rgba(0,0,0,0.5)". Pass an empty string "" or null to REMOVE the shadow.'}, 'elementId': {'type': 'string'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'tintColor': {'type': 'string', 'description': '#rrggbb tint colour painted source-atop over the image (image layers only).'}, 'blend_mode': {'enum': ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'], 'type': 'string', 'description': "Photoshop-style layer blend mode (Canvas globalCompositeOperation). 'normal' is the default. Applies to every layer kind; allowed on group.<id> too (the only set_style field that is)."}, 'chroma_key': {'type': ['object', 'null'], 'properties': {'color': {'type': 'string'}, 'similarity': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'smoothness': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'description': "Green-screen key (video / image layers). Makes pixels near `color` transparent at render time so layers below show through. Object: { color: '#rrggbb' (default '#00ff00'), similarity: 0..1 (match radius, default 0.4), smoothness: 0..1 (edge feather, default 0.1) }. Pass null to clear."}, 'borderAlign': {'enum': ['inner', 'center', 'outer'], 'type': 'string', 'description': 'Where the border sits relative to the layer\'s edge (design-tool "border position"). "inner" (default) draws the band INSIDE the box so it eats into the content; "outer" draws it entirely OUTSIDE so it frames the content without covering it; "center" straddles the edge 50/50. Rectangular boxes (image/video/text) only — shapes always stroke centred on their silhouette and ignore it.'}, 'borderColor': {'type': 'string', 'description': '#rrggbb.'}, 'borderWidth': {'type': 'number'}, 'borderRadius': {'type': 'number'}, 'tintStrength': {'type': 'number', 'description': 'Tint blend strength 0..1. 0=no tint, 1=image silhouette filled with tintColor. Default 0 (no tint).'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'projectId'], 'properties': {'fill': {'type': ['string', 'object', 'null'], 'description': 'Box fill: \'#rrggbb\' (promoted to solid) or a Fill object: {type:"solid",color} / {type:"linear",stops:[{pos:0..1,color}],angle?} / {type:"radial",stops:[{pos:0..1,color}],cx?,cy?,radius?} / {type:"mask",layer_id,color}. null clears the box; omit to leave the current fill.'}, 'padding': {'type': 'number', 'description': 'Uniform inset (canvas px) between the box edge and the text. On a "hug" layer it is what sizes the box around the label; on a fixed-size layer ("wrap", "fit", "shrink") lines wrap inside the padded area, so padding narrows where they break. 0 / omitted ⇒ no explicit padding.'}, 'elementId': {'type': 'string', 'description': 'text.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'strokeColor': {'type': 'string', 'description': 'Box outline colour as #rrggbb.'}, 'strokeWidth': {'type': 'number', 'description': 'Box outline width in px. 0 / omitted ⇒ no outline.'}, 'cornerRadius': {'type': 'number', 'description': 'Corner radius of the box in px. 0 ⇒ square corners.'}, 'clear_animation': {'type': 'boolean', 'description': "Only meaningful when `fill` is given AND the layer's backdrop fill is animated. true = the new fill REPLACES the colour animation. Omitted / false = the call is refused rather than writing a fill the animation would hide."}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'property', 'mode', 'projectId'], 'properties': {'mode': {'enum': ['hold', 'loop', 'ping-pong', 'cycle'], 'type': 'string'}, 'property': {'enum': ['x', 'y', 'width', 'height', 'scale', 'rotation', 'opacity', 'curve'], 'type': 'string'}, 'elementId': {'type': 'string', 'description': 'Layer id (video/image/shape/group).'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'clip', 'projectId'], 'properties': {'clip': {'type': 'string', 'description': "The uploaded clip's id: the `filename` its upload returned."}, 'name': {'type': ['string', 'null'], 'description': "Optional label people see for the layer: pass the upload's returned `name`. Omit to keep the current label; null or an empty string clears it."}, 'elementId': {'type': 'string', 'description': 'Video layer id, video.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'muted', 'projectId'], 'properties': {'muted': {'type': 'boolean', 'description': "true silences the layer's baked audio; false restores it."}, 'elementId': {'type': 'string', 'description': 'Video layer id, video.<id>.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'projectId'], 'properties': {'elementId': {'type': 'string', 'description': 'video.<id> of the layer to trim.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'source_in_frame': {'type': 'number', 'description': 'Frame in the source mp4 where playback begins (0-indexed, 30 fps).'}, 'source_out_frame': {'type': ['number', 'null'], 'description': "Frame in the source mp4 where playback stops, or null to clear and play to the source's natural end."}, 'timeline_start_frame': {'type': 'number', 'description': 'Project-timeline frame where this slice begins playing.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'start', 'projectId'], 'properties': {'start': {'type': 'number', 'description': "ABSOLUTE frame the group's window should start at after the move (0-indexed, 30 fps) — not an offset."}, 'elementId': {'type': 'string', 'description': "The group's id (group.<id> or the bare <id>)."}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'property', 'delta', 'projectId'], 'properties': {'delta': {'type': 'number', 'description': "Added to every keyframe's value on this track. Negative shifts the curve down/left."}, 'property': {'enum': ['x', 'y', 'width', 'height', 'scale', 'rotation', 'opacity', 'curve'], 'type': 'string'}, 'elementId': {'type': 'string'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['elementId', 'atFrame', 'projectId'], 'properties': {'atFrame': {'type': 'number', 'description': "Composition frame to split at — must be strictly inside the line's on-timeline window (see describe_video / inspect_layers for windows)."}, 'elementId': {'type': 'string', 'description': 'The caption line to split, "text.<id>".'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'clip'], 'properties': {'clip': {'type': 'string', 'description': 'Clip filename (video.<id>.clip).'}, 'projectId': {'type': 'string', 'description': 'Project the clip belongs to.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['groupId', 'projectId'], 'properties': {'groupId': {'type': 'string', 'description': 'Bare group id (no \'group.\' prefix), e.g. "header" for group.header.'}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['id', 'projectId'], 'properties': {'id': {'type': 'string'}, 'gain': {'type': 'number', 'description': 'Linear gain 0..2.'}, 'name': {'type': ['string', 'null'], 'description': "The track's label people see (pass the upload's returned `name` alongside a replacement `filename`), or null to remove it."}, 'endFrame': {'type': ['number', 'null'], 'description': "End frame, or null to clear and use the asset's natural length."}, 'filename': {'type': 'string', 'description': "Replace the track's audio: the stored filename an upload returned."}, 'projectId': {'type': 'string', 'description': 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.'}, 'startFrame': {'type': 'number'}, 'fadeInFrames': {'type': 'number'}, 'fadeOutFrames': {'type': 'number'}, 'sourceLayerId': {'type': ['string', 'null'], 'description': 'Weld the overlay to a video layer ("video.<id>") so it renders as a clip footer and drags with the clip, or null to detach it back into a standalone track.'}, 'denoiseStrength': {'type': ['number', 'null'], 'description': 'Clean-strength wet/dry mix 0..1 for an overlay with an AI-cleaned track: 1 = fully cleaned, 0 = fully original, between = blend. null clears it (full clean). Ignored while the Original track is selected.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Direct, publicly-fetchable http(s) URL of the audio file (.mp3/.m4a/.wav/.ogg/.aac).'}, 'name': {'type': 'string', 'description': "Optional display name, what people see (e.g. Theme.mp3). Defaults to the URL's file name. It never decides where the file is stored."}, 'projectId': {'type': 'string', 'description': 'Project to add the audio to.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
输入模式
{'type': 'object', 'required': ['projectId', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Direct, publicly-fetchable http(s) URL of the image file (.png/.jpg/.jpeg/.gif/.webp/.svg).'}, 'name': {'type': 'string', 'description': "Optional display name, what people see (e.g. Logo.png). Defaults to the URL's file name. It never decides where the file is stored."}, 'projectId': {'type': 'string', 'description': 'Project to add the image to.'}}}
输出模式
{'type': 'object', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean', 'description': 'Whether the call succeeded.'}, 'data': {'type': ['object', 'array', 'string', 'number', 'boolean', 'null'], 'description': 'The payload, shaped by the tool.'}, 'note': {'type': 'string', 'description': 'What to do next when not ready.'}, 'error': {'type': 'string', 'description': 'Why it failed.'}, 'status': {'enum': ['ready', 'not-ready'], 'type': 'string', 'description': 'For cache-backed readers: whether the answer was ready.'}, 'editorUrl': {'type': 'string', 'description': 'Opens this project in the editor.'}}, 'description': 'The result envelope every Morpha tool returns.'}
近期工具变更
类似的 MCP 服务器
MiOffice — AI-Powered Workspace Studio
Provides browser-based tools for processing PDFs, images, video, and audio, including generation, enhancement, conversion, transc…
BlitzReels Video Editor
Creates and edits short-form videos, including timelines, captions, transitions, AI-generated visuals, music, voiceovers, sound e…
switch
Enables management and exploration of an account-scoped library of AI-generated images and videos.
framesail
Creates long-form YouTube videos through script generation, storyboarding, visual assets, voiceover, music, scene composition, an…
Magnific
Provides image enhancement and design tools, AI image and audio generation, text-to-speech, creation management, and reusable cre…
Uwear
Supports AI fashion photoshoot production with garments, outfits, avatars, locations, art direction, image generation, backdrops,…
Creative Claw
Generates and edits branded images, video, audio, speech, and 3D-related creative assets, with media processing and reusable them…
RegiAI
Generates and edits images, videos, audio, music, speech, subtitles, avatars, and related media asynchronously.