@writepanda/mcp 1.218.0 → 1.219.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 +11 -6
  2. package/package.json +1 -1
package/bin/server.mjs CHANGED
@@ -1231,7 +1231,7 @@ const TOOLS = [
1231
1231
  {
1232
1232
  name: "export_publish_youtube",
1233
1233
  description:
1234
- "Publish an export entry to YouTube. Slow. Check the entry's youtubeVideoId before republishing. channelId optional (uploads go to the account's own channel; omit when channels can't be listed). Error code youtube_permission_missing: relay message, follow howToFix. Returns { videoUrl, channelId }.",
1234
+ "Publish an export entry to YouTube. Slow. Check the entry's youtubeVideoId before republishing. channelId optional (uploads go to the account's own channel; omit when channels can't be listed). Error code youtube_permission_missing: relay message, follow howToFix. Error code daily_limit or youtube_quota_exceeded (with resetsAt): tell the user when it resets; never retry before resetsAt. Returns { videoUrl, channelId }.",
1235
1235
  inputSchema: {
1236
1236
  type: "object",
1237
1237
  properties: {
@@ -1296,7 +1296,7 @@ const TOOLS = [
1296
1296
  {
1297
1297
  name: "export_publish_social",
1298
1298
  description:
1299
- "Post an export entry to connected social accounts, now or scheduled. Public: confirm accounts + caption first. Returns { jobId }; job_wait gives { state, channels[{ permalink, error }], summary }.",
1299
+ "Post an export entry to connected social accounts, now or scheduled. Public: confirm accounts + caption first. Returns { jobId }; job_wait gives { state, channels[{ permalink, error }], summary }. A job failing with errorDetails.code daily_limit (posts per workspace per 24h) has errorDetails.resetsAt: tell the user; never retry before it.",
1300
1300
  inputSchema: {
1301
1301
  type: "object",
1302
1302
  properties: {
@@ -1347,7 +1347,8 @@ const TOOLS = [
1347
1347
  },
1348
1348
  {
1349
1349
  name: "export_update_youtube",
1350
- description: "Update a published YouTube video's metadata (only fields to change).",
1350
+ description:
1351
+ "Update a published YouTube video's metadata (only fields to change). Error code daily_limit or youtube_quota_exceeded (with resetsAt): never retry before resetsAt.",
1351
1352
  inputSchema: {
1352
1353
  type: "object",
1353
1354
  properties: {
@@ -1365,7 +1366,8 @@ const TOOLS = [
1365
1366
  },
1366
1367
  {
1367
1368
  name: "export_update_youtube_thumbnail",
1368
- description: "Replace a published YouTube video's thumbnail (local 1280x720 image).",
1369
+ description:
1370
+ "Replace a published YouTube video's thumbnail (local 1280x720 image). Error code daily_limit or youtube_quota_exceeded (with resetsAt): never retry before resetsAt.",
1369
1371
  inputSchema: {
1370
1372
  type: "object",
1371
1373
  properties: {
@@ -4318,7 +4320,7 @@ const TOOLS = [
4318
4320
  {
4319
4321
  name: "audio_enhance",
4320
4322
  description:
4321
- "Enhance voice: THE audio cleanup step (one call). Runs the studio chain on speech, per source (a podcast's host and each guest separately): noise removal, coughs/bumps out of pauses, mouth-click repair, broadcast tone, boom control, level riding (lifts very quiet speech too), de-esser, quieter pauses, -16 LUFS / -1 dBTP. strength: natural (default), light (gentle tidy), strong (assertive broadcast). keepBackground true for vlogs / ambience where the room is part of the video (no noise removal, event remover or pause expander; level, EQ and loudness still run). Enhance voice already removes room echo with the Studio AI model; only use echo when the result reports the model did not run (fallback) (denoiser deepfilternet3, or keepBackground); when the model runs, echo is skipped and the result says echoSkipped: ai-model-removes-echo (relay echoSkippedReason, do not retry). restore true = Restore voice quality (TF-Restormer) for thin, muffled or call-quality mics only (Apple silicon; slow; never on a good mic). reference = a clip id or file whose voice tone to match. off true restores the original audio. The noise-removal engine is automatic. Every run processes the original media, so running again replaces the result (never stacks). ASYNC: { jobId }, job_wait; the result reports before/after loudness (LUFS, LRA, true peak, speech over pauses, tone deviation) and the engine per source: tell the user.",
4323
+ "Enhance voice: THE audio cleanup step (one call). Runs the studio chain on speech, per source (a podcast's host and each guest separately): noise removal, coughs/bumps out of pauses, mouth-click repair, broadcast tone, boom control, level riding (lifts very quiet speech too), de-esser, quieter pauses, -16 LUFS / -1 dBTP. strength: natural (default), light (gentle tidy), strong (assertive broadcast). keepBackground true for vlogs / ambience where the room is part of the video (no noise removal, event remover or pause expander; level, EQ and loudness still run). Enhance voice already removes room echo with the Studio AI model; only use echo when the result reports the model did not run (fallback) (denoiser deepfilternet3, or keepBackground); when the model runs, echo is skipped and the result says echoSkipped: ai-model-removes-echo (relay echoSkippedReason, do not retry). restore true = Studio mic sound (the app's name) for thin, muffled or call-quality mics only (never on a good mic): TF-Restormer on Apple silicon, AP-BWE on Windows and Intel Macs (CPU, faster than real time); restoreEngine in the result says which ran. reference = a clip id or file whose voice tone to match. off true restores the original audio. The noise-removal engine is automatic. Every run processes the original media, so running again replaces the result (never stacks). ASYNC: { jobId }, job_wait; the result reports before/after loudness (LUFS, LRA, true peak, speech over pauses, tone deviation) and the engine per source: tell the user.",
4322
4324
  inputSchema: {
4323
4325
  type: "object",
4324
4326
  properties: {
@@ -4348,7 +4350,8 @@ const TOOLS = [
4348
4350
  restore: {
4349
4351
  type: "boolean",
4350
4352
  default: false,
4351
- description: "Restore voice quality for a thin / low-bandwidth mic (TF-Restormer).",
4353
+ description:
4354
+ "Studio mic sound for a thin / low-bandwidth mic (TF-Restormer on Apple silicon, AP-BWE elsewhere).",
4352
4355
  },
4353
4356
  reference: { type: "string", description: "Clip id or audio/video file to sound like." },
4354
4357
  off: { type: "boolean", description: "Remove the enhancement (original audio)." },
@@ -6252,6 +6255,8 @@ A single named operation ("just add captions", "remove the silences") is exactly
6252
6255
 
6253
6256
  Destructive actions need the user's own confirmation: project_delete, workspace_delete, recipe_delete, memory_forget, export_delete, export_clear_thumbnail, youtube_disconnect, social_disconnect. Ask plainly in chat first ("Delete project 'Demo'? This can't be undone.") and call only after they agree. PandaStudio then confirms with them itself: in its own chat the call returns confirmation_required and changes nothing while a Delete / Cancel card waits (tell them to press it; don't call again; the outcome arrives as their next message); from other apps a dialog asks, and the call is refused when nobody is at the app. Nothing you send can approve it.
6254
6257
 
6258
+ Publishing has daily limits (YouTube uploads and updates per license, social posts per workspace, and PandaStudio's shared YouTube quota). A failure with code daily_limit or youtube_quota_exceeded carries resetsAt: tell the user when it resets and do not retry, loop or switch accounts to get around it before then. It is not a bug to report.
6259
+
6255
6260
  PandaStudio problems (a capability gap like an imported font the export can't draw, a command failing unexpectedly, a render not matching the project): call system_report_issue yourself, then tell the user you reported it. Not for user mistakes, missing keys or taste.
6256
6261
 
6257
6262
  Destination decides everything: infer it (Shorts/TikTok/vertical/<=90s: shorts; YouTube/tutorial/>8 min: youtube-long; LinkedIn; Loom/internal), else ask once.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@writepanda/mcp",
3
- "version": "1.218.0",
3
+ "version": "1.219.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",