@writepanda/mcp 1.14.1 → 1.17.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 +55 -14
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -242,8 +242,7 @@ const TOOLS = [
242
242
  media: { type: "string", description: "Absolute path to video file" },
243
243
  atIndex: {
244
244
  type: "number",
245
- description:
246
- "Insert before this zero-based clip index. Omit to append at the end.",
245
+ description: "Insert before this zero-based clip index. Omit to append at the end.",
247
246
  },
248
247
  expectedRevision: { type: "number" },
249
248
  },
@@ -305,7 +304,7 @@ const TOOLS = [
305
304
  designType: {
306
305
  type: "string",
307
306
  description:
308
- "name-bar | slash-reveal | center-stack | minimal-underline | box-reveal | corner-brackets | border-frame | split-horizontal",
307
+ "slash-reveal | center-stack | split-horizontal | name-bar | border-frame | minimal-underline | box-reveal | corner-brackets. Default: slash-reveal.",
309
308
  },
310
309
  accentColor: { type: "string", description: "Hex accent/background color" },
311
310
  textColor: { type: "string", description: "Hex text color. Default #ffffff" },
@@ -605,8 +604,7 @@ const TOOLS = [
605
604
  },
606
605
  resolution: {
607
606
  type: "string",
608
- description:
609
- "Output resolution: 4k | 1080p | 720p | 480p | source. Default source.",
607
+ description: "Output resolution: 4k | 1080p | 720p | 480p | source. Default source.",
610
608
  },
611
609
  gifFrameRate: {
612
610
  type: "number",
@@ -614,8 +612,7 @@ const TOOLS = [
614
612
  },
615
613
  gifSize: {
616
614
  type: "string",
617
- description:
618
- "GIF size preset: small | medium | large. Only used when format is gif.",
615
+ description: "GIF size preset: small | medium | large. Only used when format is gif.",
619
616
  },
620
617
  expectedRevision: { type: "number" },
621
618
  },
@@ -731,6 +728,31 @@ const TOOLS = [
731
728
  },
732
729
  command: "project.remove-audio",
733
730
  },
731
+ {
732
+ name: "project_set_clip_lut",
733
+ description:
734
+ "Apply a color-grade LUT preset to a specific clip. Use asset_list_luts to browse available presets. The grade is applied in preview (CSS filter) and export (FFmpeg eq/hue chain). Pass 'none' to clear. Returns { clipId, lutPreset, lutIntensity }.",
735
+ inputSchema: {
736
+ type: "object",
737
+ properties: {
738
+ id: { type: "string" },
739
+ path: { type: "string" },
740
+ clipId: { type: "string", description: "Clip id from project_read mainTrack.clips[n].id" },
741
+ lutPreset: {
742
+ type: "string",
743
+ description:
744
+ "Preset id. none | cinematicTealOrange | cinematicShadowBlue | filmNoir | vintageKodak | modernVibrant | moodyDark | warmSunset | coolNordic | bleachBypass | vintagePolaroid | naturalEnhanced",
745
+ },
746
+ lutIntensity: {
747
+ type: "number",
748
+ description: "Blend strength 0–1. Defaults to 1 (full effect).",
749
+ },
750
+ expectedRevision: { type: "number" },
751
+ },
752
+ required: ["clipId", "lutPreset"],
753
+ },
754
+ command: "project.set-clip-lut",
755
+ },
734
756
 
735
757
  // ── transcript-based editing ────────────────────────────────────
736
758
  {
@@ -932,7 +954,7 @@ const TOOLS = [
932
954
  {
933
955
  name: "motion_list",
934
956
  description:
935
- "List every motion-graphic template (id, name, slots, defaults, aspectRatios). 19 templates ship today.",
957
+ "List every motion-graphic template (id, name, slots, defaults, aspectRatios). 20 templates ship today, including youtube-lower-third for YouTube-style name plates.",
936
958
  inputSchema: { type: "object", properties: {} },
937
959
  command: "motion.list",
938
960
  },
@@ -946,7 +968,7 @@ const TOOLS = [
946
968
  {
947
969
  name: "motion_generate",
948
970
  description:
949
- "Render a motion graphic asynchronously. Returns { jobId, outputPath }; call job_wait. Output is an MP4 you can pass to project_add_motion_graphic.",
971
+ "Render a motion graphic asynchronously. Returns { jobId, outputPath }; call job_wait. Output is an MP4 you can pass to project_add_motion_graphic. Use templateId=youtube-lower-third (slots: channelName, handle, accentColor) for YouTube-style name plates with avatar + Subscribe button.",
950
972
  inputSchema: {
951
973
  type: "object",
952
974
  properties: {
@@ -962,7 +984,7 @@ const TOOLS = [
962
984
  {
963
985
  name: "motion_render_html",
964
986
  description:
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.",
987
+ "Render arbitrary HTML/CSS/JS to video. Use this when the bundled motion-graphic templates don't fit the brief — you write the HTML, the Chromium → capturePage → FFmpeg pipeline does the rest. Pass either inline `html` or a `htmlPath`. Animations should auto-start on DOMContentLoaded. Set `transparent: true` to get a WebM with alpha channel for overlays (lower thirds, watermarks, name plates) that composite over existing video. 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 file.",
966
988
  inputSchema: {
967
989
  type: "object",
968
990
  properties: {
@@ -986,7 +1008,7 @@ const TOOLS = [
986
1008
  audioPath: {
987
1009
  type: "string",
988
1010
  description:
989
- "Absolute path to an audio file (mp3, wav, aac, m4a) to mux into the MP4. Without this the output is silent.",
1011
+ "Absolute path to an audio file (mp3, wav, aac, m4a) to mux into the MP4. Without this the output is silent. Ignored when transparent: true.",
990
1012
  },
991
1013
  audioVolume: {
992
1014
  type: "number",
@@ -996,7 +1018,12 @@ const TOOLS = [
996
1018
  type: "array",
997
1019
  items: { type: "string" },
998
1020
  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.",
1021
+ '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.',
1022
+ },
1023
+ transparent: {
1024
+ type: "boolean",
1025
+ description:
1026
+ "Render with a transparent background (VP9/yuva420p WebM instead of H.264 MP4). Use for overlays — lower thirds, watermarks, bug logos, name plates — anything that composites on top of existing video without a white/black fill. The returned outputPath will have a .webm extension. Note: audioPath is ignored in transparent mode.",
1000
1027
  },
1001
1028
  },
1002
1029
  },
@@ -1073,6 +1100,20 @@ const TOOLS = [
1073
1100
  inputSchema: { type: "object", properties: {} },
1074
1101
  command: "asset.list-fx",
1075
1102
  },
1103
+ {
1104
+ name: "asset_list_music",
1105
+ description:
1106
+ "List every bundled background music track (id, title, category, mood, durationMs, absolutePath). Use absolutePath with project_add_audio to attach a track to a project.",
1107
+ inputSchema: { type: "object", properties: {} },
1108
+ command: "asset.list-music",
1109
+ },
1110
+ {
1111
+ name: "asset_list_luts",
1112
+ description:
1113
+ "List all available LUT color-grade presets (id, label, category). Pass the id to project_set_clip_lut. Categories: natural | cinematic | dramatic | vintage | modern.",
1114
+ inputSchema: { type: "object", properties: {} },
1115
+ command: "asset.list-luts",
1116
+ },
1076
1117
 
1077
1118
  // ── project-aware LLM ──────────────────────────────────────────
1078
1119
  {
@@ -1120,7 +1161,7 @@ const TOOLS = [
1120
1161
  {
1121
1162
  name: "export_start",
1122
1163
  description:
1123
- "Render the project to MP4 via the same Skia native render-helper the editor's Export button uses. ASYNC — returns { jobId, outputPath }; call job_wait. Honours every region/style/caption/FX/lower-third/motion-graphic.",
1164
+ "Render the project to MP4 via the same Skia native render-helper the editor's Export button uses. ASYNC — returns { jobId, outputPath }; call job_wait. Honours every region/style/caption/FX/lower-third/motion-graphic. Video overlays (motion graphics added via project_add_motion_graphic) are automatically composited in a post-process FFmpeg pass — both opaque MP4 and transparent WebM/VP9+alpha overlays are supported; no extra call needed.",
1124
1165
  inputSchema: {
1125
1166
  type: "object",
1126
1167
  properties: {
@@ -1226,7 +1267,7 @@ const TOOLS = [
1226
1267
  const server = new Server(
1227
1268
  {
1228
1269
  name: "pandastudio",
1229
- version: "1.14.0",
1270
+ version: "1.15.0",
1230
1271
  },
1231
1272
  {
1232
1273
  capabilities: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.14.1",
3
+ "version": "1.17.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",