@writepanda/mcp 1.42.0 → 1.45.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 +67 -2
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -275,6 +275,52 @@ const TOOLS = [
275
275
  },
276
276
  command: "workspace.contents",
277
277
  },
278
+ {
279
+ name: "workspace_get_brand",
280
+ description:
281
+ "Return the active workspace's brand kit (name, tagline, colors, typography, voice, logoPath). Use BEFORE authoring custom motion graphics, lower-thirds, outros, or thumbnails — the v1.32 motion-philosophy contract requires reading the brand and using its values verbatim instead of inventing a default look. Returns { brand: null } if no brand is configured (in which case ASK the user for at least the primary color + light/dark mood before authoring).",
282
+ inputSchema: { type: "object", properties: {} },
283
+ command: "workspace.get-brand",
284
+ },
285
+ {
286
+ name: "workspace_set_brand",
287
+ description:
288
+ "Write/replace the active workspace's brand kit. Pass any subset of fields under `brand`. Hex colors are normalized to #rrggbb on the way in; empty strings are dropped; unknown voice values are ignored. Pass brand=null (or omit it) to clear the brand entirely. Don't call this on every turn — only when the user explicitly tells you their brand is changing.",
289
+ inputSchema: {
290
+ type: "object",
291
+ properties: {
292
+ brand: {
293
+ type: ["object", "null"],
294
+ properties: {
295
+ name: { type: "string" },
296
+ tagline: { type: "string" },
297
+ colors: {
298
+ type: "object",
299
+ properties: {
300
+ primary: { type: "string" },
301
+ accent: { type: "string" },
302
+ ink: { type: "string" },
303
+ background: { type: "string" },
304
+ },
305
+ },
306
+ typography: {
307
+ type: "object",
308
+ properties: {
309
+ display: { type: "string" },
310
+ body: { type: "string" },
311
+ },
312
+ },
313
+ voice: {
314
+ type: "string",
315
+ enum: ["minimal", "bold", "editorial", "casual", "corporate", "playful"],
316
+ },
317
+ logoPath: { type: "string" },
318
+ },
319
+ },
320
+ },
321
+ },
322
+ command: "workspace.set-brand",
323
+ },
278
324
 
279
325
  // ── YouTube publishing (v1.19) ──────────────────────────────────
280
326
  // Connect Google accounts per workspace, publish exports, edit
@@ -1394,6 +1440,23 @@ const TOOLS = [
1394
1440
  },
1395
1441
  command: "project.set-clip-lut",
1396
1442
  },
1443
+ {
1444
+ name: "project_set_clip_kind",
1445
+ description:
1446
+ "Stamp a clip's capture origin authoritatively: kind = camera | screen | upload. project.read returns each clip's kind (your visual-strategy signal: camera → designed segments + emphasis zooms; screen → cursor zooms). On pre-v1.28 projects kind wasn't recorded, so project.read INFERS it (flagged kindInferred:true) — and inference can be wrong. Use this to correct/lock it. `camera` = talking-head; `screen` = screen recording (maybe with webcam PiP); `upload` = imported file.",
1447
+ inputSchema: {
1448
+ type: "object",
1449
+ properties: {
1450
+ id: { type: "string" },
1451
+ path: { type: "string" },
1452
+ clipId: { type: "string", description: "Clip id from project_read mainTrack.clips[n].id" },
1453
+ kind: { type: "string", enum: ["camera", "screen", "upload"] },
1454
+ expectedRevision: { type: "number" },
1455
+ },
1456
+ required: ["clipId", "kind"],
1457
+ },
1458
+ command: "project.set-clip-kind",
1459
+ },
1397
1460
 
1398
1461
  // ── transcript-based editing ────────────────────────────────────
1399
1462
  {
@@ -1520,7 +1583,8 @@ const TOOLS = [
1520
1583
  path: { type: "string" },
1521
1584
  thresholdMs: {
1522
1585
  type: "number",
1523
- description: "Gaps longer than this are trimmed. Default 700ms.",
1586
+ description:
1587
+ "Gaps longer than this are trimmed. Default 500ms — same threshold as the UI Remove Silences button, so the agent removes the same silences a manual click would.",
1524
1588
  },
1525
1589
  expectedRevision: { type: "number" },
1526
1590
  },
@@ -1694,7 +1758,8 @@ const TOOLS = [
1694
1758
  properties: {
1695
1759
  templateId: {
1696
1760
  type: "string",
1697
- description: "Template id from motion_list (e.g. creator-card, stat-reveal, split-panel).",
1761
+ description:
1762
+ "Template id from motion_list (e.g. creator-card, stat-reveal, split-panel).",
1698
1763
  },
1699
1764
  slots: {
1700
1765
  type: "object",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.42.0",
3
+ "version": "1.45.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",