@writepanda/mcp 1.228.0 → 1.234.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 +179 -11
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -722,10 +722,17 @@ const TOOLS = [
|
|
|
722
722
|
{
|
|
723
723
|
name: "system_status",
|
|
724
724
|
description:
|
|
725
|
-
"App version and license; automationGated true = trial expired, or the Solo plan (license.agentEditing.allowed false: no agent editing, relay license.agentEditing.message to the user), and every other tool fails; license.socialPublishing.allowed false = the plan has no Instagram/TikTok/social publishing (Creator, Team, Pro only); license.exportQuality.allowed = the export_start qualities that work (free trial: draft 720p only; standard/high/ultra need a license). Call first.",
|
|
725
|
+
"App version and license; automationGated true = trial expired, or the Solo plan (license.agentEditing.allowed false: no agent editing, relay license.agentEditing.message to the user), and every other tool fails; license.socialPublishing.allowed false = the plan has no Instagram/TikTok/social publishing (Creator, Team, Pro only); license.exportQuality.allowed = the export_start qualities that work (free trial: draft 720p only; standard/high/ultra need a license); mediaEngine.ready false = FFmpeg is missing or broken (transcription, audio cleanup, camera exports and most media tools fail): call system_install_media_engine. Call first.",
|
|
726
726
|
inputSchema: { type: "object", properties: {} },
|
|
727
727
|
command: "system.status",
|
|
728
728
|
},
|
|
729
|
+
{
|
|
730
|
+
name: "system_install_media_engine",
|
|
731
|
+
description:
|
|
732
|
+
"Install or repair the media engine (FFmpeg, ~80 MB, verified by running it); same as Install in Settings > Media engine. Use when system_status mediaEngine.ready is false or a tool fails with code MEDIA_ENGINE_UNAVAILABLE, then retry that tool. ASYNC: { jobId }; job_wait for { ready, version, path }. Already working: { ready: true } at once.",
|
|
733
|
+
inputSchema: { type: "object", properties: {} },
|
|
734
|
+
command: "system.install-media-engine",
|
|
735
|
+
},
|
|
729
736
|
{
|
|
730
737
|
name: "system_report_issue",
|
|
731
738
|
description:
|
|
@@ -812,7 +819,7 @@ const TOOLS = [
|
|
|
812
819
|
{
|
|
813
820
|
name: "system_get_transcription_language",
|
|
814
821
|
description:
|
|
815
|
-
"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).",
|
|
816
823
|
inputSchema: { type: "object", properties: {} },
|
|
817
824
|
command: "system.get-transcription-language",
|
|
818
825
|
},
|
|
@@ -839,7 +846,7 @@ const TOOLS = [
|
|
|
839
846
|
{
|
|
840
847
|
name: "system_set_transcription_language",
|
|
841
848
|
description:
|
|
842
|
-
"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.",
|
|
843
850
|
inputSchema: {
|
|
844
851
|
type: "object",
|
|
845
852
|
properties: {
|
|
@@ -1628,7 +1635,7 @@ const TOOLS = [
|
|
|
1628
1635
|
{
|
|
1629
1636
|
name: "project_new",
|
|
1630
1637
|
description:
|
|
1631
|
-
"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.",
|
|
1632
1639
|
inputSchema: {
|
|
1633
1640
|
type: "object",
|
|
1634
1641
|
properties: {
|
|
@@ -1638,8 +1645,23 @@ const TOOLS = [
|
|
|
1638
1645
|
name: { type: "string" },
|
|
1639
1646
|
withMedia: {
|
|
1640
1647
|
type: "array",
|
|
1641
|
-
items: {
|
|
1642
|
-
|
|
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.",
|
|
1643
1665
|
},
|
|
1644
1666
|
speakers: {
|
|
1645
1667
|
type: "array",
|
|
@@ -1692,7 +1714,7 @@ const TOOLS = [
|
|
|
1692
1714
|
{
|
|
1693
1715
|
name: "project_add_clip",
|
|
1694
1716
|
description:
|
|
1695
|
-
"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).",
|
|
1696
1718
|
inputSchema: {
|
|
1697
1719
|
type: "object",
|
|
1698
1720
|
properties: {
|
|
@@ -1712,12 +1734,39 @@ const TOOLS = [
|
|
|
1712
1734
|
description:
|
|
1713
1735
|
"With atMs: replace [atMs, replaceToMs), merge overlapping or adjacent cuts, and remove fully trimmed clips.",
|
|
1714
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
|
+
},
|
|
1715
1746
|
expectedRevision: { type: "number" },
|
|
1716
1747
|
},
|
|
1717
1748
|
required: ["media"],
|
|
1718
1749
|
},
|
|
1719
1750
|
command: "project.add-clip",
|
|
1720
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
|
+
},
|
|
1721
1770
|
{
|
|
1722
1771
|
name: "project_set_clip_duration",
|
|
1723
1772
|
description: "Change how long an image clip shows (later content moves).",
|
|
@@ -3325,7 +3374,7 @@ const TOOLS = [
|
|
|
3325
3374
|
{
|
|
3326
3375
|
name: "project_save",
|
|
3327
3376
|
description:
|
|
3328
|
-
"Overwrite a project file with `project` (pass expectedRevision). Without it, returns the current revision. Verbs already autosave.",
|
|
3377
|
+
"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.",
|
|
3329
3378
|
inputSchema: {
|
|
3330
3379
|
type: "object",
|
|
3331
3380
|
properties: {
|
|
@@ -4338,13 +4387,13 @@ const TOOLS = [
|
|
|
4338
4387
|
{
|
|
4339
4388
|
name: "system_set_transcription_preferences",
|
|
4340
4389
|
description:
|
|
4341
|
-
"Save workspace language and
|
|
4390
|
+
"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.",
|
|
4342
4391
|
inputSchema: {
|
|
4343
4392
|
type: "object",
|
|
4344
|
-
required: ["language", "provider"],
|
|
4345
4393
|
properties: {
|
|
4346
4394
|
language: { type: "string" },
|
|
4347
4395
|
provider: { type: "string", enum: ["local", "apple", "deepgram", "elevenlabs"] },
|
|
4396
|
+
engine: { type: "string", enum: ["auto", "parakeet", "whisper"] },
|
|
4348
4397
|
},
|
|
4349
4398
|
},
|
|
4350
4399
|
command: "system.set-transcription-preferences",
|
|
@@ -4353,7 +4402,7 @@ const TOOLS = [
|
|
|
4353
4402
|
{
|
|
4354
4403
|
name: "transcript_transcribe",
|
|
4355
4404
|
description:
|
|
4356
|
-
"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
|
|
4405
|
+
"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).",
|
|
4357
4406
|
inputSchema: {
|
|
4358
4407
|
type: "object",
|
|
4359
4408
|
properties: {
|
|
@@ -4372,10 +4421,54 @@ const TOOLS = [
|
|
|
4372
4421
|
"Per-run provider. apple stays on this Mac. Audio is sent to the selected cloud provider.",
|
|
4373
4422
|
},
|
|
4374
4423
|
force: { type: "boolean", description: "Re-transcribe clips that already have words." },
|
|
4424
|
+
engine: {
|
|
4425
|
+
type: "string",
|
|
4426
|
+
enum: ["auto", "parakeet", "whisper"],
|
|
4427
|
+
description:
|
|
4428
|
+
"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.",
|
|
4429
|
+
},
|
|
4430
|
+
dryRun: {
|
|
4431
|
+
type: "boolean",
|
|
4432
|
+
description:
|
|
4433
|
+
"Return the plan (engine + reason, per-clip source ranges, totalAudioMs) without transcribing. Use before long jobs.",
|
|
4434
|
+
},
|
|
4375
4435
|
},
|
|
4376
4436
|
},
|
|
4377
4437
|
command: "transcript.transcribe",
|
|
4378
4438
|
},
|
|
4439
|
+
{
|
|
4440
|
+
name: "system_download_whisper_model",
|
|
4441
|
+
description:
|
|
4442
|
+
"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.",
|
|
4443
|
+
inputSchema: { type: "object", properties: {} },
|
|
4444
|
+
command: "system.download-whisper-model",
|
|
4445
|
+
},
|
|
4446
|
+
{
|
|
4447
|
+
name: "transcript_import",
|
|
4448
|
+
description:
|
|
4449
|
+
"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.",
|
|
4450
|
+
inputSchema: {
|
|
4451
|
+
type: "object",
|
|
4452
|
+
properties: {
|
|
4453
|
+
id: { type: "string" },
|
|
4454
|
+
path: { type: "string" },
|
|
4455
|
+
clipId: {
|
|
4456
|
+
type: "string",
|
|
4457
|
+
description: "Optional when the project has one clip with audio.",
|
|
4458
|
+
},
|
|
4459
|
+
file: { type: "string", description: "Absolute path to the .srt/.vtt/.json file." },
|
|
4460
|
+
content: { type: "string", description: "The file's text instead of file." },
|
|
4461
|
+
format: { type: "string", enum: ["auto", "srt", "vtt", "json"] },
|
|
4462
|
+
timeBase: { type: "string", enum: ["source", "edited"] },
|
|
4463
|
+
align: { type: "string", enum: ["auto", "existing", "transcribe", "proportional"] },
|
|
4464
|
+
language: { type: "string" },
|
|
4465
|
+
dryRun: { type: "boolean" },
|
|
4466
|
+
expectedRevision: { type: "number" },
|
|
4467
|
+
},
|
|
4468
|
+
required: ["timeBase"],
|
|
4469
|
+
},
|
|
4470
|
+
command: "transcript.import",
|
|
4471
|
+
},
|
|
4379
4472
|
{
|
|
4380
4473
|
name: "transcript_get",
|
|
4381
4474
|
description:
|
|
@@ -4748,6 +4841,39 @@ const TOOLS = [
|
|
|
4748
4841
|
command: "caption.set-template",
|
|
4749
4842
|
},
|
|
4750
4843
|
|
|
4844
|
+
{
|
|
4845
|
+
name: "caption_set_punctuation",
|
|
4846
|
+
description:
|
|
4847
|
+
'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.',
|
|
4848
|
+
inputSchema: {
|
|
4849
|
+
type: "object",
|
|
4850
|
+
properties: {
|
|
4851
|
+
id: { type: "string" },
|
|
4852
|
+
path: { type: "string" },
|
|
4853
|
+
preset: { type: "string", enum: ["clean", "all", "none"] },
|
|
4854
|
+
remove: {
|
|
4855
|
+
type: "array",
|
|
4856
|
+
items: {
|
|
4857
|
+
type: "string",
|
|
4858
|
+
enum: [
|
|
4859
|
+
"period",
|
|
4860
|
+
"comma",
|
|
4861
|
+
"question",
|
|
4862
|
+
"exclamation",
|
|
4863
|
+
"colon",
|
|
4864
|
+
"ellipsis",
|
|
4865
|
+
"quotes",
|
|
4866
|
+
"dashes",
|
|
4867
|
+
"brackets",
|
|
4868
|
+
],
|
|
4869
|
+
},
|
|
4870
|
+
},
|
|
4871
|
+
keepQuestionMarks: { type: "boolean" },
|
|
4872
|
+
expectedRevision: { type: "number" },
|
|
4873
|
+
},
|
|
4874
|
+
},
|
|
4875
|
+
command: "caption.set-punctuation",
|
|
4876
|
+
},
|
|
4751
4877
|
{
|
|
4752
4878
|
name: "caption_set_style",
|
|
4753
4879
|
description:
|
|
@@ -4927,6 +5053,48 @@ const TOOLS = [
|
|
|
4927
5053
|
},
|
|
4928
5054
|
command: "media.generate-narration",
|
|
4929
5055
|
},
|
|
5056
|
+
{
|
|
5057
|
+
name: "media_regenerate_narration",
|
|
5058
|
+
description:
|
|
5059
|
+
"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. A transcribed narration is re-transcribed (transcribeJobId: job_wait it). One undo step. No stored source (older narration) = pass text.",
|
|
5060
|
+
inputSchema: {
|
|
5061
|
+
type: "object",
|
|
5062
|
+
properties: {
|
|
5063
|
+
id: { type: "string" },
|
|
5064
|
+
path: { type: "string" },
|
|
5065
|
+
regionId: { type: "string", description: "The narration's audio overlay id (audio-N)." },
|
|
5066
|
+
text: { type: "string", description: "New script (default: stored)." },
|
|
5067
|
+
model: { type: "string", description: "New engine; without voice uses its default voice." },
|
|
5068
|
+
voice: { type: "string" },
|
|
5069
|
+
style: { type: "string", description: "Tone (cloud); '' clears." },
|
|
5070
|
+
language: { type: "string" },
|
|
5071
|
+
speed: { type: "number" },
|
|
5072
|
+
pronunciations: { type: "object", description: 'e.g. {"Kamal":"Ka mal"}' },
|
|
5073
|
+
expectedRevision: { type: "number" },
|
|
5074
|
+
},
|
|
5075
|
+
required: ["regionId"],
|
|
5076
|
+
},
|
|
5077
|
+
command: "media.regenerate-narration",
|
|
5078
|
+
},
|
|
5079
|
+
{
|
|
5080
|
+
name: "media_regenerate_image",
|
|
5081
|
+
description:
|
|
5082
|
+
"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.",
|
|
5083
|
+
inputSchema: {
|
|
5084
|
+
type: "object",
|
|
5085
|
+
properties: {
|
|
5086
|
+
id: { type: "string" },
|
|
5087
|
+
path: { type: "string" },
|
|
5088
|
+
regionId: { type: "string", description: "The picture's overlay id." },
|
|
5089
|
+
prompt: { type: "string", description: "New prompt (default: stored)." },
|
|
5090
|
+
aspectRatio: { type: "string" },
|
|
5091
|
+
quality: { type: "string", enum: ["low", "medium", "high"] },
|
|
5092
|
+
expectedRevision: { type: "number" },
|
|
5093
|
+
},
|
|
5094
|
+
required: ["regionId"],
|
|
5095
|
+
},
|
|
5096
|
+
command: "media.regenerate-image",
|
|
5097
|
+
},
|
|
4930
5098
|
{
|
|
4931
5099
|
name: "recording_list_sources",
|
|
4932
5100
|
description: "List displays and windows for recording_start's source.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.234.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",
|