@writepanda/mcp 1.11.1 → 1.13.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 +120 -1
- package/package.json +1 -1
package/bin/server.mjs
CHANGED
|
@@ -684,6 +684,54 @@ const TOOLS = [
|
|
|
684
684
|
command: "project.set-style",
|
|
685
685
|
},
|
|
686
686
|
|
|
687
|
+
{
|
|
688
|
+
name: "project_add_audio",
|
|
689
|
+
description:
|
|
690
|
+
"Add a background audio track (music, VO, ambient sound) to the project. The audio plays over the full mix from startMs and is exported automatically. Use project_remove_audio to remove it. Returns { overlayId } — save this to remove it later.",
|
|
691
|
+
inputSchema: {
|
|
692
|
+
type: "object",
|
|
693
|
+
properties: {
|
|
694
|
+
id: { type: "string" },
|
|
695
|
+
path: { type: "string" },
|
|
696
|
+
audioPath: {
|
|
697
|
+
type: "string",
|
|
698
|
+
description: "Absolute path to audio file (mp3, wav, aac, m4a, ogg)",
|
|
699
|
+
},
|
|
700
|
+
startMs: {
|
|
701
|
+
type: "number",
|
|
702
|
+
description: "Where in the edited timeline playback starts. Default 0.",
|
|
703
|
+
},
|
|
704
|
+
volume: { type: "number", description: "Volume multiplier 0–2. Default 0.8." },
|
|
705
|
+
maxDurationMs: {
|
|
706
|
+
type: "number",
|
|
707
|
+
description: "Clip the audio at this duration. Omit to play the full file.",
|
|
708
|
+
},
|
|
709
|
+
expectedRevision: { type: "number" },
|
|
710
|
+
},
|
|
711
|
+
required: ["audioPath"],
|
|
712
|
+
},
|
|
713
|
+
command: "project.add-audio",
|
|
714
|
+
},
|
|
715
|
+
{
|
|
716
|
+
name: "project_remove_audio",
|
|
717
|
+
description:
|
|
718
|
+
"Remove a background audio overlay by its id. Use project_read to find overlay ids in project.audioOverlays.",
|
|
719
|
+
inputSchema: {
|
|
720
|
+
type: "object",
|
|
721
|
+
properties: {
|
|
722
|
+
id: { type: "string" },
|
|
723
|
+
path: { type: "string" },
|
|
724
|
+
overlayId: {
|
|
725
|
+
type: "string",
|
|
726
|
+
description: "Audio overlay id (e.g. audio-1) from project.audioOverlays",
|
|
727
|
+
},
|
|
728
|
+
expectedRevision: { type: "number" },
|
|
729
|
+
},
|
|
730
|
+
required: ["overlayId"],
|
|
731
|
+
},
|
|
732
|
+
command: "project.remove-audio",
|
|
733
|
+
},
|
|
734
|
+
|
|
687
735
|
// ── transcript-based editing ────────────────────────────────────
|
|
688
736
|
{
|
|
689
737
|
name: "transcript_transcribe",
|
|
@@ -914,7 +962,7 @@ const TOOLS = [
|
|
|
914
962
|
{
|
|
915
963
|
name: "motion_render_html",
|
|
916
964
|
description:
|
|
917
|
-
"Render arbitrary HTML/CSS/JS to an MP4. Use this when the bundled motion-graphic templates don't fit the brief
|
|
965
|
+
"Render arbitrary HTML/CSS/JS to an MP4. Use this when the bundled motion-graphic templates don't fit the brief. Pass either inline `html` or a `htmlPath`. Animations should auto-start on DOMContentLoaded. IMPORTANT: renders are sequential — call job_wait to completion before starting another render, or you'll get a RENDER_BUSY error. Async — returns { jobId, outputPath }; poll job_wait for the final MP4.",
|
|
918
966
|
inputSchema: {
|
|
919
967
|
type: "object",
|
|
920
968
|
properties: {
|
|
@@ -935,10 +983,81 @@ const TOOLS = [
|
|
|
935
983
|
durationMs: { type: "number", description: "How long to capture. Default 2500." },
|
|
936
984
|
frameRate: { type: "number", description: "Default 30." },
|
|
937
985
|
outputName: { type: "string", description: "Optional filename stem." },
|
|
986
|
+
audioPath: {
|
|
987
|
+
type: "string",
|
|
988
|
+
description:
|
|
989
|
+
"Absolute path to an audio file (mp3, wav, aac, m4a) to mux into the MP4. Without this the output is silent.",
|
|
990
|
+
},
|
|
991
|
+
audioVolume: {
|
|
992
|
+
type: "number",
|
|
993
|
+
description: "Volume multiplier for audioPath. Range 0–2. Default 1.0.",
|
|
994
|
+
},
|
|
995
|
+
assets: {
|
|
996
|
+
type: "array",
|
|
997
|
+
items: { type: "string" },
|
|
998
|
+
description:
|
|
999
|
+
"Absolute paths to local files to stage alongside inline HTML. Reference them by basename: pass [\"/path/logo.png\"] and use <img src=\"logo.png\"> in the HTML. Avoids base64-encoding large images.",
|
|
1000
|
+
},
|
|
938
1001
|
},
|
|
939
1002
|
},
|
|
940
1003
|
command: "motion.render-html",
|
|
941
1004
|
},
|
|
1005
|
+
{
|
|
1006
|
+
name: "motion_screenshot",
|
|
1007
|
+
description:
|
|
1008
|
+
"Capture a single PNG frame of an HTML composition at a given timestamp — no FFmpeg, sub-second. Use this to validate layout, font sizes, and element positions BEFORE committing to a full motion_render_html render. Returns { outputPath } directly (no jobId polling needed).",
|
|
1009
|
+
inputSchema: {
|
|
1010
|
+
type: "object",
|
|
1011
|
+
properties: {
|
|
1012
|
+
html: {
|
|
1013
|
+
type: "string",
|
|
1014
|
+
description: "Inline HTML string (mutually exclusive with htmlPath).",
|
|
1015
|
+
},
|
|
1016
|
+
htmlPath: {
|
|
1017
|
+
type: "string",
|
|
1018
|
+
description: "Absolute path to .html file (mutually exclusive with html).",
|
|
1019
|
+
},
|
|
1020
|
+
aspectRatio: {
|
|
1021
|
+
type: "string",
|
|
1022
|
+
description: "16:9 (default) | 9:16 | 1:1. Ignored if width+height supplied.",
|
|
1023
|
+
},
|
|
1024
|
+
width: { type: "number" },
|
|
1025
|
+
height: { type: "number" },
|
|
1026
|
+
atMs: {
|
|
1027
|
+
type: "number",
|
|
1028
|
+
description:
|
|
1029
|
+
"Milliseconds into the animation to screenshot. Waits this long after page load. Default 0 (first visible frame). Max 30000. Use e.g. 2000 to preview the animation mid-way.",
|
|
1030
|
+
},
|
|
1031
|
+
assets: {
|
|
1032
|
+
type: "array",
|
|
1033
|
+
items: { type: "string" },
|
|
1034
|
+
description:
|
|
1035
|
+
"Absolute paths to local files to stage alongside inline HTML — same as motion_render_html.",
|
|
1036
|
+
},
|
|
1037
|
+
outputName: { type: "string", description: "Optional PNG filename stem." },
|
|
1038
|
+
},
|
|
1039
|
+
},
|
|
1040
|
+
command: "motion.screenshot",
|
|
1041
|
+
},
|
|
1042
|
+
{
|
|
1043
|
+
name: "motion_concat",
|
|
1044
|
+
description:
|
|
1045
|
+
"Concatenate multiple MP4s into one final video using a lossless stream copy (no re-encode — fast). All clips must share the same resolution and codec; all motion_render_html / motion_generate outputs qualify automatically. Use this after rendering individual scenes to assemble the final promo. Returns { outputPath, clipCount } directly.",
|
|
1046
|
+
inputSchema: {
|
|
1047
|
+
type: "object",
|
|
1048
|
+
required: ["clips"],
|
|
1049
|
+
properties: {
|
|
1050
|
+
clips: {
|
|
1051
|
+
type: "array",
|
|
1052
|
+
items: { type: "string" },
|
|
1053
|
+
description:
|
|
1054
|
+
"Ordered array of absolute paths to MP4 files to join. Minimum 2. The output plays them in the order given.",
|
|
1055
|
+
},
|
|
1056
|
+
outputName: { type: "string", description: "Optional filename stem for the output MP4." },
|
|
1057
|
+
},
|
|
1058
|
+
},
|
|
1059
|
+
command: "motion.concat",
|
|
1060
|
+
},
|
|
942
1061
|
|
|
943
1062
|
// ── assets ──────────────────────────────────────────────────────
|
|
944
1063
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@writepanda/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.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",
|