@writepanda/mcp 1.183.0 → 1.194.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/server.mjs +646 -21
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -552,6 +552,69 @@ const ANCHOR_END_PROP = { type: "number", description: "Anchor end, SOURCE ms."
|
|
|
552
552
|
const KEYFRAME_TARGET_DOC =
|
|
553
553
|
"main = motion region (its target decides fields); overlay: x y scale rotation opacity backdropBlur keyStrength; annotation: x y scale rotation opacity; adjustment: effects, amount, lookIntensity; focus: x y width height roundness feathering blurAmount pixelSize maskOpacity; background-effect: amount strength; mask (regionId = overlay id): x y width height roundness feather expand.";
|
|
554
554
|
|
|
555
|
+
const MOTION_ELEMENT_TYPES = [
|
|
556
|
+
"keyword",
|
|
557
|
+
"chip",
|
|
558
|
+
"stamp",
|
|
559
|
+
"count",
|
|
560
|
+
"steps",
|
|
561
|
+
"slam",
|
|
562
|
+
"behind",
|
|
563
|
+
"lowerThird",
|
|
564
|
+
"highlight",
|
|
565
|
+
"endCard",
|
|
566
|
+
"progress",
|
|
567
|
+
"iconPop",
|
|
568
|
+
"frame",
|
|
569
|
+
"sticker",
|
|
570
|
+
];
|
|
571
|
+
const MOTION_ELEMENT_PROPS = {
|
|
572
|
+
type: { type: "string", enum: MOTION_ELEMENT_TYPES },
|
|
573
|
+
content: {
|
|
574
|
+
type: ["object", "string", "array"],
|
|
575
|
+
description:
|
|
576
|
+
'keyword/chip/stamp/slam/behind/highlight { text } (or a bare string); count { value, to?, prefix?, suffix?, label?, decimals? } (value "20-30" = range); steps { items[], cues? (ms offsets from start) }; lowerThird { title, subtitle? }; endCard { lines: [a, b] }; progress { label?, fromMs?, toMs? }; iconPop { emoji } | { icon }; frame { look: viewfinder | selection | corners, label? }; sticker { image: transparent PNG path, label? }. Latin script only.',
|
|
577
|
+
},
|
|
578
|
+
atMs: { type: "number", description: "Start, edited ms. Or wordId." },
|
|
579
|
+
wordId: {
|
|
580
|
+
type: "string",
|
|
581
|
+
description: "Start on this transcript word; follows it through cuts.",
|
|
582
|
+
},
|
|
583
|
+
offsetMs: { type: "number", description: "Shift from atMs/wordId (may be negative)." },
|
|
584
|
+
durationMs: { type: "number", description: "Default endWordId, else the type's length." },
|
|
585
|
+
endWordId: { type: "string", description: "Run to the end of this word." },
|
|
586
|
+
cueWordIds: {
|
|
587
|
+
type: "array",
|
|
588
|
+
items: { type: "string" },
|
|
589
|
+
description: "steps: one word id per item.",
|
|
590
|
+
},
|
|
591
|
+
style: {
|
|
592
|
+
type: "object",
|
|
593
|
+
properties: {
|
|
594
|
+
family: { type: "string", enum: ["bold", "editorial", "clean", "playful", "paper"] },
|
|
595
|
+
accent: { type: "string" },
|
|
596
|
+
highlight: { type: "string" },
|
|
597
|
+
text: { type: "string" },
|
|
598
|
+
font: { type: "string" },
|
|
599
|
+
size: { type: "string", enum: ["s", "m", "l", "xl"] },
|
|
600
|
+
outline: { type: "boolean" },
|
|
601
|
+
},
|
|
602
|
+
description: "Default: the brand kit.",
|
|
603
|
+
},
|
|
604
|
+
zone: {
|
|
605
|
+
type: ["string", "object"],
|
|
606
|
+
description:
|
|
607
|
+
"auto (clear of the face) | top | upper | center | lower | bottom | { x, y, w? } (% of frame; x,y = centre).",
|
|
608
|
+
},
|
|
609
|
+
layer: { type: "string", enum: ["front", "behind"] },
|
|
610
|
+
sound: {
|
|
611
|
+
type: "string",
|
|
612
|
+
enum: ["auto", "none", "pop", "whoosh", "hit", "tick", "bell"],
|
|
613
|
+
description: "Role for project_compose_soundtrack.",
|
|
614
|
+
},
|
|
615
|
+
zIndex: { type: "number" },
|
|
616
|
+
anchor: { type: "string", enum: ["auto", "free"] },
|
|
617
|
+
};
|
|
555
618
|
const TOOLS = [
|
|
556
619
|
// ── system + discovery ──────────────────────────────────────────
|
|
557
620
|
{
|
|
@@ -641,7 +704,7 @@ const TOOLS = [
|
|
|
641
704
|
{
|
|
642
705
|
name: "system_set_transcription_language",
|
|
643
706
|
description:
|
|
644
|
-
"Set the workspace transcription language. Non-auto uses Whisper, a ~1.1 GB download: tell the user first (system.is-whisper-model-downloaded via pandastudio_call).",
|
|
707
|
+
"Set the workspace transcription language. English = auto (english/en are saved as auto). Non-auto uses Whisper, a ~1.1 GB download: tell the user first (system.is-whisper-model-downloaded via pandastudio_call).",
|
|
645
708
|
inputSchema: {
|
|
646
709
|
type: "object",
|
|
647
710
|
properties: {
|
|
@@ -649,6 +712,8 @@ const TOOLS = [
|
|
|
649
712
|
type: "string",
|
|
650
713
|
enum: [
|
|
651
714
|
"auto",
|
|
715
|
+
"english",
|
|
716
|
+
"en",
|
|
652
717
|
"chinese",
|
|
653
718
|
"japanese",
|
|
654
719
|
"korean",
|
|
@@ -1512,16 +1577,33 @@ const TOOLS = [
|
|
|
1512
1577
|
},
|
|
1513
1578
|
{
|
|
1514
1579
|
name: "project_add_transition",
|
|
1515
|
-
description:
|
|
1580
|
+
description:
|
|
1581
|
+
"Place a transition centred on a cut (a clip boundary or a jump cut). kind overlay (fade-black, flash, glitch, torn-paper…) draws a WebM over the cut; kind native (zoom-blur, whip-left, whip-right, whip-up, spin) moves the footage itself (captions/graphics stay put), 350 ms default. Snaps atMs to a cut within snapMs (default 500) and places the transition's default sound.",
|
|
1516
1582
|
inputSchema: {
|
|
1517
1583
|
type: "object",
|
|
1518
1584
|
properties: {
|
|
1519
1585
|
id: { type: "string" },
|
|
1520
1586
|
path: { type: "string" },
|
|
1521
|
-
transitionId: {
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1587
|
+
transitionId: {
|
|
1588
|
+
type: "string",
|
|
1589
|
+
description: "asset_list_transitions id (overlay or native kind).",
|
|
1590
|
+
},
|
|
1591
|
+
file: { type: "string", description: "Custom overlay WebM, instead of transitionId." },
|
|
1592
|
+
atMs: { type: "number", description: "The cut (edited ms)." },
|
|
1593
|
+
durationMs: {
|
|
1594
|
+
type: "number",
|
|
1595
|
+
description: "Default: the catalog's (1000 overlays, 900 torn-paper, 350 native).",
|
|
1596
|
+
},
|
|
1597
|
+
snapMs: {
|
|
1598
|
+
type: "number",
|
|
1599
|
+
description: "Snap to the nearest cut within this many ms. Default 500; 0 = exact.",
|
|
1600
|
+
},
|
|
1601
|
+
sound: {
|
|
1602
|
+
type: "string",
|
|
1603
|
+
description:
|
|
1604
|
+
"Bundled sound id / path. Default: the transition's defaultSoundId. none = silent.",
|
|
1605
|
+
},
|
|
1606
|
+
soundVolume: { type: "number", description: "0-1." },
|
|
1525
1607
|
expectedRevision: { type: "number" },
|
|
1526
1608
|
},
|
|
1527
1609
|
required: ["atMs"],
|
|
@@ -1891,6 +1973,141 @@ const TOOLS = [
|
|
|
1891
1973
|
},
|
|
1892
1974
|
command: "project.remove-mute-region",
|
|
1893
1975
|
},
|
|
1976
|
+
{
|
|
1977
|
+
name: "project_add_bleep",
|
|
1978
|
+
description:
|
|
1979
|
+
"Bleep words instead of cutting them: audio silenced, a tone of exactly their length plays, captions mask them (d***). wordIds from transcript.get (adjacent words = one bleep; stays on those words through later cuts) or startMs/endMs edited ms. Overlaps merge. Returns bleepIds.",
|
|
1980
|
+
inputSchema: {
|
|
1981
|
+
type: "object",
|
|
1982
|
+
properties: {
|
|
1983
|
+
id: { type: "string" },
|
|
1984
|
+
path: { type: "string" },
|
|
1985
|
+
wordIds: { type: "array", items: { type: "string" } },
|
|
1986
|
+
startMs: { type: "number" },
|
|
1987
|
+
endMs: { type: "number" },
|
|
1988
|
+
sound: {
|
|
1989
|
+
type: "string",
|
|
1990
|
+
enum: ["tv", "low", "high", "retro", "silence"],
|
|
1991
|
+
description: "Default tv (1 kHz).",
|
|
1992
|
+
},
|
|
1993
|
+
volume: { type: "number", description: "0-1, default 0.5." },
|
|
1994
|
+
mask: {
|
|
1995
|
+
type: "string",
|
|
1996
|
+
enum: ["stars", "none"],
|
|
1997
|
+
description: "Caption masking, default stars.",
|
|
1998
|
+
},
|
|
1999
|
+
padMs: { type: "number", description: "Padding each side, default 30." },
|
|
2000
|
+
padStartMs: { type: "number" },
|
|
2001
|
+
padEndMs: { type: "number" },
|
|
2002
|
+
expectedRevision: { type: "number" },
|
|
2003
|
+
},
|
|
2004
|
+
},
|
|
2005
|
+
command: "project.add-bleep",
|
|
2006
|
+
},
|
|
2007
|
+
{
|
|
2008
|
+
name: "project_update_bleep",
|
|
2009
|
+
description:
|
|
2010
|
+
"Change a bleep's sound, volume or caption mask, or its edges: nudgeStartMs (+ = earlier start), nudgeEndMs (+ = later end), or padStartMs/padEndMs.",
|
|
2011
|
+
inputSchema: {
|
|
2012
|
+
type: "object",
|
|
2013
|
+
properties: {
|
|
2014
|
+
id: { type: "string" },
|
|
2015
|
+
path: { type: "string" },
|
|
2016
|
+
bleepId: { type: "string" },
|
|
2017
|
+
sound: { type: "string", enum: ["tv", "low", "high", "retro", "silence"] },
|
|
2018
|
+
volume: { type: "number" },
|
|
2019
|
+
mask: { type: "string", enum: ["stars", "none"] },
|
|
2020
|
+
padStartMs: { type: "number" },
|
|
2021
|
+
padEndMs: { type: "number" },
|
|
2022
|
+
nudgeStartMs: { type: "number" },
|
|
2023
|
+
nudgeEndMs: { type: "number" },
|
|
2024
|
+
expectedRevision: { type: "number" },
|
|
2025
|
+
},
|
|
2026
|
+
required: ["bleepId"],
|
|
2027
|
+
},
|
|
2028
|
+
command: "project.update-bleep",
|
|
2029
|
+
},
|
|
2030
|
+
{
|
|
2031
|
+
name: "project_remove_bleep",
|
|
2032
|
+
description: "Remove a bleep (bleepId) or un-bleep specific words (wordIds).",
|
|
2033
|
+
inputSchema: {
|
|
2034
|
+
type: "object",
|
|
2035
|
+
properties: {
|
|
2036
|
+
id: { type: "string" },
|
|
2037
|
+
path: { type: "string" },
|
|
2038
|
+
bleepId: { type: "string" },
|
|
2039
|
+
wordIds: { type: "array", items: { type: "string" } },
|
|
2040
|
+
expectedRevision: { type: "number" },
|
|
2041
|
+
},
|
|
2042
|
+
},
|
|
2043
|
+
command: "project.remove-bleep",
|
|
2044
|
+
},
|
|
2045
|
+
{
|
|
2046
|
+
name: "project_plan_broll",
|
|
2047
|
+
description:
|
|
2048
|
+
"B-roll, the LAST step of an edit: the moments where a picture of what's said would help, plus imageConnector (connected generator or null). Never makes images: show the user the moments and ASK: their own images, generate on their connector (uses their credits), or no B-roll. No one to ask: skip it and say so.",
|
|
2049
|
+
inputSchema: {
|
|
2050
|
+
type: "object",
|
|
2051
|
+
properties: {
|
|
2052
|
+
id: { type: "string" },
|
|
2053
|
+
path: { type: "string" },
|
|
2054
|
+
maxBeats: { type: "number" },
|
|
2055
|
+
minGapMs: { type: "number" },
|
|
2056
|
+
},
|
|
2057
|
+
},
|
|
2058
|
+
command: "project.plan-broll",
|
|
2059
|
+
},
|
|
2060
|
+
{
|
|
2061
|
+
name: "project_add_broll",
|
|
2062
|
+
description:
|
|
2063
|
+
"Place a B-roll beat on a word: the picture (user's own, or generated after they agreed) for ~2 s with a slow push, shutter click and a transition on both edges; moves / deletes / follows cuts as one (brollId).",
|
|
2064
|
+
inputSchema: {
|
|
2065
|
+
type: "object",
|
|
2066
|
+
properties: {
|
|
2067
|
+
id: { type: "string" },
|
|
2068
|
+
path: { type: "string" },
|
|
2069
|
+
imagePath: { type: "string" },
|
|
2070
|
+
wordId: { type: "string" },
|
|
2071
|
+
atMs: { type: "number" },
|
|
2072
|
+
durationMs: { type: "number", description: "1400-4000, default 2000." },
|
|
2073
|
+
endWordId: { type: "string" },
|
|
2074
|
+
layout: { type: "string", enum: ["full", "inset"] },
|
|
2075
|
+
transition: {
|
|
2076
|
+
type: "string",
|
|
2077
|
+
enum: ["flash", "light-sweep", "film-burn", "fade-white", "glitch", "none"],
|
|
2078
|
+
},
|
|
2079
|
+
sound: { type: "string", enum: ["shutter", "click", "none"] },
|
|
2080
|
+
push: { type: "string", enum: ["in", "out", "none"] },
|
|
2081
|
+
expectedRevision: { type: "number" },
|
|
2082
|
+
},
|
|
2083
|
+
required: ["imagePath"],
|
|
2084
|
+
},
|
|
2085
|
+
command: "project.add-broll",
|
|
2086
|
+
},
|
|
2087
|
+
{
|
|
2088
|
+
name: "project_list_broll",
|
|
2089
|
+
description: "The project's B-roll beats (brollId, picture, span, overlay ids).",
|
|
2090
|
+
inputSchema: {
|
|
2091
|
+
type: "object",
|
|
2092
|
+
properties: { id: { type: "string" }, path: { type: "string" } },
|
|
2093
|
+
},
|
|
2094
|
+
command: "project.list-broll",
|
|
2095
|
+
},
|
|
2096
|
+
{
|
|
2097
|
+
name: "project_remove_broll",
|
|
2098
|
+
description: "Remove a B-roll beat (picture + transitions) by brollId.",
|
|
2099
|
+
inputSchema: {
|
|
2100
|
+
type: "object",
|
|
2101
|
+
properties: {
|
|
2102
|
+
id: { type: "string" },
|
|
2103
|
+
path: { type: "string" },
|
|
2104
|
+
brollId: { type: "string" },
|
|
2105
|
+
expectedRevision: { type: "number" },
|
|
2106
|
+
},
|
|
2107
|
+
required: ["brollId"],
|
|
2108
|
+
},
|
|
2109
|
+
command: "project.remove-broll",
|
|
2110
|
+
},
|
|
1894
2111
|
{
|
|
1895
2112
|
name: "project_add_spotlight",
|
|
1896
2113
|
description:
|
|
@@ -2477,13 +2694,14 @@ const TOOLS = [
|
|
|
2477
2694
|
// ── compose: edit existing regions ─────────────────────────────
|
|
2478
2695
|
{
|
|
2479
2696
|
name: "project_remove_region",
|
|
2480
|
-
description:
|
|
2697
|
+
description:
|
|
2698
|
+
"Delete a region by id (editor.*Regions, motion-element = editor.motionElements, or audioOverlays); linked peers go too.",
|
|
2481
2699
|
inputSchema: {
|
|
2482
2700
|
type: "object",
|
|
2483
2701
|
properties: {
|
|
2484
2702
|
id: { type: "string" },
|
|
2485
2703
|
path: { type: "string" },
|
|
2486
|
-
regionType: { type: "string", enum: REGION_TYPES },
|
|
2704
|
+
regionType: { type: "string", enum: [...REGION_TYPES, "motion-element"] },
|
|
2487
2705
|
regionId: { type: "string" },
|
|
2488
2706
|
expectedRevision: { type: "number" },
|
|
2489
2707
|
},
|
|
@@ -2513,6 +2731,7 @@ const TOOLS = [
|
|
|
2513
2731
|
"spotlight",
|
|
2514
2732
|
"motion",
|
|
2515
2733
|
"adjustment",
|
|
2734
|
+
"motion-element",
|
|
2516
2735
|
"audio-overlay",
|
|
2517
2736
|
],
|
|
2518
2737
|
},
|
|
@@ -2662,12 +2881,14 @@ const TOOLS = [
|
|
|
2662
2881
|
},
|
|
2663
2882
|
{
|
|
2664
2883
|
name: "project_set_crop",
|
|
2665
|
-
description:
|
|
2884
|
+
description:
|
|
2885
|
+
"Crop the main video's source frame (0-1 fractions), e.g. to cut baked-in black bars. Without clipId it applies to the project and every clip (a clip's own crop, like auto-reframe's, wins otherwise). Default 0,0,1,1 (no crop).",
|
|
2666
2886
|
inputSchema: {
|
|
2667
2887
|
type: "object",
|
|
2668
2888
|
properties: {
|
|
2669
2889
|
id: { type: "string" },
|
|
2670
2890
|
path: { type: "string" },
|
|
2891
|
+
clipId: { type: "string", description: "Crop only this clip." },
|
|
2671
2892
|
x: { type: "number" },
|
|
2672
2893
|
y: { type: "number" },
|
|
2673
2894
|
width: { type: "number" },
|
|
@@ -3227,13 +3448,14 @@ const TOOLS = [
|
|
|
3227
3448
|
{
|
|
3228
3449
|
name: "transcript_transcribe",
|
|
3229
3450
|
description:
|
|
3230
|
-
"Transcribe clips with word timestamps
|
|
3451
|
+
"Transcribe clips with word timestamps (default: only clips without words). To REDO a transcript (wrong language, bad run) fix the language first, then force: true (all clips) or clipId. Word fixes are re-applied; tell the user about result droppedWordEdits[] (fixes that may need redoing). ASYNC: { jobId }, job_wait.",
|
|
3231
3452
|
inputSchema: {
|
|
3232
3453
|
type: "object",
|
|
3233
3454
|
properties: {
|
|
3234
3455
|
id: { type: "string" },
|
|
3235
3456
|
path: { type: "string" },
|
|
3236
|
-
clipId: { type: "string" },
|
|
3457
|
+
clipId: { type: "string", description: "Only this clip, even if already transcribed." },
|
|
3458
|
+
force: { type: "boolean", description: "Re-transcribe clips that already have words." },
|
|
3237
3459
|
},
|
|
3238
3460
|
},
|
|
3239
3461
|
command: "transcript.transcribe",
|
|
@@ -3422,7 +3644,8 @@ const TOOLS = [
|
|
|
3422
3644
|
},
|
|
3423
3645
|
{
|
|
3424
3646
|
name: "caption_set_template",
|
|
3425
|
-
description:
|
|
3647
|
+
description:
|
|
3648
|
+
"Pick a caption template (default glowStack); clears style overrides. Emphasis templates (hormoziEmphasis, tiltedBox, serifItalic, condensedCaps, scriptKeyword) style the IMPORTANT word of each phrase, not the spoken one; emphasis is detected on apply when missing (result.emphasis).",
|
|
3426
3649
|
inputSchema: {
|
|
3427
3650
|
type: "object",
|
|
3428
3651
|
properties: {
|
|
@@ -3447,6 +3670,11 @@ const TOOLS = [
|
|
|
3447
3670
|
"matrixDecode",
|
|
3448
3671
|
"glitchRgb",
|
|
3449
3672
|
"blendDifference",
|
|
3673
|
+
"hormoziEmphasis",
|
|
3674
|
+
"tiltedBox",
|
|
3675
|
+
"serifItalic",
|
|
3676
|
+
"condensedCaps",
|
|
3677
|
+
"scriptKeyword",
|
|
3450
3678
|
],
|
|
3451
3679
|
},
|
|
3452
3680
|
expectedRevision: { type: "number" },
|
|
@@ -3458,7 +3686,8 @@ const TOOLS = [
|
|
|
3458
3686
|
|
|
3459
3687
|
{
|
|
3460
3688
|
name: "caption_set_style",
|
|
3461
|
-
description:
|
|
3689
|
+
description:
|
|
3690
|
+
"Override caption style fields (template kept); pass only what changes. highlightMode emphasis/both detects emphasis words when missing (result.emphasis).",
|
|
3462
3691
|
inputSchema: {
|
|
3463
3692
|
type: "object",
|
|
3464
3693
|
properties: {
|
|
@@ -3475,11 +3704,45 @@ const TOOLS = [
|
|
|
3475
3704
|
strokeWidth: { type: "number" },
|
|
3476
3705
|
fontSize: { type: "string", description: "e.g. '2.6rem' (1-5rem)." },
|
|
3477
3706
|
uppercase: { type: "boolean" },
|
|
3707
|
+
highlightMode: {
|
|
3708
|
+
type: "string",
|
|
3709
|
+
enum: ["spoken", "emphasis", "both"],
|
|
3710
|
+
description: "spoken = word being said; emphasis = key words all group long.",
|
|
3711
|
+
},
|
|
3712
|
+
emphasisColor: { type: "string" },
|
|
3713
|
+
emphasisBackgroundColor: { type: "string", description: "'transparent' = no box." },
|
|
3714
|
+
emphasisScale: { type: "number", description: "0.5-2." },
|
|
3715
|
+
emphasisItalic: { type: "boolean" },
|
|
3716
|
+
emphasisFontFamily: {
|
|
3717
|
+
type: "string",
|
|
3718
|
+
description: "Engine font, e.g. Great Vibes, Playfair Display, Bebas Neue, Anton.",
|
|
3719
|
+
},
|
|
3720
|
+
boxRotation: { type: "number", description: "Box tilt degrees 0-15." },
|
|
3478
3721
|
expectedRevision: { type: "number" },
|
|
3479
3722
|
},
|
|
3480
3723
|
},
|
|
3481
3724
|
command: "caption.set-style",
|
|
3482
3725
|
},
|
|
3726
|
+
{
|
|
3727
|
+
name: "caption_mark_emphasis",
|
|
3728
|
+
description:
|
|
3729
|
+
"Set the key words emphasis caption styles mark. No wordIds: detect from the speech map (strong moments + numbers; hand marks kept unless reset). wordIds: mark (emphasis true) or unmark (false). Returns { emphasizedWords, words }.",
|
|
3730
|
+
inputSchema: {
|
|
3731
|
+
type: "object",
|
|
3732
|
+
properties: {
|
|
3733
|
+
id: { type: "string" },
|
|
3734
|
+
path: { type: "string" },
|
|
3735
|
+
wordIds: { type: "array", items: { type: "string" }, description: "From transcript_get." },
|
|
3736
|
+
emphasis: { type: "boolean", description: "With wordIds; default true." },
|
|
3737
|
+
detect: { type: "boolean" },
|
|
3738
|
+
reset: { type: "boolean", description: "Detection replaces hand marks too." },
|
|
3739
|
+
minGapMs: { type: "number", description: "Default 1200." },
|
|
3740
|
+
everyMs: { type: "number", description: "Default 2500; lower = more words." },
|
|
3741
|
+
expectedRevision: { type: "number" },
|
|
3742
|
+
},
|
|
3743
|
+
},
|
|
3744
|
+
command: "caption.mark-emphasis",
|
|
3745
|
+
},
|
|
3483
3746
|
{
|
|
3484
3747
|
name: "caption_move",
|
|
3485
3748
|
description:
|
|
@@ -3513,14 +3776,20 @@ const TOOLS = [
|
|
|
3513
3776
|
{
|
|
3514
3777
|
name: "media_generate_image",
|
|
3515
3778
|
description:
|
|
3516
|
-
"Generate one image (Replicate
|
|
3779
|
+
"Generate one image on the user's own image connector (auto: Replicate, else Higgsfield; their credits). Only after the user agreed to generating (ask first; B-roll: project_plan_broll, then ask). Returns { imagePath, provider, model, transparent }. transparent=true: trimmed PNG sticker. No connector: code NO_IMAGE_CONNECTOR, so ask the user for their own images. Each call is a paid generation.",
|
|
3517
3780
|
inputSchema: {
|
|
3518
3781
|
type: "object",
|
|
3519
3782
|
properties: {
|
|
3520
3783
|
prompt: { type: "string", description: "Keep text out of the image." },
|
|
3521
|
-
aspectRatio: {
|
|
3784
|
+
aspectRatio: {
|
|
3785
|
+
type: "string",
|
|
3786
|
+
enum: ["1:1", "3:2", "2:3", "4:3", "3:4", "16:9", "9:16"],
|
|
3787
|
+
description: "Default 3:2. 16:9 / 9:16 for full-frame video stills.",
|
|
3788
|
+
},
|
|
3522
3789
|
quality: { type: "string", enum: ["low", "medium", "high"] },
|
|
3523
3790
|
referenceImagePath: { type: "string", description: "Style reference (path or URL)." },
|
|
3791
|
+
transparent: { type: "boolean", description: "Background removed (sticker PNG)." },
|
|
3792
|
+
provider: { type: "string", enum: ["auto", "replicate", "higgsfield"] },
|
|
3524
3793
|
outputName: { type: "string" },
|
|
3525
3794
|
},
|
|
3526
3795
|
required: ["prompt"],
|
|
@@ -3671,6 +3940,350 @@ const TOOLS = [
|
|
|
3671
3940
|
},
|
|
3672
3941
|
command: "media.generate-presenter",
|
|
3673
3942
|
},
|
|
3943
|
+
{
|
|
3944
|
+
name: "project_inspect_footage",
|
|
3945
|
+
description:
|
|
3946
|
+
"Import checks before styling camera footage: flat/log (needs a grade), a flat green/blue backdrop (key it), rotation (vertical phone/camera clips). Returns per clip { flat, backdrop, rotation, contrast, blackLevel, saturation, suggestions:[{ why, verb, args }] }; run the suggested verbs.",
|
|
3947
|
+
inputSchema: {
|
|
3948
|
+
type: "object",
|
|
3949
|
+
properties: { id: { type: "string" }, path: { type: "string" }, clipId: { type: "string" } },
|
|
3950
|
+
},
|
|
3951
|
+
command: "project.inspect-footage",
|
|
3952
|
+
},
|
|
3953
|
+
{
|
|
3954
|
+
name: "project_speech_map",
|
|
3955
|
+
description:
|
|
3956
|
+
"The words the speaker STRESSES and where they land on the edited timeline (any language, incl. code-switched speech): measured from the audio (louder, sharp attack, pause before, drawn out) plus numbers and English key terms. Returns { durationMs, moments:[{ atMs, text, phrase, strength 1-3, emphasis, reasons, suggest }] }. Use as cues: zooms on strength 2-3, keyword graphics on the phrase, hits on strength 3. Needs a transcript.",
|
|
3957
|
+
inputSchema: {
|
|
3958
|
+
type: "object",
|
|
3959
|
+
properties: {
|
|
3960
|
+
id: { type: "string" },
|
|
3961
|
+
path: { type: "string" },
|
|
3962
|
+
minGapMs: { type: "number", description: "Default 2500." },
|
|
3963
|
+
everyMs: {
|
|
3964
|
+
type: "number",
|
|
3965
|
+
description:
|
|
3966
|
+
"~one moment per this long. Default 5000; Shorts 3000-4000; long-form 8000-15000.",
|
|
3967
|
+
},
|
|
3968
|
+
words: { type: "boolean", description: "Also return every word's emphasis." },
|
|
3969
|
+
},
|
|
3970
|
+
},
|
|
3971
|
+
command: "project.speech-map",
|
|
3972
|
+
},
|
|
3973
|
+
{
|
|
3974
|
+
name: "project_compose_soundtrack",
|
|
3975
|
+
description:
|
|
3976
|
+
"Score this edit: music + sound design composed FROM THE PROJECT'S OWN TIMELINE (zooms, graphics, pops, cuts, speech, stressed words) and placed under the voice with ducking; takes over zoom/overlay default sounds; replaces the previous score on re-run. Call LAST, after cuts/zooms/graphics. dryRun returns the score for media_compose_soundtrack. Returns { audioPath, scorePath, events, heroMoments, acts, soundsTakenOver, replaced }.",
|
|
3977
|
+
inputSchema: {
|
|
3978
|
+
type: "object",
|
|
3979
|
+
properties: {
|
|
3980
|
+
id: { type: "string" },
|
|
3981
|
+
path: { type: "string" },
|
|
3982
|
+
style: { type: "string", enum: ["talking-head", "short", "promo", "calm"] },
|
|
3983
|
+
mood: { type: "string", enum: ["minor", "major"] },
|
|
3984
|
+
bpm: { type: "number" },
|
|
3985
|
+
sfx: { type: "boolean", description: "Default true." },
|
|
3986
|
+
useSpeech: {
|
|
3987
|
+
type: "boolean",
|
|
3988
|
+
description: "Hero hits on the most stressed words. Default true.",
|
|
3989
|
+
},
|
|
3990
|
+
cues: {
|
|
3991
|
+
type: "array",
|
|
3992
|
+
items: {
|
|
3993
|
+
type: "object",
|
|
3994
|
+
properties: {
|
|
3995
|
+
atMs: { type: "number" },
|
|
3996
|
+
strength: { type: "number" },
|
|
3997
|
+
label: { type: "string" },
|
|
3998
|
+
},
|
|
3999
|
+
required: ["atMs"],
|
|
4000
|
+
},
|
|
4001
|
+
description: "Extra moments, e.g. a graphic's own cue times.",
|
|
4002
|
+
},
|
|
4003
|
+
musicVolume: { type: "number", description: "0-2. Default by style." },
|
|
4004
|
+
takeOverSounds: { type: "boolean", description: "Default true." },
|
|
4005
|
+
dryRun: { type: "boolean" },
|
|
4006
|
+
seed: { type: "number" },
|
|
4007
|
+
},
|
|
4008
|
+
},
|
|
4009
|
+
command: "project.compose-soundtrack",
|
|
4010
|
+
},
|
|
4011
|
+
// ── native motion elements ──────────────────────────────────────
|
|
4012
|
+
{
|
|
4013
|
+
name: "project_add_motion_element",
|
|
4014
|
+
description:
|
|
4015
|
+
"Native motion element: an editable, word-timed graphic the engine draws (preview = export, no HTML render): keyword headline, chip, stamp, count (number/range rolls up), steps, slam (+ camera kick), behind (word behind the speaker), lowerThird, highlight, endCard, progress, iconPop, frame (viewfinder / selection box / corners around the speaker). Anchor with wordId (follows the word through cuts) or atMs. Brand kit by default. Returns { elementId, element }.",
|
|
4016
|
+
inputSchema: {
|
|
4017
|
+
type: "object",
|
|
4018
|
+
properties: {
|
|
4019
|
+
id: { type: "string" },
|
|
4020
|
+
path: { type: "string" },
|
|
4021
|
+
...MOTION_ELEMENT_PROPS,
|
|
4022
|
+
expectedRevision: { type: "number" },
|
|
4023
|
+
},
|
|
4024
|
+
required: ["type", "content"],
|
|
4025
|
+
},
|
|
4026
|
+
command: "project.add-motion-element",
|
|
4027
|
+
},
|
|
4028
|
+
{
|
|
4029
|
+
name: "project_add_motion_elements",
|
|
4030
|
+
description:
|
|
4031
|
+
"Add many native motion elements in one edit (one revision). All or nothing: an invalid one rejects the batch with 'element <i>: <reason>'. Returns { elementIds, elements }.",
|
|
4032
|
+
inputSchema: {
|
|
4033
|
+
type: "object",
|
|
4034
|
+
properties: {
|
|
4035
|
+
id: { type: "string" },
|
|
4036
|
+
path: { type: "string" },
|
|
4037
|
+
elements: {
|
|
4038
|
+
type: "array",
|
|
4039
|
+
items: {
|
|
4040
|
+
type: "object",
|
|
4041
|
+
properties: MOTION_ELEMENT_PROPS,
|
|
4042
|
+
required: ["type", "content"],
|
|
4043
|
+
},
|
|
4044
|
+
},
|
|
4045
|
+
expectedRevision: { type: "number" },
|
|
4046
|
+
},
|
|
4047
|
+
required: ["elements"],
|
|
4048
|
+
},
|
|
4049
|
+
command: "project.add-motion-elements",
|
|
4050
|
+
},
|
|
4051
|
+
{
|
|
4052
|
+
name: "project_update_motion_element",
|
|
4053
|
+
description:
|
|
4054
|
+
"Change a native motion element; pass only what changes. style merges (field null = default); zone/layer/sound/zIndex null = default; atMs/wordId re-anchors and keeps the length. Editing a style-edit element makes it yours (re-runs keep it).",
|
|
4055
|
+
inputSchema: {
|
|
4056
|
+
type: "object",
|
|
4057
|
+
properties: {
|
|
4058
|
+
id: { type: "string" },
|
|
4059
|
+
path: { type: "string" },
|
|
4060
|
+
elementId: { type: "string" },
|
|
4061
|
+
...MOTION_ELEMENT_PROPS,
|
|
4062
|
+
expectedRevision: { type: "number" },
|
|
4063
|
+
},
|
|
4064
|
+
required: ["elementId"],
|
|
4065
|
+
},
|
|
4066
|
+
command: "project.update-motion-element",
|
|
4067
|
+
},
|
|
4068
|
+
{
|
|
4069
|
+
name: "project_remove_motion_element",
|
|
4070
|
+
description: "Remove a native motion element by id.",
|
|
4071
|
+
inputSchema: {
|
|
4072
|
+
type: "object",
|
|
4073
|
+
properties: {
|
|
4074
|
+
id: { type: "string" },
|
|
4075
|
+
path: { type: "string" },
|
|
4076
|
+
elementId: { type: "string" },
|
|
4077
|
+
expectedRevision: { type: "number" },
|
|
4078
|
+
},
|
|
4079
|
+
required: ["elementId"],
|
|
4080
|
+
},
|
|
4081
|
+
command: "project.remove-motion-element",
|
|
4082
|
+
},
|
|
4083
|
+
{
|
|
4084
|
+
name: "project_list_motion_elements",
|
|
4085
|
+
description:
|
|
4086
|
+
"List placed native motion elements (id, type, span, content, style, zone, layer, sound, wordId, origin) with one-line summaries. catalog=true adds every type's content shape and defaults.",
|
|
4087
|
+
inputSchema: {
|
|
4088
|
+
type: "object",
|
|
4089
|
+
properties: {
|
|
4090
|
+
id: { type: "string" },
|
|
4091
|
+
path: { type: "string" },
|
|
4092
|
+
type: { type: "string", enum: MOTION_ELEMENT_TYPES },
|
|
4093
|
+
catalog: { type: "boolean" },
|
|
4094
|
+
},
|
|
4095
|
+
},
|
|
4096
|
+
command: "project.list-motion-elements",
|
|
4097
|
+
},
|
|
4098
|
+
{
|
|
4099
|
+
name: "project_style_edit",
|
|
4100
|
+
description:
|
|
4101
|
+
"Style a talking-head / Short in one call: inspect-footage (applyFixes applies grade/key), speech-map, native motion elements on the stressed moments (numbers → count, strength-3 English statement → slam, other heroes → keyword/stamp, code-switch key terms → chip, first moment → hook, last 4 s → end card, long-form topic turns → lower third) + silent zooms (1.5x/1.25x, 1.8x hero), then compose-soundtrack. paper-cut = the Vox paper-cut look (serif ink on torn paper strips, newsprint backdrop, speaker cut out with a white keyline in the lower half, paper foley, no zooms; look=false keeps your background/framing). Latin text only: for non-Latin speech pass texts { wordId: 'English keyword' } (else zoom only). Re-runs replace only what style-edit placed. Run after cuts. dryRun returns the plan.",
|
|
4102
|
+
inputSchema: {
|
|
4103
|
+
type: "object",
|
|
4104
|
+
properties: {
|
|
4105
|
+
id: { type: "string" },
|
|
4106
|
+
path: { type: "string" },
|
|
4107
|
+
style: {
|
|
4108
|
+
type: "string",
|
|
4109
|
+
enum: ["bold-short", "editorial-long", "clean-tutorial", "paper-cut"],
|
|
4110
|
+
},
|
|
4111
|
+
format: {
|
|
4112
|
+
type: "string",
|
|
4113
|
+
enum: ["short", "long"],
|
|
4114
|
+
description: "Density; default from aspect (9:16 = short).",
|
|
4115
|
+
},
|
|
4116
|
+
applyFixes: { type: "boolean", description: "Apply inspect-footage fixes. Default false." },
|
|
4117
|
+
backdrop: {
|
|
4118
|
+
type: "string",
|
|
4119
|
+
description:
|
|
4120
|
+
"Background behind a keyed-out speaker (applyFixes) and the paper-cut backdrop: wallpaper id, colour or CSS gradient. Default: the style's studio gradient when no background is set; paper-cut uses /wallpapers/paper-cream.jpg.",
|
|
4121
|
+
},
|
|
4122
|
+
look: {
|
|
4123
|
+
type: "boolean",
|
|
4124
|
+
description:
|
|
4125
|
+
"paper-cut only: also set the look (paper backdrop, speaker cutout + white keyline, lower-half framing). Default true.",
|
|
4126
|
+
},
|
|
4127
|
+
texts: {
|
|
4128
|
+
type: "object",
|
|
4129
|
+
additionalProperties: { type: "string" },
|
|
4130
|
+
description: "{ [wordId]: 'English keyword' } overrides.",
|
|
4131
|
+
},
|
|
4132
|
+
endCard: {
|
|
4133
|
+
type: "array",
|
|
4134
|
+
items: { type: "string" },
|
|
4135
|
+
description: "[line1, line2]. Default: hook + hero line.",
|
|
4136
|
+
},
|
|
4137
|
+
accent: { type: "string", description: "Accent colour for every element; default brand." },
|
|
4138
|
+
highlight: { type: "string", description: "Emphasis colour; default brand." },
|
|
4139
|
+
zooms: { type: "boolean", description: "Default true." },
|
|
4140
|
+
score: { type: "boolean", description: "Run compose-soundtrack. Default true." },
|
|
4141
|
+
mood: { type: "string", enum: ["minor", "major"] },
|
|
4142
|
+
dryRun: { type: "boolean" },
|
|
4143
|
+
expectedRevision: { type: "number" },
|
|
4144
|
+
},
|
|
4145
|
+
},
|
|
4146
|
+
command: "project.style-edit",
|
|
4147
|
+
},
|
|
4148
|
+
{
|
|
4149
|
+
name: "media_compose_soundtrack",
|
|
4150
|
+
description:
|
|
4151
|
+
"Compose + render an original soundtrack (music, beats, SFX) from a score on the SAME timeline as the edit, so hits land on their moments. Synthesized locally: no key, no licensing, ~1 s per 15 s. Plan cues from the edit first, set bpm so cuts land on beats, then place sounds on cues. Returns { audioPath, scorePath, durationMs, lufs, truePeakDb, events, cues, warnings }; place with project_add_audio. Format + recipes: skill reference/soundtrack.md.",
|
|
4152
|
+
inputSchema: {
|
|
4153
|
+
type: "object",
|
|
4154
|
+
properties: {
|
|
4155
|
+
score: {
|
|
4156
|
+
type: "object",
|
|
4157
|
+
description: "The score. Pass score or scorePath.",
|
|
4158
|
+
properties: {
|
|
4159
|
+
duration: { type: "number", description: "Seconds (max 600)." },
|
|
4160
|
+
seed: { type: "number" },
|
|
4161
|
+
cues: {
|
|
4162
|
+
type: "object",
|
|
4163
|
+
description: 'Named moments: { "slam": 3.0, "logo": "slam+9.95" }.',
|
|
4164
|
+
additionalProperties: { type: ["number", "string"] },
|
|
4165
|
+
},
|
|
4166
|
+
events: {
|
|
4167
|
+
type: "array",
|
|
4168
|
+
items: {
|
|
4169
|
+
type: "object",
|
|
4170
|
+
properties: {
|
|
4171
|
+
at: { type: ["number", "string"], description: 'Seconds, a cue, or "cue+0.2".' },
|
|
4172
|
+
sound: {
|
|
4173
|
+
type: "string",
|
|
4174
|
+
enum: [
|
|
4175
|
+
"kick",
|
|
4176
|
+
"snare",
|
|
4177
|
+
"clap",
|
|
4178
|
+
"hat",
|
|
4179
|
+
"openhat",
|
|
4180
|
+
"tick",
|
|
4181
|
+
"click",
|
|
4182
|
+
"blip",
|
|
4183
|
+
"pop",
|
|
4184
|
+
"typing",
|
|
4185
|
+
"whoosh",
|
|
4186
|
+
"riser",
|
|
4187
|
+
"downlifter",
|
|
4188
|
+
"impact",
|
|
4189
|
+
"boom",
|
|
4190
|
+
"subdrop",
|
|
4191
|
+
"shimmer",
|
|
4192
|
+
"bass",
|
|
4193
|
+
"pluck",
|
|
4194
|
+
"pad",
|
|
4195
|
+
"lead",
|
|
4196
|
+
"bell",
|
|
4197
|
+
"keys",
|
|
4198
|
+
],
|
|
4199
|
+
},
|
|
4200
|
+
gain: { type: "number" },
|
|
4201
|
+
pan: { type: "number", description: "-1 left .. 1 right" },
|
|
4202
|
+
dur: { type: "number" },
|
|
4203
|
+
note: { type: ["string", "number"], description: '"A3" or MIDI' },
|
|
4204
|
+
notes: { type: "array", items: { type: ["string", "number"] } },
|
|
4205
|
+
chord: { type: "string", description: '"Am", "Fmaj7"' },
|
|
4206
|
+
from: { type: "number", description: "Sweep start Hz" },
|
|
4207
|
+
to: { type: "number", description: "Sweep end Hz" },
|
|
4208
|
+
bright: { type: "number", description: "0 dark .. 1 bright" },
|
|
4209
|
+
reverb: { type: "number", description: "0..1 send" },
|
|
4210
|
+
repeat: {
|
|
4211
|
+
type: "object",
|
|
4212
|
+
properties: {
|
|
4213
|
+
count: { type: "number" },
|
|
4214
|
+
every: { type: "number" },
|
|
4215
|
+
gainStep: { type: "number" },
|
|
4216
|
+
alternatePan: { type: "boolean" },
|
|
4217
|
+
jitter: { type: "number" },
|
|
4218
|
+
},
|
|
4219
|
+
},
|
|
4220
|
+
},
|
|
4221
|
+
required: ["at", "sound"],
|
|
4222
|
+
},
|
|
4223
|
+
},
|
|
4224
|
+
sections: {
|
|
4225
|
+
type: "array",
|
|
4226
|
+
items: {
|
|
4227
|
+
type: "object",
|
|
4228
|
+
properties: {
|
|
4229
|
+
from: { type: ["number", "string"] },
|
|
4230
|
+
to: { type: ["number", "string"] },
|
|
4231
|
+
bpm: { type: "number" },
|
|
4232
|
+
chords: { type: "array", items: { type: "string" } },
|
|
4233
|
+
chordBeats: { type: "number", description: "Beats per chord, default 4." },
|
|
4234
|
+
drums: {
|
|
4235
|
+
type: "string",
|
|
4236
|
+
enum: ["four-on-floor", "backbeat", "half-time", "breakbeat", "none"],
|
|
4237
|
+
},
|
|
4238
|
+
hats: { type: "string", enum: ["16ths", "8ths", "offbeat", "none"] },
|
|
4239
|
+
bass: { type: "string", enum: ["pulse", "octave", "root", "sustain", "none"] },
|
|
4240
|
+
arp: { type: "string", enum: ["up", "down", "updown", "none"] },
|
|
4241
|
+
arpRate: { type: "string", enum: ["4ths", "8ths", "16ths"] },
|
|
4242
|
+
pad: { type: ["boolean", "number"] },
|
|
4243
|
+
whooshOnChange: { type: "boolean" },
|
|
4244
|
+
melody: {
|
|
4245
|
+
type: "object",
|
|
4246
|
+
properties: {
|
|
4247
|
+
notes: { type: "array", items: { type: ["string", "number", "null"] } },
|
|
4248
|
+
rate: { type: "string", enum: ["4ths", "8ths", "16ths"] },
|
|
4249
|
+
sound: { type: "string", enum: ["pluck", "lead", "bell", "keys"] },
|
|
4250
|
+
gain: { type: "number" },
|
|
4251
|
+
length: { type: "number" },
|
|
4252
|
+
reverb: { type: "number" },
|
|
4253
|
+
},
|
|
4254
|
+
},
|
|
4255
|
+
gain: { type: "number" },
|
|
4256
|
+
mix: {
|
|
4257
|
+
type: "object",
|
|
4258
|
+
description: "Per-part levels 0-2: drums, hats, bass, arp, pad, melody.",
|
|
4259
|
+
},
|
|
4260
|
+
},
|
|
4261
|
+
required: ["from", "to", "bpm"],
|
|
4262
|
+
},
|
|
4263
|
+
},
|
|
4264
|
+
master: {
|
|
4265
|
+
type: "object",
|
|
4266
|
+
properties: {
|
|
4267
|
+
lufs: { type: "number", description: "Default -14." },
|
|
4268
|
+
ceiling: { type: "number", description: "True-peak dBFS, default -1." },
|
|
4269
|
+
fadeIn: { type: "number" },
|
|
4270
|
+
fadeOut: { type: "number" },
|
|
4271
|
+
drive: { type: "number", description: "1 clean .. 4 heavy, default 1.3." },
|
|
4272
|
+
room: { type: "number", description: "Reverb size 0..1." },
|
|
4273
|
+
},
|
|
4274
|
+
},
|
|
4275
|
+
},
|
|
4276
|
+
required: ["duration"],
|
|
4277
|
+
},
|
|
4278
|
+
scorePath: {
|
|
4279
|
+
type: "string",
|
|
4280
|
+
description: "Absolute path to a score JSON (e.g. a previous scorePath).",
|
|
4281
|
+
},
|
|
4282
|
+
name: { type: "string", description: "File name stem." },
|
|
4283
|
+
},
|
|
4284
|
+
},
|
|
4285
|
+
command: "media.compose-soundtrack",
|
|
4286
|
+
},
|
|
3674
4287
|
{
|
|
3675
4288
|
name: "media_generate_music",
|
|
3676
4289
|
description:
|
|
@@ -3823,7 +4436,7 @@ const TOOLS = [
|
|
|
3823
4436
|
recipe: {
|
|
3824
4437
|
type: "object",
|
|
3825
4438
|
description:
|
|
3826
|
-
"{ id?, title, description, category, footage?, aspectRatio?, fields: [{ key, label, type: text|longtext|select|color, default?, options?, required?, help? }], prompt, style?: { aspectRatio?, colorCorrection?, lut?: { preset, intensity? }, background?: { mode, image? }, cameraLayout?, captions?: { enabled, templateId? }, wallpaper? }, checklist: string[] }",
|
|
4439
|
+
"{ id?, title, description, category, footage?, aspectRatio?, fields: [{ key, label, type: text|longtext|select|color|images, default?, options?, required?, help?, minCount?, maxCount?, optional? }], prompt, style?: { aspectRatio?, colorCorrection?, lut?: { preset, intensity? }, background?: { mode, image? }, cameraLayout?, captions?: { enabled, templateId? }, wallpaper? }, checklist: string[] }",
|
|
3827
4440
|
},
|
|
3828
4441
|
},
|
|
3829
4442
|
required: ["recipe"],
|
|
@@ -3916,6 +4529,10 @@ const TOOLS = [
|
|
|
3916
4529
|
description: "Omit for the template's natural mode.",
|
|
3917
4530
|
},
|
|
3918
4531
|
outputName: { type: "string" },
|
|
4532
|
+
durationMs: {
|
|
4533
|
+
type: "number",
|
|
4534
|
+
description: "Length for templates with a durationRangeMs (clamped); ignored otherwise.",
|
|
4535
|
+
},
|
|
3919
4536
|
},
|
|
3920
4537
|
required: ["templateId", "slots"],
|
|
3921
4538
|
},
|
|
@@ -4029,7 +4646,11 @@ const TOOLS = [
|
|
|
4029
4646
|
aspectRatio: { type: "string", enum: ["16:9", "9:16", "1:1"] },
|
|
4030
4647
|
width: { type: "number" },
|
|
4031
4648
|
height: { type: "number" },
|
|
4032
|
-
durationMs: {
|
|
4649
|
+
durationMs: {
|
|
4650
|
+
type: "number",
|
|
4651
|
+
description:
|
|
4652
|
+
"Omit when the root declares data-duration (that is the length rendered; a mismatch warns). Else default 2500. Max 600000 (10 min).",
|
|
4653
|
+
},
|
|
4033
4654
|
frameRate: { type: "number" },
|
|
4034
4655
|
outputName: { type: "string" },
|
|
4035
4656
|
audioPath: { type: "string", description: "Muxed in (not when transparent)." },
|
|
@@ -4054,7 +4675,10 @@ const TOOLS = [
|
|
|
4054
4675
|
aspectRatio: { type: "string", enum: ["16:9", "9:16", "1:1"] },
|
|
4055
4676
|
width: { type: "number" },
|
|
4056
4677
|
height: { type: "number" },
|
|
4057
|
-
atMs: {
|
|
4678
|
+
atMs: {
|
|
4679
|
+
type: "number",
|
|
4680
|
+
description: "Clamped to the composition's data-duration; result atMs = time captured.",
|
|
4681
|
+
},
|
|
4058
4682
|
transparent: { type: "boolean" },
|
|
4059
4683
|
assets: ASSETS_PROP,
|
|
4060
4684
|
outputName: { type: "string" },
|
|
@@ -4129,7 +4753,7 @@ const TOOLS = [
|
|
|
4129
4753
|
{
|
|
4130
4754
|
name: "asset_list_transitions",
|
|
4131
4755
|
description:
|
|
4132
|
-
"List bundled transitions (id, title, category, durationSeconds) for project_add_transition.",
|
|
4756
|
+
"List bundled transitions (id, title, kind overlay|native, effect, category, durationSeconds, defaultSoundId) for project_add_transition.",
|
|
4133
4757
|
inputSchema: { type: "object", properties: {} },
|
|
4134
4758
|
command: "asset.list-transitions",
|
|
4135
4759
|
},
|
|
@@ -4290,7 +4914,7 @@ const TOOLS = [
|
|
|
4290
4914
|
{
|
|
4291
4915
|
name: "export_generate_thumbnail",
|
|
4292
4916
|
description:
|
|
4293
|
-
"Generate a YouTube thumbnail for an export (Replicate, spends credits). Pass subject + hook, or omit to derive from the transcript. Returns { imagePath }.",
|
|
4917
|
+
"Generate a YouTube thumbnail for an export (user's image connector: Replicate, else Higgsfield; spends their credits). Pass subject + hook, or omit to derive from the transcript. Returns { imagePath }.",
|
|
4294
4918
|
inputSchema: {
|
|
4295
4919
|
type: "object",
|
|
4296
4920
|
properties: {
|
|
@@ -4556,7 +5180,8 @@ Before an editing pass, read the skill's "Which tool for which moment" section (
|
|
|
4556
5180
|
5. transcript_remove_silences.
|
|
4557
5181
|
6. audio_clean clips not yet cleaned.
|
|
4558
5182
|
7. Captions (caption_toggle; template glowStack unless a recipe says otherwise), motion graphics, emphasis zooms: only after steps 2-5, which shift the timeline.
|
|
4559
|
-
8.
|
|
5183
|
+
8. B-roll, last: project_plan_broll, show the user the moments and ASK: their own images, generated on their image connector (only if one is connected; it uses their credits), or no B-roll. Never generate or invent images without their answer. Place what they give with project_add_broll. Nobody to ask: skip it and say so.
|
|
5184
|
+
9. llm_generate_title / description / timestamps, then preview_show and ask before export_start. Never export before the user has seen the preview.
|
|
4560
5185
|
Report the real count each step returned. Never add music, intro/outro cards or FX overlays unless asked.
|
|
4561
5186
|
|
|
4562
5187
|
Style defaults when the user names no style, recipe or creator (their choice or a saved memory wins):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.194.0",
|
|
4
4
|
"description": "Model Context Protocol server for PandaStudio. Exposes the desktop video editor's automation surface to Cursor, Continue, Cline, Claude Desktop, and any MCP-compliant client.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pandastudio",
|