@pixeldojo/mcp 0.22.0 → 0.24.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/README.md CHANGED
@@ -55,7 +55,7 @@ Restart your agent. You'll see 23 new tools.
55
55
  | `pixeldojo_episode` | Faceless Studio: a narrated faceless video episode from a topic (script, scenes, voice, music, export). |
56
56
  | `pixeldojo_ad` | Marketing Studio: a product video ad from a URL or product images. |
57
57
  | `pixeldojo_upscale` | Enhance any image (up to 16×) or video (up to 4K). |
58
- | `pixeldojo_overlay` | Offer callout ("50% OFF" badge that pops in on cue) and a branded end card with logo, headline, button and web address. Exact text, your brand color. |
58
+ | `pixeldojo_overlay` | Ad text layouts on a video: hook title, lower-third callout, review card, progress bar, countdown timer, price tag, offer badge and a branded end card with logo. Exact text, your brand color, clear of the platform UI. |
59
59
  | `pixeldojo_caption` | Animated word-by-word captions on a video with speech, placed clear of the TikTok/Reels/Shorts buttons. Pop, Highlighter or Clean, any highlight color. |
60
60
  | `pixeldojo_audio` | Full audio scenes: dialogue + effects + music in one clip (Seed Audio 1.0). Reference clips are hosted URLs; local audio files are not accepted. |
61
61
  | `pixeldojo_library` | Search your media library: saved Library items + recent generations. |
package/dist/cli.cjs CHANGED
@@ -1311,14 +1311,45 @@ var init_caption = __esm({
1311
1311
  }
1312
1312
  });
1313
1313
  async function run7(input, ctx) {
1314
- if (!input.offer && !input.end_card) {
1315
- return { kind: "text", text: "pixeldojo_overlay needs an offer, an end_card, or both." };
1314
+ const { hook, callout, review, countdown, price_tag: price, offer, end_card: card } = input;
1315
+ if (!hook && !callout && !review && !input.progress_bar && !countdown && !price && !offer && !card) {
1316
+ return {
1317
+ kind: "text",
1318
+ text: "pixeldojo_overlay needs at least one of hook, callout, review, progress_bar, countdown, price_tag, offer or end_card."
1319
+ };
1316
1320
  }
1317
- const { offer, end_card: card } = input;
1318
1321
  const submitted = await ctx.client.run(MODEL2, {
1319
1322
  prompt: "",
1320
1323
  video: input.video_url,
1321
1324
  ...input.color ? { color: input.color } : {},
1325
+ ...hook ? { hook_text: hook.text, hook_duration: hook.duration_sec } : {},
1326
+ ...callout ? {
1327
+ callout_title: callout.title,
1328
+ callout_subtitle: callout.subtitle,
1329
+ callout_start: callout.start_sec,
1330
+ callout_duration: callout.duration_sec
1331
+ } : {},
1332
+ ...review ? {
1333
+ review_quote: review.quote,
1334
+ review_name: review.name,
1335
+ review_stars: review.stars,
1336
+ review_start: review.start_sec,
1337
+ review_duration: review.duration_sec
1338
+ } : {},
1339
+ ...input.progress_bar ? { progress_bar: true } : {},
1340
+ ...countdown ? {
1341
+ countdown_from: countdown.from,
1342
+ countdown_label: countdown.label,
1343
+ countdown_start: countdown.start_sec,
1344
+ countdown_duration: countdown.duration_sec
1345
+ } : {},
1346
+ ...price ? {
1347
+ price_now: price.now,
1348
+ price_was: price.was,
1349
+ price_label: price.label,
1350
+ price_start: price.start_sec,
1351
+ price_duration: price.duration_sec
1352
+ } : {},
1322
1353
  ...offer ? {
1323
1354
  offer_text: offer.text,
1324
1355
  offer_subtext: offer.subtext,
@@ -1354,6 +1385,34 @@ var init_overlay = __esm({
1354
1385
  InputSchema7 = zod.z.object({
1355
1386
  video_url: zod.z.string().url(),
1356
1387
  color: zod.z.string().optional(),
1388
+ hook: zod.z.object({ text: zod.z.string().max(60), duration_sec: zod.z.number().min(1).max(6).optional() }).optional(),
1389
+ callout: zod.z.object({
1390
+ title: zod.z.string().max(32),
1391
+ subtitle: zod.z.string().max(40).optional(),
1392
+ start_sec: zod.z.number().min(0).optional(),
1393
+ duration_sec: zod.z.number().min(1).max(10).optional()
1394
+ }).optional(),
1395
+ review: zod.z.object({
1396
+ quote: zod.z.string().max(90),
1397
+ name: zod.z.string().max(30).optional(),
1398
+ stars: zod.z.number().int().min(1).max(5).optional(),
1399
+ start_sec: zod.z.number().min(0).optional(),
1400
+ duration_sec: zod.z.number().min(1).max(10).optional()
1401
+ }).optional(),
1402
+ progress_bar: zod.z.boolean().optional(),
1403
+ countdown: zod.z.object({
1404
+ from: zod.z.string(),
1405
+ label: zod.z.string().max(16).optional(),
1406
+ start_sec: zod.z.number().min(0).optional(),
1407
+ duration_sec: zod.z.number().min(1).max(10).optional()
1408
+ }).optional(),
1409
+ price_tag: zod.z.object({
1410
+ now: zod.z.string().max(12),
1411
+ was: zod.z.string().max(12).optional(),
1412
+ label: zod.z.string().max(16).optional(),
1413
+ start_sec: zod.z.number().min(0).optional(),
1414
+ duration_sec: zod.z.number().min(1).max(10).optional()
1415
+ }).optional(),
1357
1416
  offer: zod.z.object({
1358
1417
  text: zod.z.string().max(24),
1359
1418
  subtext: zod.z.string().max(40).optional(),
@@ -1375,9 +1434,65 @@ var init_overlay = __esm({
1375
1434
  properties: {
1376
1435
  video_url: { type: "string", format: "uri", description: "The video to brand (MP4 or MOV)." },
1377
1436
  color: { type: "string", description: "Brand color as #RRGGBB: the badge and the button. Defaults to #FFE500." },
1437
+ hook: {
1438
+ type: "object",
1439
+ description: "Hook title over the first seconds, the overlay that decides whether people keep watching. 5-8 words.",
1440
+ required: ["text"],
1441
+ properties: {
1442
+ text: { type: "string", maxLength: 60, description: 'e.g. "Octopuses have THREE hearts?".' },
1443
+ duration_sec: { type: "number", minimum: 1, maximum: 6, description: "Default 2.5." }
1444
+ }
1445
+ },
1446
+ callout: {
1447
+ type: "object",
1448
+ description: 'Lower-third label that slides in from the left: a benefit ("Ships in 24h") or a name and title.',
1449
+ required: ["title"],
1450
+ properties: {
1451
+ title: { type: "string", maxLength: 32, description: "The label." },
1452
+ subtitle: { type: "string", maxLength: 40, description: "Optional second line." },
1453
+ start_sec: { type: "number", description: "Default 3." },
1454
+ duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Default 4." }
1455
+ }
1456
+ },
1457
+ review: {
1458
+ type: "object",
1459
+ description: "Review card: stars, a short quote and a name.",
1460
+ required: ["quote"],
1461
+ properties: {
1462
+ quote: { type: "string", maxLength: 90, description: "The review text, without quote marks." },
1463
+ name: { type: "string", maxLength: 30, description: 'e.g. "Jess, verified buyer".' },
1464
+ stars: { type: "integer", minimum: 1, maximum: 5, description: "Default 5." },
1465
+ start_sec: { type: "number", description: "Default just after the hook." },
1466
+ duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Default 4." }
1467
+ }
1468
+ },
1469
+ progress_bar: { type: "boolean", description: "A thin bar in the brand color across the top that fills as the video plays." },
1470
+ countdown: {
1471
+ type: "object",
1472
+ description: "Urgency timer under the offer badge; the digits tick down each second.",
1473
+ required: ["from"],
1474
+ properties: {
1475
+ from: { type: "string", description: 'Start time, "23:59:59" or "04:59".' },
1476
+ label: { type: "string", maxLength: 16, description: 'Words above the timer. Default "Ends in".' },
1477
+ start_sec: { type: "number", description: "Default just after the hook." },
1478
+ duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Default 4." }
1479
+ }
1480
+ },
1481
+ price_tag: {
1482
+ type: "object",
1483
+ description: "Tilted sticker on the left: new price big, old price struck through.",
1484
+ required: ["now"],
1485
+ properties: {
1486
+ now: { type: "string", maxLength: 12, description: 'e.g. "$49".' },
1487
+ was: { type: "string", maxLength: 12, description: 'Old price, struck through, e.g. "$79".' },
1488
+ label: { type: "string", maxLength: 16, description: 'e.g. "Today only".' },
1489
+ start_sec: { type: "number", description: "Default just after the hook." },
1490
+ duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Default 4." }
1491
+ }
1492
+ },
1378
1493
  offer: {
1379
1494
  type: "object",
1380
- description: "Offer callout: a badge that pops in on cue.",
1495
+ description: "Offer callout: a badge that pops in on cue (after the hook when there is one).",
1381
1496
  required: ["text"],
1382
1497
  properties: {
1383
1498
  text: { type: "string", maxLength: 24, description: 'e.g. "50% OFF".' },
@@ -1403,7 +1518,7 @@ var init_overlay = __esm({
1403
1518
  };
1404
1519
  overlaySkill = {
1405
1520
  name: "pixeldojo_overlay",
1406
- description: 'Add an offer callout (a badge like "50% OFF" that pops in on cue) and/or a branded end card (the last frame held under a logo, headline, button and web address) to a video. The text renders exactly as written, in the brand color. Pass video_url plus offer and/or end_card. 2 credits.',
1521
+ description: 'Add short-form ad text layouts to a finished video, exact text in the brand color, clear of the TikTok/Reels/Shorts UI: hook (title over the first seconds), callout (lower-third label), review (stars, quote, name), progress_bar, countdown (ticking timer), price_tag (new price, old one struck through), offer ("50% OFF" badge) and end_card (logo, headline, button, web address over the held last frame). Pass video_url plus any of them; one call does all. 2 credits.',
1407
1522
  inputZod: InputSchema7,
1408
1523
  inputJsonSchema: InputJsonSchema7,
1409
1524
  allowedModels: [MODEL2],
@@ -3892,7 +4007,7 @@ function makeRedactedLogger(target = console) {
3892
4007
  }
3893
4008
 
3894
4009
  // src/server.ts
3895
- var PACKAGE_VERSION = "0.22.0" ;
4010
+ var PACKAGE_VERSION = "0.24.0" ;
3896
4011
  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.";
3897
4012
  function buildServer(options) {
3898
4013
  if (!options.apiKey) {