@writepanda/mcp 1.217.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.
- package/bin/server.mjs +26 -11
- 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:
|
|
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:
|
|
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). echo
|
|
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: {
|
|
@@ -4339,11 +4341,17 @@ const TOOLS = [
|
|
|
4339
4341
|
default: false,
|
|
4340
4342
|
description: "Keep the room sound (vlogs, ambience).",
|
|
4341
4343
|
},
|
|
4342
|
-
echo: {
|
|
4344
|
+
echo: {
|
|
4345
|
+
type: "boolean",
|
|
4346
|
+
default: false,
|
|
4347
|
+
description:
|
|
4348
|
+
"Reduce room echo. Enhance voice already removes room echo with the Studio AI model; only use echo when the result reports the model did not run (fallback). Skipped (echoSkipped) whenever the model runs.",
|
|
4349
|
+
},
|
|
4343
4350
|
restore: {
|
|
4344
4351
|
type: "boolean",
|
|
4345
4352
|
default: false,
|
|
4346
|
-
description:
|
|
4353
|
+
description:
|
|
4354
|
+
"Studio mic sound for a thin / low-bandwidth mic (TF-Restormer on Apple silicon, AP-BWE elsewhere).",
|
|
4347
4355
|
},
|
|
4348
4356
|
reference: { type: "string", description: "Clip id or audio/video file to sound like." },
|
|
4349
4357
|
off: { type: "boolean", description: "Remove the enhancement (original audio)." },
|
|
@@ -4359,14 +4367,18 @@ const TOOLS = [
|
|
|
4359
4367
|
{
|
|
4360
4368
|
name: "audio_clean",
|
|
4361
4369
|
description:
|
|
4362
|
-
"Deprecated alias of audio_enhance strength light (noise removal, gentle level and tone, -16 LUFS), echo true adds Reduce echo; clips already enhanced are skipped unless clipId is given. Prefer audio_enhance. ASYNC: { jobId }, job_wait.",
|
|
4370
|
+
"Deprecated alias of audio_enhance strength light (noise removal, gentle level and tone, -16 LUFS), echo true adds Reduce echo only when the Studio AI model does not run (it already removes room echo; the result then says echoSkipped); clips already enhanced are skipped unless clipId is given. Prefer audio_enhance. ASYNC: { jobId }, job_wait.",
|
|
4363
4371
|
inputSchema: {
|
|
4364
4372
|
type: "object",
|
|
4365
4373
|
properties: {
|
|
4366
4374
|
id: { type: "string" },
|
|
4367
4375
|
path: { type: "string" },
|
|
4368
4376
|
clipId: { type: "string" },
|
|
4369
|
-
echo: {
|
|
4377
|
+
echo: {
|
|
4378
|
+
type: "boolean",
|
|
4379
|
+
description:
|
|
4380
|
+
"Enhance voice already removes room echo with the Studio AI model; only use echo when the result reports the model did not run (fallback).",
|
|
4381
|
+
},
|
|
4370
4382
|
normalize: { type: "boolean", description: "Ignored (quiet speech is always lifted)." },
|
|
4371
4383
|
},
|
|
4372
4384
|
},
|
|
@@ -5717,7 +5729,8 @@ const TOOLS = [
|
|
|
5717
5729
|
},
|
|
5718
5730
|
{
|
|
5719
5731
|
name: "llm_generate_timestamps",
|
|
5720
|
-
description:
|
|
5732
|
+
description:
|
|
5733
|
+
"Generate YouTube chapter timestamps for the edited video: edited-timeline times from the words that survive the cuts (first 0:00, each >= 10 s, all before the end); the local LLM only writes labels.",
|
|
5721
5734
|
inputSchema: {
|
|
5722
5735
|
type: "object",
|
|
5723
5736
|
properties: {
|
|
@@ -6233,7 +6246,7 @@ Before an editing pass, read the skill's "Which tool for which moment" section (
|
|
|
6233
6246
|
3. Fix misheard names / brands with transcript_find_replace (transcript_insert_words for dropped words).
|
|
6234
6247
|
4. transcript_find_issues, then transcript_delete_words on each duplicate take / false start (keep the LAST take; keep severity "low" ones).
|
|
6235
6248
|
5. transcript_remove_silences.
|
|
6236
|
-
6. audio_enhance (Enhance voice) on clips not yet enhanced: strength natural; keepBackground true for vlogs / ambience; echo only when the
|
|
6249
|
+
6. audio_enhance (Enhance voice) on clips not yet enhanced: strength natural; keepBackground true for vlogs / ambience; no echo (Enhance voice already removes room echo with the Studio AI model; only use echo when the result reports the model did not run (fallback)).
|
|
6237
6250
|
7. The style, after steps 2-5 (they shift the timeline). The user's named style, recipe, creator or a saved memory wins. Otherwise call recipe_pick: it returns the recipes that fit this project's format and footage, each with pickWhen, plus defaultId. Read the transcript, choose the ONE candidate whose pickWhen matches what is said (defaultId when none clearly fits), do its "before" step if any, then recipe_apply_style + recipe_render and follow the prompt: the recipe decides the style (captions, pacing, kinds of moves, music, transitions). Graphics inside it are designed by you: a named template is the reference look; author your own (motion_render_html, same palette and type) when a beat needs something the template can't show. (An app without recipe_pick, 2.0.5 and older: recipe_list with format short or long, and choose by description and footage.) Tell the user which recipe and why in one line and name one or two alternatives. Only when no candidate exists or the user asked for a plain clean-up: captions (caption_toggle, template glowStack), a few motion graphics, emphasis zooms.
|
|
6238
6251
|
8. B-roll, last: pick the moments yourself from what's said (any language), check them with project_check_broll, show the user your moments and ASK: their own images, generated on their image connector (only if one is connected; it uses their credits), or no B-roll. Never generate or invent images without their answer. Place what they give with project_add_broll. Nobody to ask: skip it and say so.
|
|
6239
6252
|
9. llm_generate_title / description / timestamps, then preview_show and ask before export_start. Never export before the user has seen the preview.
|
|
@@ -6242,6 +6255,8 @@ A single named operation ("just add captions", "remove the silences") is exactly
|
|
|
6242
6255
|
|
|
6243
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.
|
|
6244
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
|
+
|
|
6245
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.
|
|
6246
6261
|
|
|
6247
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.
|
|
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",
|