@writepanda/mcp 1.38.0 → 1.42.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 +98 -2
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -431,6 +431,21 @@ const TOOLS = [
431
431
  },
432
432
  command: "project.setFolder",
433
433
  },
434
+ {
435
+ name: "project_rename",
436
+ description:
437
+ "Rename a project (the display name shown in the editor title bar and the Home grid). Identify the project by `id` (preferred) or `path`. Pass the new `name` (trimmed; must be non-empty). The on-disk filename is NOT changed (files are keyed by project id), so this is safe to call while the project is open. Returns { id, path, name }. Use when the user asks to rename, retitle, or relabel a project.",
438
+ inputSchema: {
439
+ type: "object",
440
+ properties: {
441
+ id: { type: "string", description: "Project UUID (preferred)." },
442
+ path: { type: "string", description: "Absolute project file path." },
443
+ name: { type: "string", description: "New display name. Trimmed; must be non-empty." },
444
+ },
445
+ required: ["name"],
446
+ },
447
+ command: "project.rename",
448
+ },
434
449
  {
435
450
  name: "project_locate",
436
451
  description:
@@ -1082,6 +1097,25 @@ const TOOLS = [
1082
1097
  },
1083
1098
  command: "project.remove-region",
1084
1099
  },
1100
+ {
1101
+ name: "project_clear_edits",
1102
+ description:
1103
+ "Reset the project to a clean editing slate in ONE atomic call. Removes every time-based region (trim, speed, zoom, motion graphic, lower third, FX, annotation, clip-transform), removes all audio overlays, and turns captions off (keeping the user's chosen caption template + style overrides so re-enabling later restores their look). Clips, transcripts, cleaned audio, and the project aspect ratio are NOT touched. Use this when the user says 'start over', 'clear all edits', or 'reset the timeline' — instead of looping project_remove_region (which N-tuples revisions and failure points). Pass full=true to also clear per-clip LUTs + crops + webcam layout + wallpaper for a true blank canvas. Returns a `cleared` summary listing how many of each kind were removed.",
1104
+ inputSchema: {
1105
+ type: "object",
1106
+ properties: {
1107
+ id: { type: "string" },
1108
+ path: { type: "string" },
1109
+ full: {
1110
+ type: "boolean",
1111
+ description:
1112
+ "Also reset project-level visual config (per-clip LUT presets, LUT intensity, screen crop, webcam crop, webcam layout, wallpaper). Default false — only time-based edits + captions.enabled are cleared. Aspect ratio is NEVER reset.",
1113
+ },
1114
+ expectedRevision: { type: "number" },
1115
+ },
1116
+ },
1117
+ command: "project.clear-edits",
1118
+ },
1085
1119
  {
1086
1120
  name: "project_update_region",
1087
1121
  description:
@@ -1439,6 +1473,25 @@ const TOOLS = [
1439
1473
  },
1440
1474
  command: "transcript.search",
1441
1475
  },
1476
+ {
1477
+ name: "transcript_find_issues",
1478
+ description:
1479
+ "Scan the transcript for editorial problems the speaker created and recovered from: **duplicate-take** (a line re-recorded later — keep the cleaner second take, cut the first), **false-start** (an abandoned fragment before a restart), and **adjacent-repeat** (a stutter like 'the the'). Returns candidate `issues`, each with `type`, `severity`, the `wordIds` of the DISCARDED attempt (pass straight to transcript.delete-words), the edited-time span, the offending `text`, and a `note` explaining what's kept. CONSERVATIVE and read-only — it never edits; review each candidate against context before deleting, since some repeats are intentional. Run this after transcribe + remove-fillers as the content-cleanup pass. Filter with `types` (comma-separated) and cap with `limit`.",
1480
+ inputSchema: {
1481
+ type: "object",
1482
+ properties: {
1483
+ id: { type: "string" },
1484
+ path: { type: "string" },
1485
+ types: {
1486
+ type: "string",
1487
+ description:
1488
+ "Optional comma-separated filter: any of `duplicate-take`, `false-start`, `adjacent-repeat`. Omit for all.",
1489
+ },
1490
+ limit: { type: "number", description: "Optional max number of issues to return." },
1491
+ },
1492
+ },
1493
+ command: "transcript.find-issues",
1494
+ },
1442
1495
  {
1443
1496
  name: "transcript_find_replace",
1444
1497
  description:
@@ -1510,7 +1563,7 @@ const TOOLS = [
1510
1563
  {
1511
1564
  name: "caption_set_template",
1512
1565
  description:
1513
- "Pick a caption template: classic, modern, minimal, bold, spotlight, boxed, neon, colored, or texture. `texture` fills large uppercase words with a flowing texture mask (lava/marble/metal/wood/concrete/rock) — pick the texture via caption_set_style `texture` (defaults to lava).",
1566
+ "Pick a caption template: classic, modern, minimal, bold, spotlight, boxed, neon, colored, texture, or editorial. `texture` fills large uppercase words with a flowing texture mask (lava/marble/metal/wood/concrete/rock) — pick the texture via caption_set_style `texture` (defaults to lava). `editorial` is a magazine-emphasis style: the word being spoken right now renders large (and takes an accent color) while the rest of the line shrinks, so one big word sweeps across the line in time with the speech.",
1514
1567
  inputSchema: {
1515
1568
  type: "object",
1516
1569
  properties: {
@@ -1528,6 +1581,7 @@ const TOOLS = [
1528
1581
  "neon",
1529
1582
  "colored",
1530
1583
  "texture",
1584
+ "editorial",
1531
1585
  ],
1532
1586
  },
1533
1587
  expectedRevision: { type: "number" },
@@ -1623,7 +1677,49 @@ const TOOLS = [
1623
1677
  command: "media.generate-image",
1624
1678
  },
1625
1679
  // `motion_generate` removed in v1.31.0 — see comment above the
1626
- // motion-graphics section. Authoring path is `motion_render_html`.
1680
+ // motion-graphics section.
1681
+ {
1682
+ name: "motion_list",
1683
+ description:
1684
+ "List the bundled motion-graphic templates an agent can drop onto the timeline. Returns each template's id, name, description, style, tags, aspectRatios, durationMs, `overlay` (true → renders with alpha; sits over the video), and `slots` — the editable fields (key, type: string|color|list, label, default). Call this to discover what's available and exactly which text/colors you can set, then render one with motion_generate. The SKILL.md 'Motion graphics' catalog documents when to use each.",
1685
+ inputSchema: { type: "object", properties: {} },
1686
+ command: "motion.list",
1687
+ },
1688
+ {
1689
+ name: "motion_generate",
1690
+ description:
1691
+ "Render a bundled template by id with your own slot values (text, colors, list items) and a background mode, then add the result to the timeline with project_add_motion_graphic (or project_add_designed_segment for split-panel). Async — returns { jobId, outputPath }; call job_wait, then pass that jobId as `fromJob` to the add tool. Discover templates + slots with motion_list. Prefer this over motion_render_html whenever a bundled template fits the brief — it's faster and already designed.",
1692
+ inputSchema: {
1693
+ type: "object",
1694
+ properties: {
1695
+ templateId: {
1696
+ type: "string",
1697
+ description: "Template id from motion_list (e.g. creator-card, stat-reveal, split-panel).",
1698
+ },
1699
+ slots: {
1700
+ type: "object",
1701
+ description:
1702
+ "Editable values keyed by slot key (see motion_list / the SKILL catalog): text strings, color hex strings, or list arrays. Omitted slots fall back to the template default.",
1703
+ },
1704
+ aspectRatio: {
1705
+ type: "string",
1706
+ enum: ["16:9", "9:16", "1:1"],
1707
+ description: "Defaults to the template's first listed aspect.",
1708
+ },
1709
+ background: {
1710
+ type: "string",
1711
+ enum: ["solid", "transparent", "glass"],
1712
+ description:
1713
+ "'solid' = hard full-frame card. 'transparent' = alpha; camera shows through un-painted pixels. 'glass' = alpha + frosted blur of the camera behind the content (then set backdropBlurStrength on project_add_motion_graphic). Omit to use the template's natural mode — overlay templates (split-panel, lower thirds, grain/3D/shatter/parallax titles) default to transparent, opaque cards to solid. Don't force 'solid' on an overlay template — its see-through half turns black.",
1714
+ },
1715
+ outputName: { type: "string", description: "Optional filename stem (no extension)." },
1716
+ },
1717
+ required: ["templateId", "slots"],
1718
+ },
1719
+ command: "motion.generate",
1720
+ },
1721
+ // Custom HTML authoring path is `motion_render_html` (for briefs no
1722
+ // bundled template fits).
1627
1723
  {
1628
1724
  name: "motion_render_html",
1629
1725
  description:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.38.0",
3
+ "version": "1.42.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",