@pixeldojo/mcp 0.30.0 → 0.31.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/dist/cli.cjs +53 -19
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +53 -19
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +53 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -549,7 +549,7 @@ var init_generate = __esm({
|
|
|
549
549
|
InputSchema = z.object({
|
|
550
550
|
prompt: z.string().min(1).max(8e3).describe('Prompt describing what to generate. Write @Name to use a character or element the user saved in Character Studio ("@Mara on a beach"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.'),
|
|
551
551
|
model: z.string().optional().describe(
|
|
552
|
-
`Model apiId. Recommended (the models the PixelDojo studios use): "seedream-5" for images (the default), "seedance-2-5" for video (prompt only or a starting image), "wan-3-0-video" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model's fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5, which makes still images only; name a video model to get a video.`
|
|
552
|
+
`Model apiId. Recommended (the models the PixelDojo studios use): "seedream-5" for images (the default), "seedance-2-5" for video (prompt only or a starting image), "kling-4-0" for a whole scene up to 30 s written as a shot list (dialogue in quotes, exact on-screen text), "minimax-h3-turbo" for the cheapest video from a photo or up to 9 reference images (it needs at least one picture), "wan-3-0-video" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model's fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5, which makes still images only; name a video model to get a video.`
|
|
553
553
|
),
|
|
554
554
|
preset: z.string().optional().describe(
|
|
555
555
|
"Preset slug that seeds the running model's settings; explicit fields and params override it. Each preset belongs to one model (browse them by model at https://pixeldojo.ai/presets), so set `model` to that preset's model: a slug the running model has no preset for is rejected with a 400 before any charge."
|
|
@@ -588,7 +588,7 @@ var init_generate = __esm({
|
|
|
588
588
|
prompt: { type: "string", description: 'Prompt describing what to generate. Write @Name to use a character or element the user saved in Character Studio ("@Mara on a beach"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.' },
|
|
589
589
|
model: {
|
|
590
590
|
type: "string",
|
|
591
|
-
description: `Model apiId. Recommended (the models the PixelDojo studios use): "seedream-5" for images (the default), "seedance-2-5" for video (prompt only or a starting image), "wan-3-0-video" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model's fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5, which makes still images only; name a video model to get a video.`
|
|
591
|
+
description: `Model apiId. Recommended (the models the PixelDojo studios use): "seedream-5" for images (the default), "seedance-2-5" for video (prompt only or a starting image), "kling-4-0" for a whole scene up to 30 s written as a shot list (dialogue in quotes, exact on-screen text), "minimax-h3-turbo" for the cheapest video from a photo or up to 9 reference images (it needs at least one picture), "wan-3-0-video" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model's fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5, which makes still images only; name a video model to get a video.`
|
|
592
592
|
},
|
|
593
593
|
preset: {
|
|
594
594
|
type: "string",
|
|
@@ -636,8 +636,8 @@ var init_generate = __esm({
|
|
|
636
636
|
};
|
|
637
637
|
generateSkill = {
|
|
638
638
|
name: "pixeldojo_generate",
|
|
639
|
-
description: "Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image. If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills, `video_url` for a source clip, `image_path`/`image_paths` for absolute local files (uploaded to 24h temp storage first). A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.",
|
|
640
|
-
hostedDescription: "Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image. If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills and `video_url` for a source clip, all public http(s) URLs. A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.",
|
|
639
|
+
description: "Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image; kling-4-0 for a multi-shot scene up to 30 s with dialogue; minimax-h3-turbo for the lowest price when you have a photo or reference images (it refuses a prompt alone). If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills, `video_url` for a source clip, `image_path`/`image_paths` for absolute local files (uploaded to 24h temp storage first). A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.",
|
|
640
|
+
hostedDescription: "Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image; kling-4-0 for a multi-shot scene up to 30 s with dialogue; minimax-h3-turbo for the lowest price when you have a photo or reference images (it refuses a prompt alone). If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills and `video_url` for a source clip, all public http(s) URLs. A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.",
|
|
641
641
|
inputZod: InputSchema,
|
|
642
642
|
inputJsonSchema: InputJsonSchema,
|
|
643
643
|
allowedModels: null,
|
|
@@ -1051,6 +1051,8 @@ var init_storyboard = __esm({
|
|
|
1051
1051
|
ALLOWED2 = [
|
|
1052
1052
|
"veo-3.1-fast",
|
|
1053
1053
|
"veo-3.1-standard",
|
|
1054
|
+
// Kling 4.0 (2026-10-24): a brief written as a shot list renders as one clip, up to 30 s.
|
|
1055
|
+
"kling-4-0",
|
|
1054
1056
|
"kling-video-v3-standard-text",
|
|
1055
1057
|
"seedance-2-high",
|
|
1056
1058
|
VIDEO_REFERENCE_MODEL
|
|
@@ -2442,6 +2444,27 @@ function buildVideoPayload(verb, apiId, i) {
|
|
|
2442
2444
|
return { body: { prompt, video_url: i.videoUrl, video_duration: vd }, note: droppedImages };
|
|
2443
2445
|
case "happyhorse-1.0-video-edit":
|
|
2444
2446
|
return { body: { prompt, video_url: i.videoUrl, video_duration: vd, reference_urls: i.images } };
|
|
2447
|
+
case "kling-4-0":
|
|
2448
|
+
return {
|
|
2449
|
+
body: {
|
|
2450
|
+
prompt: /@video\s*1/i.test(prompt) ? prompt : `Edit @Video1: ${prompt}`,
|
|
2451
|
+
video: i.videoUrl,
|
|
2452
|
+
reference_images: i.images,
|
|
2453
|
+
duration: clamp(Math.ceil(vd), 3, 30),
|
|
2454
|
+
resolution: "1080p"
|
|
2455
|
+
}
|
|
2456
|
+
};
|
|
2457
|
+
case "minimax-h3-turbo":
|
|
2458
|
+
return {
|
|
2459
|
+
body: {
|
|
2460
|
+
prompt: `Recreate <Video 1> exactly: the same people, the same motion and timing, the same camera move and framing, with one change: ${prompt}`,
|
|
2461
|
+
reference_videos: [i.videoUrl],
|
|
2462
|
+
reference_video_audio: true,
|
|
2463
|
+
resolution: "720p",
|
|
2464
|
+
duration: clamp(Math.ceil(vd ?? 5), 5, 15)
|
|
2465
|
+
},
|
|
2466
|
+
note: droppedImages
|
|
2467
|
+
};
|
|
2445
2468
|
default:
|
|
2446
2469
|
return { body: { prompt, video_url: i.videoUrl, video_duration: vd, image_urls: i.images } };
|
|
2447
2470
|
}
|
|
@@ -2570,6 +2593,8 @@ var init_video = __esm({
|
|
|
2570
2593
|
"seedance-2-5-video-edit",
|
|
2571
2594
|
"flux-video-edit",
|
|
2572
2595
|
"kling-video-edit",
|
|
2596
|
+
"kling-4-0",
|
|
2597
|
+
"minimax-h3-turbo",
|
|
2573
2598
|
"wan-video-edit",
|
|
2574
2599
|
"seedance-video-edit",
|
|
2575
2600
|
"happyhorse-1.0-video-edit",
|
|
@@ -2589,9 +2614,10 @@ var init_video = __esm({
|
|
|
2589
2614
|
"happyhorse-1.0-video-edit",
|
|
2590
2615
|
"xai-video-edit",
|
|
2591
2616
|
"kling-motion-control",
|
|
2592
|
-
"wan-video-character-swap"
|
|
2617
|
+
"wan-video-character-swap",
|
|
2618
|
+
"kling-4-0"
|
|
2593
2619
|
]);
|
|
2594
|
-
NO_IMAGE_ENGINES = /* @__PURE__ */ new Set(["flux-video-edit", "xai-video-edit"]);
|
|
2620
|
+
NO_IMAGE_ENGINES = /* @__PURE__ */ new Set(["flux-video-edit", "xai-video-edit", "minimax-h3-turbo"]);
|
|
2595
2621
|
InputSchema11 = z.object({
|
|
2596
2622
|
verb: z.enum(VERBS),
|
|
2597
2623
|
prompt: z.string().max(8e3).optional(),
|
|
@@ -2946,6 +2972,14 @@ function describeDrama(v, o = DRAMA_OPTS) {
|
|
|
2946
2972
|
text: [`Planned (${o.idField}: ${id}), ${v.format === "9:16" ? "vertical 9:16" : "widescreen 16:9"} (to switch, create it again in the other format before producing):`, v.plan ?? "", "", `Nothing has been charged yet. ${cost} Show this to the user and, once they agree, call ${next2("produce")}. (In Sensei: put it in pixeldojo_plan as ONE step with skill "${music ? "music_video" : "drama"}" and params {"${o.idField}": "${id}"}, which prices it from this quote.)`].join("\n")
|
|
2947
2973
|
};
|
|
2948
2974
|
}
|
|
2975
|
+
const gist = (note) => {
|
|
2976
|
+
const first = note.split(/(?<=\.) /)[0];
|
|
2977
|
+
return first.length > 160 ? `${first.slice(0, 157).trimEnd()}...` : first;
|
|
2978
|
+
};
|
|
2979
|
+
const rewrites = (b) => {
|
|
2980
|
+
const shots2 = Array.from(new Set(Array.from((b.redo_films ?? "").matchAll(/Shot (\d+) \(/g), (m) => m[1])));
|
|
2981
|
+
return shots2.length ? ` (the redo rewrites shot${shots2.length > 1 ? "s" : ""} ${shots2.join(", ")})` : "";
|
|
2982
|
+
};
|
|
2949
2983
|
if (v.status === "notes") {
|
|
2950
2984
|
const flagged = v.beats.filter((b) => b.note && (b.needs_redo ?? true));
|
|
2951
2985
|
const other = v.beats.filter((b) => b.note && b.needs_redo === false);
|
|
@@ -2953,17 +2987,17 @@ function describeDrama(v, o = DRAMA_OPTS) {
|
|
|
2953
2987
|
kind: "text",
|
|
2954
2988
|
text: [
|
|
2955
2989
|
`Every ${o.unit} is filmed. Before the cut, the review flagged ${o.unit}s ${flagged.map((b) => b.beat).join(", ")}:`,
|
|
2956
|
-
...flagged.map((b) => `- ${o.unit} ${b.beat}: ${b.note}${b
|
|
2957
|
-
other.length ? `Also noted, no redo needed: ${other.map((b) => `${o.unit} ${b.beat}: ${b.note}`).join(" ")}` : "",
|
|
2990
|
+
...flagged.map((b) => `- ${o.unit} ${b.beat}: ${gist(b.note)}${rewrites(b)}`),
|
|
2991
|
+
other.length ? `Also noted, no redo needed: ${other.map((b) => `${o.unit} ${b.beat}: ${gist(b.note)}`).join(" ")}` : "",
|
|
2958
2992
|
simplify,
|
|
2959
|
-
`Show these to the user and ask which they want: redo those ${o.unit}s with
|
|
2993
|
+
`Show these to the user and ask which they want: redo those ${o.unit}s with the review's fixes (${o.tool} with {"${o.idField}": "${id}", "action": "redo", "beats": [${flagged.map((b) => b.beat).join(", ")}]}, no notes needed, each at its own price; add notes only for the user's own changes), or cut it as it is (action "cut", free). Nothing more is filmed until they choose.`
|
|
2960
2994
|
].filter(Boolean).join("\n")
|
|
2961
2995
|
};
|
|
2962
2996
|
}
|
|
2963
2997
|
if (v.status === "done" && v.final_url) {
|
|
2964
2998
|
const redo = v.beats.filter((b) => (b.note || b.missing_lines.length) && (b.needs_redo ?? true));
|
|
2965
|
-
const notes = redo.map((b) => `${o.unit} ${b.beat}: ${b.note
|
|
2966
|
-
const other = v.beats.filter((b) => b.note && b.needs_redo === false).map((b) => `${o.unit} ${b.beat}: ${b.note}`);
|
|
2999
|
+
const notes = redo.map((b) => `${o.unit} ${b.beat}: ${b.note ? gist(b.note) : `did not say ${b.missing_lines.map((l) => `"${l}"`).join(", ")}`}`);
|
|
3000
|
+
const other = v.beats.filter((b) => b.note && b.needs_redo === false).map((b) => `${o.unit} ${b.beat}: ${gist(b.note)}`);
|
|
2967
3001
|
return {
|
|
2968
3002
|
kind: "assets",
|
|
2969
3003
|
text: [
|
|
@@ -2979,7 +3013,7 @@ function describeDrama(v, o = DRAMA_OPTS) {
|
|
|
2979
3013
|
const doing = music ? { scripting: "listening to the song and writing the plan", shots: "filming the sections", cutting: "cutting it to the song" }[v.status] ?? STEP[v.status] ?? v.status : STEP[v.status] ?? v.status;
|
|
2980
3014
|
const ready = v.beats.filter((b) => b.url).length;
|
|
2981
3015
|
const total = v.beats.length || (music ? v.sections?.length ?? 0 : 5);
|
|
2982
|
-
const again = v.rendering.map((n) => v.beats.find((b) => b.beat === n)).filter((b) => Boolean(b?.url)).map((b) => `${o.unit} ${b.beat} is being filmed again${b.missing_lines.length ? ` (it dropped the line "${b.missing_lines[0]}")` : b.note ? ` (the review asked: ${b.note
|
|
3016
|
+
const again = v.rendering.map((n) => v.beats.find((b) => b.beat === n)).filter((b) => Boolean(b?.url)).map((b) => `${o.unit} ${b.beat} is being filmed again${b.filming_note ? ` (your note: ${gist(b.filming_note)})` : b.missing_lines.length ? ` (it dropped the line "${b.missing_lines[0]}")` : b.note ? ` (the review asked: ${gist(b.note)})` : ""}`);
|
|
2983
3017
|
return {
|
|
2984
3018
|
kind: "text",
|
|
2985
3019
|
text: `Still ${doing}${v.status === "shots" ? ` (${ready} of ${total} ${o.unit}s ready${v.rendering.length ? `, filming ${o.unit} ${v.rendering.join(", ")}` : ""})` : ""}.${again.length ? ` ${again.join("; ")}.` : ""} It takes about 10 to 15 minutes in all. Call ${next2("status")} in about a minute.`,
|
|
@@ -3331,7 +3365,7 @@ var init_kata = __esm({
|
|
|
3331
3365
|
},
|
|
3332
3366
|
photos: {
|
|
3333
3367
|
type: "array",
|
|
3334
|
-
items: { type: "object", properties: { url: { type: "string" }, note: { type: "string", description: 'What it is (e.g. "the product").' } }, required: ["url"] },
|
|
3368
|
+
items: { type: "object", properties: { url: { type: "string", description: "Public URL of the photo." }, note: { type: "string", description: 'What it is (e.g. "the product").' } }, required: ["url"] },
|
|
3335
3369
|
description: "Create: up to 4 products or photos to put in the edit, on the PixelDojo CDN."
|
|
3336
3370
|
},
|
|
3337
3371
|
instructions: { type: "string", description: "Create (optional): what to change, e.g. the setting, the words on screen, where the product goes." },
|
|
@@ -4422,11 +4456,11 @@ var init_marketing = __esm({
|
|
|
4422
4456
|
action: { type: "string", enum: ["get", "import", "update"], description: "Default get." },
|
|
4423
4457
|
url: { type: "string", description: "import: the brand website, e.g. yourbrand.com." },
|
|
4424
4458
|
save: { type: "boolean", description: "import: false returns the kit without saving it. Default true." },
|
|
4425
|
-
name: { type: "string" },
|
|
4426
|
-
tagline: { type: "string" },
|
|
4459
|
+
name: { type: "string", description: "Brand name." },
|
|
4460
|
+
tagline: { type: "string", description: "Short brand tagline." },
|
|
4427
4461
|
voice: { type: "string", description: "How the brand talks, one or two sentences." },
|
|
4428
4462
|
colors: { type: "array", items: { type: "string" }, maxItems: 5, description: "#RRGGBB, lead color first." },
|
|
4429
|
-
fonts: { type: "array", items: { type: "string" }, maxItems: 2 },
|
|
4463
|
+
fonts: { type: "array", items: { type: "string" }, maxItems: 2, description: "Up to two brand font names." },
|
|
4430
4464
|
selling_points: { type: "array", items: { type: "string" }, maxItems: 5, description: "Short product claims, 2-7 words each." },
|
|
4431
4465
|
logo_url: { type: "string", format: "uri", description: "A logo on PixelDojo (upload it first); PNG with transparency is best." }
|
|
4432
4466
|
}
|
|
@@ -4479,8 +4513,8 @@ var init_marketing = __esm({
|
|
|
4479
4513
|
description: `image: an image template id from templates (e.g. stacked-shout, pure-white, ice-float). motion: ${MOTION.join(", ")}.`
|
|
4480
4514
|
},
|
|
4481
4515
|
product_url: { type: "string", format: "uri", description: "image: product page; name, description and photos are read from it." },
|
|
4482
|
-
product_name: { type: "string" },
|
|
4483
|
-
product_description: { type: "string" },
|
|
4516
|
+
product_name: { type: "string", description: "Product name when there is no product_url (with product_image_urls)." },
|
|
4517
|
+
product_description: { type: "string", description: "Short product description when there is no product_url." },
|
|
4484
4518
|
product_image_urls: { type: "array", items: { type: "string", format: "uri" }, maxItems: 5, description: "Product photos. motion uses the first, cut out automatically." },
|
|
4485
4519
|
product_image_paths: { type: "array", items: { type: "string" }, maxItems: 5, description: "Local product photos instead of URLs; uploaded first." },
|
|
4486
4520
|
character_image_urls: { type: "array", items: { type: "string", format: "uri" }, maxItems: 2, description: "image: your own character (e.g. from pixeldojo_library source characters) for templates with a person." },
|
|
@@ -5117,7 +5151,7 @@ function makeRedactedLogger(target = console) {
|
|
|
5117
5151
|
}
|
|
5118
5152
|
|
|
5119
5153
|
// src/server.ts
|
|
5120
|
-
var PACKAGE_VERSION = "0.
|
|
5154
|
+
var PACKAGE_VERSION = "0.31.0" ;
|
|
5121
5155
|
var SERVER_INSTRUCTIONS = "Pixel Dojo generates images, video, audio and short films from one catalog of AI models, billed in credits from the connected Pixel Dojo account. A job that runs past the 30-second wait returns a jobId to check later; check it rather than submitting again, since every new submission is charged. Generated asset URLs are deleted one hour after they are created: pixeldojo_save keeps one in the user's My Media permanently (after a safety check), and finished films stay in the account library. In any prompt, @Name uses a character, product, outfit, location, prop or style the user saved in Character Studio: its photos are attached automatically. pixeldojo_library source=characters lists them, and pixeldojo_save_character saves a new one from 3 to 5 photos.";
|
|
5122
5156
|
function buildServer(options) {
|
|
5123
5157
|
if (!options.apiKey) {
|