@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.
Files changed (2) hide show
  1. package/bin/server.mjs +120 -1
  2. 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 — Claude can author full animations and we'll render them. Pass either inline `html` or a `htmlPath`. The HTML loads in a Chromium offscreen window at the requested dimensions; we capture frames for durationMs starting after the first paint. Animations should auto-start on DOMContentLoaded (CSS animations, GSAP, Lottie via CDN, anything Chromium can render). Async — returns { jobId, outputPath }; poll job_wait for the final MP4.",
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.11.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",