@writepanda/mcp 1.9.3 → 1.9.5

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 -20
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -34,10 +34,7 @@ import path from "node:path";
34
34
  import process from "node:process";
35
35
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
36
36
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
37
- import {
38
- CallToolRequestSchema,
39
- ListToolsRequestSchema,
40
- } from "@modelcontextprotocol/sdk/types.js";
37
+ import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
41
38
 
42
39
  // ── Credentials + transport ───────────────────────────────────────────
43
40
 
@@ -176,7 +173,8 @@ const TOOLS = [
176
173
  },
177
174
  {
178
175
  name: "project_show",
179
- description: "Resolve a project's path + summary metadata by id or path. Cheaper than project_read.",
176
+ description:
177
+ "Resolve a project's path + summary metadata by id or path. Cheaper than project_read.",
180
178
  inputSchema: {
181
179
  type: "object",
182
180
  properties: {
@@ -219,7 +217,8 @@ const TOOLS = [
219
217
  },
220
218
  {
221
219
  name: "project_open",
222
- description: "Open the desktop editor focused on a specific project (so the user can take over).",
220
+ description:
221
+ "Open the desktop editor focused on a specific project (so the user can take over).",
223
222
  inputSchema: {
224
223
  type: "object",
225
224
  properties: {
@@ -272,7 +271,10 @@ const TOOLS = [
272
271
  properties: {
273
272
  id: { type: "string" },
274
273
  path: { type: "string" },
275
- fxId: { type: "string", description: "Bundled FX id (e.g. film-burn). Use asset_list_fx to discover." },
274
+ fxId: {
275
+ type: "string",
276
+ description: "Bundled FX id (e.g. film-burn). Use asset_list_fx to discover.",
277
+ },
276
278
  src: { type: "string", description: "Direct path/URL (alternative to fxId)" },
277
279
  atMs: { type: "number" },
278
280
  durationMs: { type: "number", description: "Default 2500ms for bundled FX" },
@@ -296,7 +298,8 @@ const TOOLS = [
296
298
  durationMs: { type: "number", description: "Default 5000ms" },
297
299
  designType: {
298
300
  type: "string",
299
- description: "name-bar | slash-reveal | center-stack | minimal-underline | box-reveal | corner-brackets | border-frame | split-horizontal",
301
+ description:
302
+ "name-bar | slash-reveal | center-stack | minimal-underline | box-reveal | corner-brackets | border-frame | split-horizontal",
300
303
  },
301
304
  accentColor: { type: "string" },
302
305
  expectedRevision: { type: "number" },
@@ -309,7 +312,8 @@ const TOOLS = [
309
312
  // ── compose: visual regions ─────────────────────────────────────
310
313
  {
311
314
  name: "project_add_zoom",
312
- description: "Add a zoom region — highlight a UI moment. Typical pattern: find 'click X' in transcript, drop zoom there.",
315
+ description:
316
+ "Add a zoom region — highlight a UI moment. Typical pattern: find 'click X' in transcript, drop zoom there.",
313
317
  inputSchema: {
314
318
  type: "object",
315
319
  properties: {
@@ -410,7 +414,8 @@ const TOOLS = [
410
414
  },
411
415
  {
412
416
  name: "transcript_remove_fillers",
413
- description: "Auto-detect filler words ('um', 'uh', 'like', 'you know', ...) plus immediately-repeated words and bulk-trim them.",
417
+ description:
418
+ "Auto-detect filler words ('um', 'uh', 'like', 'you know', ...) plus immediately-repeated words and bulk-trim them.",
414
419
  inputSchema: {
415
420
  type: "object",
416
421
  properties: {
@@ -424,7 +429,8 @@ const TOOLS = [
424
429
  },
425
430
  {
426
431
  name: "transcript_search",
427
- description: "Find every occurrence of a phrase in the merged transcript. Returns matches with their word IDs.",
432
+ description:
433
+ "Find every occurrence of a phrase in the merged transcript. Returns matches with their word IDs.",
428
434
  inputSchema: {
429
435
  type: "object",
430
436
  properties: {
@@ -471,7 +477,8 @@ const TOOLS = [
471
477
  },
472
478
  {
473
479
  name: "caption_set_template",
474
- description: "Pick a caption template: classic, modern, minimal, bold, spotlight, boxed, neon, or colored.",
480
+ description:
481
+ "Pick a caption template: classic, modern, minimal, bold, spotlight, boxed, neon, or colored.",
475
482
  inputSchema: {
476
483
  type: "object",
477
484
  properties: {
@@ -488,13 +495,15 @@ const TOOLS = [
488
495
  // ── motion graphics ─────────────────────────────────────────────
489
496
  {
490
497
  name: "motion_list",
491
- description: "List every motion-graphic template (id, name, slots, defaults, aspectRatios). 19 templates ship today.",
498
+ description:
499
+ "List every motion-graphic template (id, name, slots, defaults, aspectRatios). 19 templates ship today.",
492
500
  inputSchema: { type: "object", properties: {} },
493
501
  command: "motion.list",
494
502
  },
495
503
  {
496
504
  name: "motion_themes",
497
- description: "List every style-pack theme (color overrides). default, mr-beast, mkbhd, kurzgesagt, veritasium.",
505
+ description:
506
+ "List every style-pack theme (color overrides). default, mr-beast, mkbhd, kurzgesagt, veritasium.",
498
507
  inputSchema: { type: "object", properties: {} },
499
508
  command: "motion.themes",
500
509
  },
@@ -514,6 +523,34 @@ const TOOLS = [
514
523
  },
515
524
  command: "motion.generate",
516
525
  },
526
+ {
527
+ name: "motion_render_html",
528
+ description:
529
+ "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.",
530
+ inputSchema: {
531
+ type: "object",
532
+ properties: {
533
+ html: {
534
+ type: "string",
535
+ description: "Inline HTML string (mutually exclusive with htmlPath).",
536
+ },
537
+ htmlPath: {
538
+ type: "string",
539
+ description: "Absolute path to .html file (mutually exclusive with html).",
540
+ },
541
+ aspectRatio: {
542
+ type: "string",
543
+ description: "16:9 (default) | 9:16 | 1:1. Ignored if width+height supplied.",
544
+ },
545
+ width: { type: "number" },
546
+ height: { type: "number" },
547
+ durationMs: { type: "number", description: "How long to capture. Default 2500." },
548
+ frameRate: { type: "number", description: "Default 30." },
549
+ outputName: { type: "string", description: "Optional filename stem." },
550
+ },
551
+ },
552
+ command: "motion.render-html",
553
+ },
517
554
 
518
555
  // ── assets ──────────────────────────────────────────────────────
519
556
  {
@@ -524,7 +561,8 @@ const TOOLS = [
524
561
  },
525
562
  {
526
563
  name: "asset_list_fx",
527
- description: "List every bundled FX video overlay (id, title, blendMode, defaults, absolute path).",
564
+ description:
565
+ "List every bundled FX video overlay (id, title, blendMode, defaults, absolute path).",
528
566
  inputSchema: { type: "object", properties: {} },
529
567
  command: "asset.list-fx",
530
568
  },
@@ -532,7 +570,8 @@ const TOOLS = [
532
570
  // ── project-aware LLM ──────────────────────────────────────────
533
571
  {
534
572
  name: "llm_generate_title",
535
- description: "Generate a YouTube-ready title from the project's merged transcript using the bundled local LLM.",
573
+ description:
574
+ "Generate a YouTube-ready title from the project's merged transcript using the bundled local LLM.",
536
575
  inputSchema: {
537
576
  type: "object",
538
577
  properties: {
@@ -580,7 +619,10 @@ const TOOLS = [
580
619
  properties: {
581
620
  id: { type: "string" },
582
621
  path: { type: "string" },
583
- outputPath: { type: "string", description: "Where to write the MP4. Default: recordings dir" },
622
+ outputPath: {
623
+ type: "string",
624
+ description: "Where to write the MP4. Default: recordings dir",
625
+ },
584
626
  quality: { type: "string", description: "draft | standard | high | ultra. Default high" },
585
627
  },
586
628
  },
@@ -635,7 +677,10 @@ const TOOLS = [
635
677
  type: "object",
636
678
  properties: {
637
679
  id: { type: "string", description: "Job id from the async tool's response" },
638
- timeoutMs: { type: "number", description: "Max wait. Default 60_000, hard-capped at 300_000" },
680
+ timeoutMs: {
681
+ type: "number",
682
+ description: "Max wait. Default 60_000, hard-capped at 300_000",
683
+ },
639
684
  },
640
685
  required: ["id"],
641
686
  },
@@ -674,7 +719,7 @@ const TOOLS = [
674
719
  const server = new Server(
675
720
  {
676
721
  name: "pandastudio",
677
- version: "1.9.3",
722
+ version: "1.9.5",
678
723
  },
679
724
  {
680
725
  capabilities: {
@@ -712,7 +757,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
712
757
  dispatchArgs = args.args ?? {};
713
758
  if (typeof command !== "string" || !command.includes(".")) {
714
759
  return {
715
- content: [{ type: "text", text: "pandastudio_call requires `command` of the form 'verb.noun'" }],
760
+ content: [
761
+ { type: "text", text: "pandastudio_call requires `command` of the form 'verb.noun'" },
762
+ ],
716
763
  isError: true,
717
764
  };
718
765
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.9.3",
3
+ "version": "1.9.5",
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",