@writepanda/mcp 1.11.0 → 1.12.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/README.md CHANGED
@@ -48,17 +48,20 @@ After adding, restart your client. The MCP server auto-launches PandaStudio if i
48
48
 
49
49
  ## What the agent gets
50
50
 
51
- 30+ tools covering the full PandaStudio editorial surface:
51
+ 55 tools covering the full PandaStudio editorial surface — complete UI parity:
52
52
 
53
53
  | Category | Tools |
54
54
  |---|---|
55
55
  | Discovery | `system_status`, `system_list_commands` |
56
- | Project lifecycle | `project_list`, `project_show`, `project_read`, `project_new`, `project_open` |
57
- | Composition | `project_add_clip`, `project_add_motion_graphic`, `project_add_fx`, `project_add_lower_third`, `project_add_zoom`, `project_add_trim`, `project_add_speed` |
58
- | Transcript editing | `transcript_transcribe`, `transcript_get`, `transcript_delete_words`, `transcript_remove_fillers`, `transcript_search` |
56
+ | Project lifecycle | `project_list`, `project_show`, `project_read`, `project_new`, `project_open`, `project_save`, `project_delete` |
57
+ | Clips | `project_add_clip`, `project_remove_clip`, `project_split_clip` |
58
+ | Composition | `project_add_motion_graphic`, `project_add_fx`, `project_add_lower_third`, `project_add_zoom`, `project_add_trim`, `project_add_speed`, `project_add_annotation` |
59
+ | Region editing | `project_remove_region`, `project_update_region` |
60
+ | Canvas & style | `project_set_aspect_ratio`, `project_set_wallpaper`, `project_set_style`, `project_set_crop`, `project_set_webcam_layout`, `project_set_export_settings` |
61
+ | Transcript editing | `transcript_transcribe`, `transcript_get`, `transcript_delete_words`, `transcript_remove_fillers`, `transcript_search`, `transcript_find_replace`, `transcript_remove_silences` |
59
62
  | Audio | `audio_clean` (DeepFilter denoising) |
60
- | Captions | `caption_toggle`, `caption_set_template` |
61
- | Motion graphics | `motion_list`, `motion_themes`, `motion_generate` |
63
+ | Captions | `caption_toggle`, `caption_set_template`, `caption_set_style` |
64
+ | Motion graphics | `motion_list`, `motion_themes`, `motion_generate`, `motion_render_html` |
62
65
  | Assets | `asset_list_sounds`, `asset_list_fx` |
63
66
  | AI metadata | `llm_generate_title`, `llm_generate_description`, `llm_generate_timestamps` |
64
67
  | Export | `export_start`, `export_list` |
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,6 +983,21 @@ 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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.11.0",
3
+ "version": "1.12.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",