@writepanda/mcp 1.22.1 → 1.22.3

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 +44 -1
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -396,12 +396,17 @@ const TOOLS = [
396
396
  {
397
397
  name: "project_read",
398
398
  description:
399
- "Read a project's full JSON. Returns { path, project, clipStates }. `clipStates` is a per-clip summary: { clipId, mediaPath, durationMs, transcribed, wordCount, audioCleaned, cleanedAudioPath? } — use it to decide whether to call transcript_transcribe or audio_clean before editing. Pass `project.revision` back as `expectedRevision` on subsequent writes for conflict-safe edits.",
399
+ "Read a project's full JSON. Returns { path, project, clipStates }. `clipStates` is a per-clip summary: { clipId, mediaPath, durationMs, transcribed, wordCount, audioCleaned, cleanedAudioPath? } — use it to decide whether to call transcript_transcribe or audio_clean before editing. Pass `project.revision` back as `expectedRevision` on subsequent writes for conflict-safe edits. **Performance tip:** pass `includeTranscript: false` after your first read to drop the per-clip transcript words from the response — they're typically 600+ KB on a 5-minute recording and most agent flows don't need them after pacing is done. clipStates always tells you the transcribed/wordCount status either way.",
400
400
  inputSchema: {
401
401
  type: "object",
402
402
  properties: {
403
403
  id: { type: "string" },
404
404
  path: { type: "string" },
405
+ includeTranscript: {
406
+ type: "boolean",
407
+ description:
408
+ "When false, per-clip transcripts are stripped from the returned project object. Saves 600+ KB on typical recordings, 2-4s of JSON parse on subsequent reads. Default true.",
409
+ },
405
410
  },
406
411
  },
407
412
  command: "project.read",
@@ -480,6 +485,16 @@ const TOOLS = [
480
485
  type: "number",
481
486
  description: "Sound volume 0–1. Default 1 when soundUrl is set.",
482
487
  },
488
+ anchorSourceMs: {
489
+ type: "number",
490
+ description:
491
+ "Anchor the motion graphic to a SOURCE-time moment (raw recording time). Pass this whenever atMs was derived from a transcript word's startMs — the region will then re-anchor automatically when subsequent transcript edits (remove-fillers, remove-silences, delete-words) shift the edited-time map. Without it, the motion graphic drifts silently. Omit for free-floating placement.",
492
+ },
493
+ anchorSourceEndMs: {
494
+ type: "number",
495
+ description:
496
+ "Optional anchor end (source ms) for ranged anchoring — the region's duration tracks the source-time span instead of preserving its visible duration.",
497
+ },
483
498
  expectedRevision: { type: "number" },
484
499
  },
485
500
  required: ["file", "durationMs"],
@@ -545,6 +560,15 @@ const TOOLS = [
545
560
  type: "number",
546
561
  description: "Sound volume 0–1. Default 0.8.",
547
562
  },
563
+ anchorSourceMs: {
564
+ type: "number",
565
+ description:
566
+ "Anchor the lower third to a SOURCE-time moment. Pass when atMs was derived from a transcript word's startMs — the lower third re-anchors automatically on subsequent transcript edits. Without it, the lower third drifts after any trim. Omit for free-floating placement.",
567
+ },
568
+ anchorSourceEndMs: {
569
+ type: "number",
570
+ description: "Optional anchor end (source ms) for ranged anchoring.",
571
+ },
548
572
  expectedRevision: { type: "number" },
549
573
  },
550
574
  required: ["content", "atMs"],
@@ -676,6 +700,15 @@ const TOOLS = [
676
700
  y: { type: "number", description: "Vertical center, percent 0-100. Default 50." },
677
701
  width: { type: "number", description: "Width, percent 0-100. Default 30." },
678
702
  height: { type: "number", description: "Height, percent 0-100. Default 20." },
703
+ anchorSourceMs: {
704
+ type: "number",
705
+ description:
706
+ "Anchor the annotation to a SOURCE-time moment (raw recording time). Pass when startMs was derived from a transcript word's startMs — the annotation re-anchors automatically on subsequent transcript edits. Without it, the annotation drifts after any trim. Omit for free-floating placement.",
707
+ },
708
+ anchorSourceEndMs: {
709
+ type: "number",
710
+ description: "Optional anchor end (source ms) for ranged anchoring.",
711
+ },
679
712
  expectedRevision: { type: "number" },
680
713
  },
681
714
  required: ["startMs", "endMs", "type"],
@@ -996,6 +1029,16 @@ const TOOLS = [
996
1029
  description:
997
1030
  "[Legacy] Sets endMs = startMs + maxDurationMs when endMs is absent. Prefer endMs.",
998
1031
  },
1032
+ anchorSourceMs: {
1033
+ type: "number",
1034
+ description:
1035
+ "Anchor an SFX overlay to a SOURCE-time moment (e.g. a punchline word). Pass when startMs was derived from a transcript word's source-time — the overlay re-anchors automatically on subsequent transcript edits. DO NOT pass for background music tracks; those should stay free-floating (they cover a fixed slot of the edited timeline regardless of content edits).",
1036
+ },
1037
+ anchorSourceEndMs: {
1038
+ type: "number",
1039
+ description:
1040
+ "Optional anchor end (source ms). When set, the overlay's edited duration tracks the source-time span between anchorSourceMs and anchorSourceEndMs.",
1041
+ },
999
1042
  expectedRevision: { type: "number" },
1000
1043
  },
1001
1044
  required: ["audioPath"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.22.1",
3
+ "version": "1.22.3",
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",