@writepanda/mcp 1.229.0 → 1.240.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 +312 -26
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -819,7 +819,7 @@ const TOOLS = [
|
|
|
819
819
|
{
|
|
820
820
|
name: "system_get_transcription_language",
|
|
821
821
|
description:
|
|
822
|
-
"Workspace transcription language. auto = Parakeet TDT v3
|
|
822
|
+
"Workspace transcription language + on-device engine, and the engine a run would use and why: { language, engine (auto|parakeet|whisper), route { engine, lockedLanguage, reason }, whisperModel { downloaded, size } }. auto language = Parakeet TDT v3 detects it (25 languages: Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Russian, Slovak, Slovenian, Spanish, Swedish, Ukrainian). With engine auto, English stays on Parakeet (keeps fillers) and any other named language is transcribed by Whisper LOCKED to it (no drift into English).",
|
|
823
823
|
inputSchema: { type: "object", properties: {} },
|
|
824
824
|
command: "system.get-transcription-language",
|
|
825
825
|
},
|
|
@@ -846,7 +846,7 @@ const TOOLS = [
|
|
|
846
846
|
{
|
|
847
847
|
name: "system_set_transcription_language",
|
|
848
848
|
description:
|
|
849
|
-
"Set the workspace transcription language. auto = Parakeet TDT v3
|
|
849
|
+
"Set the workspace transcription language. auto = Parakeet TDT v3 detects it. english/en is saved as auto (Parakeet keeps filler words). Any other language (french, romanian, chinese ...) is saved as itself and, with engine auto, transcribed by Whisper large-v3-turbo LOCKED to it (task transcribe, never translate): Parakeet can't be locked and drifts into English on accented speech. Whisper is a one-time ~550 MB download: if system_get_transcription_language whisperModel.downloaded is false, ask the user, then system_download_whisper_model. Keep a European language on Parakeet with system_set_transcription_preferences engine parakeet.",
|
|
850
850
|
inputSchema: {
|
|
851
851
|
type: "object",
|
|
852
852
|
properties: {
|
|
@@ -1635,7 +1635,7 @@ const TOOLS = [
|
|
|
1635
1635
|
{
|
|
1636
1636
|
name: "project_new",
|
|
1637
1637
|
description:
|
|
1638
|
-
"Create a project; withMedia imports videos as clips, or AUDIO files (MP3 / WAV / M4A / AAC / FLAC / OGG) as an audio-only podcast project. speakers = one audio file per speaker (host first): a multi-speaker audio clip synced by audio.",
|
|
1638
|
+
"Create a project; withMedia imports videos as clips (each whole, or only a {path, sourceStartMs, sourceEndMs} range), or AUDIO files (MP3 / WAV / M4A / AAC / FLAC / OGG) as an audio-only podcast project. speakers = one audio file per speaker (host first): a multi-speaker audio clip synced by audio. Returns editedDurationMs and warnings (e.g. the same footage repeated on several clips, or longer than parentProjectId's project): read them before going on.",
|
|
1639
1639
|
inputSchema: {
|
|
1640
1640
|
type: "object",
|
|
1641
1641
|
properties: {
|
|
@@ -1645,8 +1645,23 @@ const TOOLS = [
|
|
|
1645
1645
|
name: { type: "string" },
|
|
1646
1646
|
withMedia: {
|
|
1647
1647
|
type: "array",
|
|
1648
|
-
items: {
|
|
1649
|
-
|
|
1648
|
+
items: {
|
|
1649
|
+
anyOf: [
|
|
1650
|
+
{ type: "string" },
|
|
1651
|
+
{
|
|
1652
|
+
type: "object",
|
|
1653
|
+
properties: {
|
|
1654
|
+
path: { type: "string" },
|
|
1655
|
+
sourceStartMs: { type: "number" },
|
|
1656
|
+
sourceEndMs: { type: "number" },
|
|
1657
|
+
},
|
|
1658
|
+
required: ["path"],
|
|
1659
|
+
additionalProperties: false,
|
|
1660
|
+
},
|
|
1661
|
+
],
|
|
1662
|
+
},
|
|
1663
|
+
description:
|
|
1664
|
+
"Videos, or audio files (an audio-only project). Not both. An item is a path (whole file) or {path, sourceStartMs, sourceEndMs} for only that range (ms in the file's own time): excerpts / previews, the same file may repeat with different ranges.",
|
|
1650
1665
|
},
|
|
1651
1666
|
speakers: {
|
|
1652
1667
|
type: "array",
|
|
@@ -1699,7 +1714,7 @@ const TOOLS = [
|
|
|
1699
1714
|
{
|
|
1700
1715
|
name: "project_add_clip",
|
|
1701
1716
|
description:
|
|
1702
|
-
"Append or insert a video clip, an audio file (audio-only projects only), or a still image shown for durationMs, on the main track (later content moves with it). atMs (edited time) inserts at that moment, splitting the clip under it; add replaceToMs to replace [atMs, replaceToMs) with the clip (e.g. a re-recorded take).",
|
|
1717
|
+
"Append or insert a video clip (whole, or only sourceStartMs-sourceEndMs of it), an audio file (audio-only projects only), or a still image shown for durationMs, on the main track (later content moves with it). atMs (edited time) inserts at that moment, splitting the clip under it; add replaceToMs to replace [atMs, replaceToMs) with the clip (e.g. a re-recorded take).",
|
|
1703
1718
|
inputSchema: {
|
|
1704
1719
|
type: "object",
|
|
1705
1720
|
properties: {
|
|
@@ -1719,12 +1734,39 @@ const TOOLS = [
|
|
|
1719
1734
|
description:
|
|
1720
1735
|
"With atMs: replace [atMs, replaceToMs), merge overlapping or adjacent cuts, and remove fully trimmed clips.",
|
|
1721
1736
|
},
|
|
1737
|
+
sourceStartMs: {
|
|
1738
|
+
type: "number",
|
|
1739
|
+
description:
|
|
1740
|
+
"Video / audio: in-point, ms in the file's own time. Add only an excerpt instead of the whole file.",
|
|
1741
|
+
},
|
|
1742
|
+
sourceEndMs: {
|
|
1743
|
+
type: "number",
|
|
1744
|
+
description: "Video / audio: out-point, ms in the file's own time (default: its end).",
|
|
1745
|
+
},
|
|
1722
1746
|
expectedRevision: { type: "number" },
|
|
1723
1747
|
},
|
|
1724
1748
|
required: ["media"],
|
|
1725
1749
|
},
|
|
1726
1750
|
command: "project.add-clip",
|
|
1727
1751
|
},
|
|
1752
|
+
{
|
|
1753
|
+
name: "project_set_clip_range",
|
|
1754
|
+
description:
|
|
1755
|
+
"Set which part of a clip's media plays (in / out point, ms in the clip's own source time), like dragging its edges: head + tail cut, old edge cuts replaced, inner cuts kept. Turns a full-length clip into an excerpt. Returns editedDurationMs + warnings.",
|
|
1756
|
+
inputSchema: {
|
|
1757
|
+
type: "object",
|
|
1758
|
+
properties: {
|
|
1759
|
+
id: { type: "string" },
|
|
1760
|
+
path: { type: "string" },
|
|
1761
|
+
clipId: { type: "string" },
|
|
1762
|
+
sourceStartMs: { type: "number", description: "Default 0." },
|
|
1763
|
+
sourceEndMs: { type: "number", description: "Default: the media's end." },
|
|
1764
|
+
expectedRevision: { type: "number" },
|
|
1765
|
+
},
|
|
1766
|
+
required: ["clipId"],
|
|
1767
|
+
},
|
|
1768
|
+
command: "project.set-clip-range",
|
|
1769
|
+
},
|
|
1728
1770
|
{
|
|
1729
1771
|
name: "project_set_clip_duration",
|
|
1730
1772
|
description: "Change how long an image clip shows (later content moves).",
|
|
@@ -3023,6 +3065,58 @@ const TOOLS = [
|
|
|
3023
3065
|
},
|
|
3024
3066
|
command: "audio.probe",
|
|
3025
3067
|
},
|
|
3068
|
+
{
|
|
3069
|
+
name: "audio_detect_beats",
|
|
3070
|
+
description:
|
|
3071
|
+
"Beats of a music track on the EDITED timeline: beatsMs, downbeatsMs (bar starts, 4/4 estimated), tempoBpm, confidence. Local analysis, cached per file; follows the track's trim, in-point and loop. regionId = audio overlay id (default: the longest music track). Use to time cuts, graphics or B-roll to music; project_place_on_beats does a whole montage. No beats / confidence < 0.2 = no steady beat.",
|
|
3072
|
+
inputSchema: {
|
|
3073
|
+
type: "object",
|
|
3074
|
+
properties: {
|
|
3075
|
+
id: { type: "string" },
|
|
3076
|
+
path: { type: "string" },
|
|
3077
|
+
regionId: {
|
|
3078
|
+
type: "string",
|
|
3079
|
+
description: "Audio overlay id. Default: the longest music track.",
|
|
3080
|
+
},
|
|
3081
|
+
fromMs: { type: "number", minimum: 0, description: "Only beats from here (edited ms)." },
|
|
3082
|
+
toMs: { type: "number", minimum: 0, description: "Only beats up to here (edited ms)." },
|
|
3083
|
+
force: { type: "boolean", description: "Re-analyse instead of using the cache." },
|
|
3084
|
+
},
|
|
3085
|
+
},
|
|
3086
|
+
command: "audio.detect-beats",
|
|
3087
|
+
},
|
|
3088
|
+
{
|
|
3089
|
+
name: "project_place_on_beats",
|
|
3090
|
+
description:
|
|
3091
|
+
"Music-driven montage: lay pictures / B-roll / video overlays out so each changes on the beat. regionIds = existing overlay ids in play order (retimed; B-roll transitions follow) OR paths = new image/video files to add full-frame. every: 1 (every beat), 2 (default), 4 (every bar, from a downbeat). fromMs/toMs bound the run (default: the music's span). Item i plays from cut i to cut i+1; extras come back in unplaced.",
|
|
3092
|
+
inputSchema: {
|
|
3093
|
+
type: "object",
|
|
3094
|
+
properties: {
|
|
3095
|
+
id: { type: "string" },
|
|
3096
|
+
path: { type: "string" },
|
|
3097
|
+
regionIds: {
|
|
3098
|
+
type: "array",
|
|
3099
|
+
items: { type: "string" },
|
|
3100
|
+
description: "Overlay ids, in play order.",
|
|
3101
|
+
},
|
|
3102
|
+
paths: {
|
|
3103
|
+
type: "array",
|
|
3104
|
+
items: { type: "string" },
|
|
3105
|
+
description: "Or image/video files to add, in play order.",
|
|
3106
|
+
},
|
|
3107
|
+
every: { type: "number", enum: [1, 2, 4], description: "Beats per item. Default 2." },
|
|
3108
|
+
fromMs: { type: "number", minimum: 0 },
|
|
3109
|
+
toMs: { type: "number", minimum: 0 },
|
|
3110
|
+
musicRegionId: {
|
|
3111
|
+
type: "string",
|
|
3112
|
+
description: "Audio overlay to follow. Default: the longest music track.",
|
|
3113
|
+
},
|
|
3114
|
+
expectedRevision: { type: "number" },
|
|
3115
|
+
},
|
|
3116
|
+
required: ["id"],
|
|
3117
|
+
},
|
|
3118
|
+
command: "project.place-on-beats",
|
|
3119
|
+
},
|
|
3026
3120
|
{
|
|
3027
3121
|
name: "project_set_region_sound",
|
|
3028
3122
|
description: "Set or clear the SFX on an existing zoom, motionGraphic or fx region.",
|
|
@@ -3332,7 +3426,7 @@ const TOOLS = [
|
|
|
3332
3426
|
{
|
|
3333
3427
|
name: "project_save",
|
|
3334
3428
|
description:
|
|
3335
|
-
"Overwrite a project file with `project` (pass expectedRevision). Without it, returns the current revision. Verbs already autosave.",
|
|
3429
|
+
"Overwrite a project file with `project` (pass expectedRevision). Without it, returns the current revision. Verbs already autosave. Clips have no in/out or speed fields (sourceStartMs, inMs, speed, ...): those are rejected, use project_set_clip_range / project_add_speed.",
|
|
3336
3430
|
inputSchema: {
|
|
3337
3431
|
type: "object",
|
|
3338
3432
|
properties: {
|
|
@@ -3910,9 +4004,14 @@ const TOOLS = [
|
|
|
3910
4004
|
fadeOut: { type: "number", description: "ms; needs endMs." },
|
|
3911
4005
|
anchorSourceMs: { type: "number", description: "SFX only (not music): SOURCE ms anchor." },
|
|
3912
4006
|
anchorSourceEndMs: ANCHOR_END_PROP,
|
|
4007
|
+
loop: {
|
|
4008
|
+
type: "boolean",
|
|
4009
|
+
description: "Repeat the file to endMs (a ~30 s Lyria clip under a longer video).",
|
|
4010
|
+
},
|
|
3913
4011
|
transcribe: {
|
|
3914
4012
|
type: "boolean",
|
|
3915
|
-
description:
|
|
4013
|
+
description:
|
|
4014
|
+
"Words into the transcript (job_wait transcribeJobId). A generated narration is in by DEFAULT (script timed to the audio); false keeps it out. true transcribes any other voiceover.",
|
|
3916
4015
|
},
|
|
3917
4016
|
ducking: {
|
|
3918
4017
|
description: "Duck under the voice: true or a ducking object.",
|
|
@@ -4027,6 +4126,46 @@ const TOOLS = [
|
|
|
4027
4126
|
},
|
|
4028
4127
|
command: "project.set-clip-color",
|
|
4029
4128
|
},
|
|
4129
|
+
{
|
|
4130
|
+
name: "project_align_cursor",
|
|
4131
|
+
description:
|
|
4132
|
+
"Fix a screen recording whose drawn cursor / cursor auto-zooms land in the wrong place (old recordings saved the pointer with the wrong mapping) without re-recording. Pins: at atMs the REAL pointer (or what was clicked) is at x,y, fractions 0-1 of the recorded frame. 1 pin = offset; 2+ pins far apart also fix scale per axis. Stored on the clip (non-destructive), used by preview, export and auto-zoom; cursor auto-zooms follow unless moveZooms false. reset removes it. Check with project_render_frame.",
|
|
4133
|
+
inputSchema: {
|
|
4134
|
+
type: "object",
|
|
4135
|
+
properties: {
|
|
4136
|
+
id: { type: "string" },
|
|
4137
|
+
path: { type: "string" },
|
|
4138
|
+
clipId: {
|
|
4139
|
+
type: "string",
|
|
4140
|
+
description: "Default: the clip under the first pin (or the only clip).",
|
|
4141
|
+
},
|
|
4142
|
+
points: {
|
|
4143
|
+
type: "array",
|
|
4144
|
+
description:
|
|
4145
|
+
"[{atMs (edited timeline ms) or sourceMs (clip's own ms), x 0-1, y 0-1}] where the real pointer is.",
|
|
4146
|
+
items: {
|
|
4147
|
+
type: "object",
|
|
4148
|
+
properties: {
|
|
4149
|
+
atMs: { type: "number" },
|
|
4150
|
+
sourceMs: { type: "number" },
|
|
4151
|
+
x: { type: "number" },
|
|
4152
|
+
y: { type: "number" },
|
|
4153
|
+
},
|
|
4154
|
+
required: ["x", "y"],
|
|
4155
|
+
},
|
|
4156
|
+
},
|
|
4157
|
+
add: { type: "boolean", description: "Add to the clip's existing pins (refine)." },
|
|
4158
|
+
reset: { type: "boolean", description: "Remove the correction." },
|
|
4159
|
+
moveZooms: {
|
|
4160
|
+
type: "boolean",
|
|
4161
|
+
description: "Re-point cursor-placed auto-zooms with it (default true).",
|
|
4162
|
+
},
|
|
4163
|
+
dryRun: { type: "boolean" },
|
|
4164
|
+
expectedRevision: { type: "number" },
|
|
4165
|
+
},
|
|
4166
|
+
},
|
|
4167
|
+
command: "project.align-cursor",
|
|
4168
|
+
},
|
|
4030
4169
|
{
|
|
4031
4170
|
name: "project_set_clip_chroma_key",
|
|
4032
4171
|
description:
|
|
@@ -4345,13 +4484,13 @@ const TOOLS = [
|
|
|
4345
4484
|
{
|
|
4346
4485
|
name: "system_set_transcription_preferences",
|
|
4347
4486
|
description:
|
|
4348
|
-
"Save workspace language and
|
|
4487
|
+
"Save workspace transcription language, provider and/or on-device engine atomically (pass any). engine: auto (Parakeet for English/auto-detect, Whisper LOCKED to any other named language), parakeet (keeps fillers, detects the language, can't be locked), whisper (locks to the language). Confirm consent to upload audio for cloud. Cloud and apple cannot use auto.",
|
|
4349
4488
|
inputSchema: {
|
|
4350
4489
|
type: "object",
|
|
4351
|
-
required: ["language", "provider"],
|
|
4352
4490
|
properties: {
|
|
4353
4491
|
language: { type: "string" },
|
|
4354
4492
|
provider: { type: "string", enum: ["local", "apple", "deepgram", "elevenlabs"] },
|
|
4493
|
+
engine: { type: "string", enum: ["auto", "parakeet", "whisper"] },
|
|
4355
4494
|
},
|
|
4356
4495
|
},
|
|
4357
4496
|
command: "system.set-transcription-preferences",
|
|
@@ -4360,7 +4499,7 @@ const TOOLS = [
|
|
|
4360
4499
|
{
|
|
4361
4500
|
name: "transcript_transcribe",
|
|
4362
4501
|
description:
|
|
4363
|
-
"Transcribe clips with word timestamps (default: only clips without words). To REDO a transcript (wrong language, bad run) confirm language, pass per-run language and provider overrides, then force: true (all clips) or clipId. Word fixes are re-applied; tell the user about result droppedWordEdits[] (fixes that may need redoing). Each clip is transcribed only over the part it plays (head trim to
|
|
4502
|
+
"Transcribe clips with word timestamps (default: only clips without words). Engine: language auto/english = Parakeet; any other named language = local Whisper LOCKED to it (engine override). Returns { jobId, plan } (plan = engine + reason, ranges, totalAudioMs: the audio that will be processed; tell the user for long jobs). To REDO a transcript (wrong language, bad run) confirm language, pass per-run language and provider overrides, then force: true (all clips) or clipId. Word fixes are re-applied; tell the user about result droppedWordEdits[] (fixes that may need redoing). Each clip is transcribed only over the part it plays (head trim to tail trim, e.g. one half of a split; only the kept parts when cuts hide most of a long recording; result transcribedRanges[]). ASYNC: { jobId }, job_wait. Concurrent saves are merged and retried (three attempts). Exhausted conflicts report code revision_conflict / status 409 (job.errorDetails for async jobs).",
|
|
4364
4503
|
inputSchema: {
|
|
4365
4504
|
type: "object",
|
|
4366
4505
|
properties: {
|
|
@@ -4379,10 +4518,74 @@ const TOOLS = [
|
|
|
4379
4518
|
"Per-run provider. apple stays on this Mac. Audio is sent to the selected cloud provider.",
|
|
4380
4519
|
},
|
|
4381
4520
|
force: { type: "boolean", description: "Re-transcribe clips that already have words." },
|
|
4521
|
+
engine: {
|
|
4522
|
+
type: "string",
|
|
4523
|
+
enum: ["auto", "parakeet", "whisper"],
|
|
4524
|
+
description:
|
|
4525
|
+
"Per-run on-device engine (provider local). auto: Parakeet for English/auto, Whisper LOCKED to any other named language. parakeet keeps fillers but can't be locked to a language.",
|
|
4526
|
+
},
|
|
4527
|
+
dryRun: {
|
|
4528
|
+
type: "boolean",
|
|
4529
|
+
description:
|
|
4530
|
+
"Return the plan (engine + reason, per-clip source ranges, totalAudioMs) without transcribing. Use before long jobs.",
|
|
4531
|
+
},
|
|
4382
4532
|
},
|
|
4383
4533
|
},
|
|
4384
4534
|
command: "transcript.transcribe",
|
|
4385
4535
|
},
|
|
4536
|
+
{
|
|
4537
|
+
name: "system_download_whisper_model",
|
|
4538
|
+
description:
|
|
4539
|
+
"Download the Whisper large-v3-turbo model (~550 MB, once; then offline). Needed when a run routes to Whisper (any named language except English with engine auto, or engine whisper). ASK the user first. ASYNC: { jobId }, job_wait.",
|
|
4540
|
+
inputSchema: { type: "object", properties: {} },
|
|
4541
|
+
command: "system.download-whisper-model",
|
|
4542
|
+
},
|
|
4543
|
+
{
|
|
4544
|
+
name: "transcript_align_narration",
|
|
4545
|
+
description:
|
|
4546
|
+
"Generated narrations into the transcript and captions (script timed to the audio with local speech recognition: the words are exactly the script). New narrations are aligned automatically; use for older projects (default: every narration with a script but no words), force re-timing, or include false to keep one out (sung / non-speech) / true to put it back. ASYNC { jobIds }: job_wait each.",
|
|
4547
|
+
inputSchema: {
|
|
4548
|
+
type: "object",
|
|
4549
|
+
properties: {
|
|
4550
|
+
id: { type: "string" },
|
|
4551
|
+
path: { type: "string" },
|
|
4552
|
+
regionId: {
|
|
4553
|
+
type: "string",
|
|
4554
|
+
description: "One narration (audio-N); omit for all that need it.",
|
|
4555
|
+
},
|
|
4556
|
+
include: { type: "boolean", description: "false = out of transcript + captions." },
|
|
4557
|
+
force: { type: "boolean", description: "Re-align even with words." },
|
|
4558
|
+
expectedRevision: { type: "number" },
|
|
4559
|
+
},
|
|
4560
|
+
},
|
|
4561
|
+
command: "transcript.align-narration",
|
|
4562
|
+
},
|
|
4563
|
+
{
|
|
4564
|
+
name: "transcript_import",
|
|
4565
|
+
description:
|
|
4566
|
+
"Replace a clip's transcript from a file: SRT, VTT (inline <00:00:01.500> word times supported), or word-timed JSON (whisper / faster-whisper / whisperX segments[].words[], {words:[...]}, {word_segments:[...]}, or [{word|text,start,end}] in seconds; startMs/endMs in ms). timeBase REQUIRED: source (media file time) or edited (the cut video's timeline; mapped through cuts/speed). Errors (lines going backwards, ending before starting, outside the clip) refuse with line numbers; overlaps are trimmed with a warning. Line-level timing is ALIGNED to measured word timings (align auto: the clip's current words, else a local transcription of just those lines = async { jobId }); without any, words are spread per line and alignment.method is 'proportional' (tell the user). Cuts kept; word fixes re-applied (droppedWordEdits[] otherwise); same word at same moment keeps its id. dryRun previews.",
|
|
4567
|
+
inputSchema: {
|
|
4568
|
+
type: "object",
|
|
4569
|
+
properties: {
|
|
4570
|
+
id: { type: "string" },
|
|
4571
|
+
path: { type: "string" },
|
|
4572
|
+
clipId: {
|
|
4573
|
+
type: "string",
|
|
4574
|
+
description: "Optional when the project has one clip with audio.",
|
|
4575
|
+
},
|
|
4576
|
+
file: { type: "string", description: "Absolute path to the .srt/.vtt/.json file." },
|
|
4577
|
+
content: { type: "string", description: "The file's text instead of file." },
|
|
4578
|
+
format: { type: "string", enum: ["auto", "srt", "vtt", "json"] },
|
|
4579
|
+
timeBase: { type: "string", enum: ["source", "edited"] },
|
|
4580
|
+
align: { type: "string", enum: ["auto", "existing", "transcribe", "proportional"] },
|
|
4581
|
+
language: { type: "string" },
|
|
4582
|
+
dryRun: { type: "boolean" },
|
|
4583
|
+
expectedRevision: { type: "number" },
|
|
4584
|
+
},
|
|
4585
|
+
required: ["timeBase"],
|
|
4586
|
+
},
|
|
4587
|
+
command: "transcript.import",
|
|
4588
|
+
},
|
|
4386
4589
|
{
|
|
4387
4590
|
name: "transcript_get",
|
|
4388
4591
|
description:
|
|
@@ -4579,7 +4782,7 @@ const TOOLS = [
|
|
|
4579
4782
|
{
|
|
4580
4783
|
name: "transcript_remove_silences",
|
|
4581
4784
|
description:
|
|
4582
|
-
"Remove measured quiet runs inside transcript pauses (never into a word) with a 50ms decay hold. Counts only visible time (nothing under a head trim or existing cut). Returns snapped/skipped/warnings; snapToAudio=false uses legacy timing.",
|
|
4785
|
+
"Remove measured quiet runs inside transcript pauses (never into a word) with a 50ms decay hold. Counts only visible time (nothing under a head trim or existing cut). Returns snapped/skipped/warnings; snapToAudio=false uses legacy timing. Applies its cuts to the project as it is when it writes (editor saves meanwhile are kept, no revision_conflict). Fails with code media_offline / media_read_stalled / media_read_too_slow when the source (e.g. an online-only Dropbox / iCloud file) can't be read: tell the user to make it available offline, then run again; project_changed_during_analysis when the clips or word timings kept changing.",
|
|
4583
4786
|
inputSchema: {
|
|
4584
4787
|
type: "object",
|
|
4585
4788
|
properties: {
|
|
@@ -4755,6 +4958,39 @@ const TOOLS = [
|
|
|
4755
4958
|
command: "caption.set-template",
|
|
4756
4959
|
},
|
|
4757
4960
|
|
|
4961
|
+
{
|
|
4962
|
+
name: "caption_set_punctuation",
|
|
4963
|
+
description:
|
|
4964
|
+
'Clean punctuation out of the CAPTIONS in one call (same as Captions > Clean up punctuation, one undo step). preset clean (default): removes full stops, commas, ! : ; … quotes dashes brackets, KEEPS question marks (keepQuestionMarks false removes them); all; none (show the transcript\'s punctuation). Or remove: [period, comma, question, exclamation, colon, ellipsis, quotes, dashes, brackets]. The transcript text is NOT changed (timings, cuts, sentence breaks intact; reversible). Never merges words ("Bonjour.Merci" -> "Bonjour Merci"); keeps j\'ai, aujourd\'hui, peut-être, 3.5, 10:30, writepanda.ai.',
|
|
4965
|
+
inputSchema: {
|
|
4966
|
+
type: "object",
|
|
4967
|
+
properties: {
|
|
4968
|
+
id: { type: "string" },
|
|
4969
|
+
path: { type: "string" },
|
|
4970
|
+
preset: { type: "string", enum: ["clean", "all", "none"] },
|
|
4971
|
+
remove: {
|
|
4972
|
+
type: "array",
|
|
4973
|
+
items: {
|
|
4974
|
+
type: "string",
|
|
4975
|
+
enum: [
|
|
4976
|
+
"period",
|
|
4977
|
+
"comma",
|
|
4978
|
+
"question",
|
|
4979
|
+
"exclamation",
|
|
4980
|
+
"colon",
|
|
4981
|
+
"ellipsis",
|
|
4982
|
+
"quotes",
|
|
4983
|
+
"dashes",
|
|
4984
|
+
"brackets",
|
|
4985
|
+
],
|
|
4986
|
+
},
|
|
4987
|
+
},
|
|
4988
|
+
keepQuestionMarks: { type: "boolean" },
|
|
4989
|
+
expectedRevision: { type: "number" },
|
|
4990
|
+
},
|
|
4991
|
+
},
|
|
4992
|
+
command: "caption.set-punctuation",
|
|
4993
|
+
},
|
|
4758
4994
|
{
|
|
4759
4995
|
name: "caption_set_style",
|
|
4760
4996
|
description:
|
|
@@ -4934,6 +5170,48 @@ const TOOLS = [
|
|
|
4934
5170
|
},
|
|
4935
5171
|
command: "media.generate-narration",
|
|
4936
5172
|
},
|
|
5173
|
+
{
|
|
5174
|
+
name: "media_regenerate_narration",
|
|
5175
|
+
description:
|
|
5176
|
+
"Regenerate a narration already on the timeline IN PLACE from its stored source (script, model, voice, tone on audioOverlays[].generatedFrom). Pass only what changes (text with the edited script, voice, model, ...). Same start, volume, fades, ducking; length = new audio. Its words in the transcript are re-timed to the new take from the script (transcribeJobId: job_wait it) unless it opted out. One undo step. No stored source (older narration) = pass text.",
|
|
5177
|
+
inputSchema: {
|
|
5178
|
+
type: "object",
|
|
5179
|
+
properties: {
|
|
5180
|
+
id: { type: "string" },
|
|
5181
|
+
path: { type: "string" },
|
|
5182
|
+
regionId: { type: "string", description: "The narration's audio overlay id (audio-N)." },
|
|
5183
|
+
text: { type: "string", description: "New script (default: stored)." },
|
|
5184
|
+
model: { type: "string", description: "New engine; without voice uses its default voice." },
|
|
5185
|
+
voice: { type: "string" },
|
|
5186
|
+
style: { type: "string", description: "Tone (cloud); '' clears." },
|
|
5187
|
+
language: { type: "string" },
|
|
5188
|
+
speed: { type: "number" },
|
|
5189
|
+
pronunciations: { type: "object", description: 'e.g. {"Kamal":"Ka mal"}' },
|
|
5190
|
+
expectedRevision: { type: "number" },
|
|
5191
|
+
},
|
|
5192
|
+
required: ["regionId"],
|
|
5193
|
+
},
|
|
5194
|
+
command: "media.regenerate-narration",
|
|
5195
|
+
},
|
|
5196
|
+
{
|
|
5197
|
+
name: "media_regenerate_image",
|
|
5198
|
+
description:
|
|
5199
|
+
"Regenerate a generated picture on the timeline (a B-roll beat's image) IN PLACE from its stored prompt (editor.mediaOverlayRegions[].generatedImage); pass prompt to change it. Timing, push, transitions, shutter kept. PAID on the user's image connector: only when they asked. One undo step.",
|
|
5200
|
+
inputSchema: {
|
|
5201
|
+
type: "object",
|
|
5202
|
+
properties: {
|
|
5203
|
+
id: { type: "string" },
|
|
5204
|
+
path: { type: "string" },
|
|
5205
|
+
regionId: { type: "string", description: "The picture's overlay id." },
|
|
5206
|
+
prompt: { type: "string", description: "New prompt (default: stored)." },
|
|
5207
|
+
aspectRatio: { type: "string" },
|
|
5208
|
+
quality: { type: "string", enum: ["low", "medium", "high"] },
|
|
5209
|
+
expectedRevision: { type: "number" },
|
|
5210
|
+
},
|
|
5211
|
+
required: ["regionId"],
|
|
5212
|
+
},
|
|
5213
|
+
command: "media.regenerate-image",
|
|
5214
|
+
},
|
|
4937
5215
|
{
|
|
4938
5216
|
name: "recording_list_sources",
|
|
4939
5217
|
description: "List displays and windows for recording_start's source.",
|
|
@@ -5424,30 +5702,38 @@ const TOOLS = [
|
|
|
5424
5702
|
{
|
|
5425
5703
|
name: "media_generate_music",
|
|
5426
5704
|
description:
|
|
5427
|
-
"Generate instrumental music via Replicate
|
|
5705
|
+
"Generate a ~30 s instrumental music clip with Google Lyria 2 via Replicate (paid, user's account). Under a longer video add it with project_add_audio loop=true endMs=<video>. Returns { audioPath, durationMs, generatedFrom }. MusicGen was removed (non-commercial licence): no model choice, reference, continuation or length.",
|
|
5428
5706
|
inputSchema: {
|
|
5429
5707
|
type: "object",
|
|
5430
5708
|
properties: {
|
|
5431
5709
|
prompt: { type: "string", description: "Genre, mood, instruments, tempo." },
|
|
5432
|
-
negativePrompt: { type: "string", description: "
|
|
5710
|
+
negativePrompt: { type: "string", description: "Qualities to avoid." },
|
|
5433
5711
|
seed: { type: "number" },
|
|
5434
|
-
model: { type: "string", enum: ["lyria", "musicgen"] },
|
|
5435
|
-
reference: {
|
|
5436
|
-
type: "string",
|
|
5437
|
-
description: "musicgen: absolute path (audio or video) to match.",
|
|
5438
|
-
},
|
|
5439
|
-
referenceStartMs: { type: "number" },
|
|
5440
|
-
referenceDurationMs: { type: "number", description: "Default 15000, max 30000." },
|
|
5441
|
-
continuation: { type: "boolean" },
|
|
5442
|
-
durationSec: {
|
|
5443
|
-
type: "number",
|
|
5444
|
-
description: "musicgen: default 30, max 300.",
|
|
5445
|
-
},
|
|
5446
5712
|
},
|
|
5447
5713
|
required: ["prompt"],
|
|
5448
5714
|
},
|
|
5449
5715
|
command: "media.generate-music",
|
|
5450
5716
|
},
|
|
5717
|
+
{
|
|
5718
|
+
name: "media_regenerate_music",
|
|
5719
|
+
description:
|
|
5720
|
+
"Regenerate a generated music track on the timeline IN PLACE with Lyria from its stored source (prompt, avoid, seed on audioOverlays[].generatedFrom). Pass only what changes; newSeed for a fresh variation. Keeps start, level, fades, ducking; a looping bed keeps its window. A track made with MusicGen (removed) regenerates with Lyria. Paid Replicate run, only when asked.",
|
|
5721
|
+
inputSchema: {
|
|
5722
|
+
type: "object",
|
|
5723
|
+
properties: {
|
|
5724
|
+
id: { type: "string" },
|
|
5725
|
+
path: { type: "string" },
|
|
5726
|
+
regionId: { type: "string", description: "The track's audio overlay id (audio-N)." },
|
|
5727
|
+
prompt: { type: "string" },
|
|
5728
|
+
negativePrompt: { type: "string", description: "Avoid; '' clears." },
|
|
5729
|
+
seed: { type: "number" },
|
|
5730
|
+
newSeed: { type: "boolean", description: "A fresh variation." },
|
|
5731
|
+
expectedRevision: { type: "number" },
|
|
5732
|
+
},
|
|
5733
|
+
required: ["regionId"],
|
|
5734
|
+
},
|
|
5735
|
+
command: "media.regenerate-music",
|
|
5736
|
+
},
|
|
5451
5737
|
{
|
|
5452
5738
|
name: "media_remove_background",
|
|
5453
5739
|
description:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.240.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",
|