@productmaker/mcp 11.5.0 → 11.5.1

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
@@ -303,6 +303,11 @@ The `base64` field was removed. MCP JSON-RPC transports truncate large tool argu
303
303
 
304
304
  ## Version history
305
305
 
306
+ ### 11.5.1 — Copy junto a cada pieza de servicios
307
+
308
+ Los resultados de videos e imágenes de servicios incluyen texto para publicar
309
+ junto a cada pieza. Los formatos y controles de generación existentes se conservan.
310
+
306
311
  ### 11.5.0 — El WhatsApp de la marca
307
312
 
308
313
  - `create_brand` `status`/`list`: el resumen de la marca incluye `whatsapp` (E.164) cuando el negocio lo dio en la marca o el análisis lo encontró en su página. Una landing creada desde esa marca ya empieza con ese WhatsApp como canal de contacto: el modelo no debe volver a pedirlo.
package/dist/http.js CHANGED
@@ -5351,9 +5351,20 @@ var AdCreative = z23.object({
5351
5351
  /** One-to-one with `variants`: null for ProductMaker-original images and the
5352
5352
  * evidence tier for the competitor-reference variant. */
5353
5353
  variantSignals: z23.array(ImageWinnerSignal.nullable()).optional(),
5354
+ /** Caption for each delivered service image, aligned with variants. */
5355
+ adCopies: z23.array(z23.string().trim().min(1)).optional(),
5354
5356
  createdAt: z23.string().datetime().optional(),
5355
5357
  adCopy: z23.string().optional()
5356
5358
  }).superRefine((creative, ctx) => {
5359
+ if (creative.adCopies !== void 0 && creative.adCopies.length !== creative.variants?.length) {
5360
+ ctx.addIssue({
5361
+ code: z23.ZodIssueCode.custom,
5362
+ path: [
5363
+ "adCopies"
5364
+ ],
5365
+ message: "adCopies must align one-to-one with variants"
5366
+ });
5367
+ }
5357
5368
  if (creative.variantSignals !== void 0 && (creative.variants === void 0 || creative.variantSignals.length !== creative.variants.length)) {
5358
5369
  ctx.addIssue({
5359
5370
  code: z23.ZodIssueCode.custom,
@@ -5375,6 +5386,7 @@ var ImageCreativeCopy = z23.object({
5375
5386
  }).partial();
5376
5387
  var ImageCreativeVariant = z23.object({
5377
5388
  id: z23.string(),
5389
+ adCopy: z23.string().optional(),
5378
5390
  url: z23.string().url(),
5379
5391
  downloadUrl: z23.string().url().optional()
5380
5392
  });
@@ -18981,7 +18993,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
18981
18993
  ], [
18982
18994
  "service_landing"
18983
18995
  ], MCP_ONLY_CHANNEL_EXPOSURE),
18984
- defineCapability("create_service_images", "1df35139abd6b04c5ebcdd5945154555a3f0d0e49b61f7d70c98cc5dad1e1347", "credit_consuming", "creative", [
18996
+ defineCapability("create_service_images", "c36653d6744c38aa43cd7ddad34481526651a09590de5bb62d1061e39dd537c3", "credit_consuming", "creative", [
18985
18997
  "credit_consuming",
18986
18998
  "state_change"
18987
18999
  ], [
@@ -24146,7 +24158,7 @@ var ApiClient = class {
24146
24158
  };
24147
24159
 
24148
24160
  // src/index.ts
24149
- var MCP_VERSION = "11.5.0";
24161
+ var MCP_VERSION = "11.5.1";
24150
24162
 
24151
24163
  // src/meta-upload-app.ts
24152
24164
  import { readFileSync } from "fs";
@@ -25873,9 +25885,13 @@ async function fetchTaskOutputs(api, taskId, options) {
25873
25885
  const variants = raw.adCreative?.variants ?? [];
25874
25886
  const hasVariants = variants.some((v) => typeof v === "string");
25875
25887
  if (hasVariants) {
25876
- for (const variant of variants) {
25888
+ for (const [index, variant] of variants.entries()) {
25889
+ const adCopy = raw.adCreative?.adCopies?.[index];
25877
25890
  if (typeof variant === "string") images.push({
25878
- url: variant
25891
+ url: variant,
25892
+ ...adCopy ? {
25893
+ adCopy
25894
+ } : {}
25879
25895
  });
25880
25896
  }
25881
25897
  } else if (raw.adCreative?.url) {
@@ -25914,6 +25930,7 @@ function renderOutputsMarkdown(outputs) {
25914
25930
  outputs.images.forEach((img, i) => {
25915
25931
  parts.push(`![v${i}](${img.url})`);
25916
25932
  parts.push(`[\u2B07 Descargar v${i}](${img.url})`);
25933
+ if (img.adCopy) parts.push(`Copy: ${img.adCopy}`);
25917
25934
  });
25918
25935
  }
25919
25936
  if (outputs.adCopy) {
@@ -26844,6 +26861,8 @@ var AnimatedVideoResultSchema = z114.object({
26844
26861
  ]),
26845
26862
  serviceMode: z114.literal("motion_graphics"),
26846
26863
  finalMp4Url: z114.string().optional(),
26864
+ adCopy: z114.string().optional(),
26865
+ adCopies: z114.array(z114.string()).optional(),
26847
26866
  error: z114.string().optional(),
26848
26867
  motionGraphics: z114.object({
26849
26868
  stage: MotionGraphicsStageSchema,
@@ -26956,10 +26975,14 @@ function renderAnimatedVideoStatus(result) {
26956
26975
  const label = variantUrls.length > 0 ? "Gancho 1" : "Video final";
26957
26976
  lines.push(`${label} (MP4): ${result.finalMp4Url}`);
26958
26977
  lines.push(`[Descargar ${label.toLowerCase()}](${result.finalMp4Url})`);
26978
+ const copy = result.adCopies?.[0] || result.adCopy;
26979
+ if (copy) lines.push(`Copy: ${copy}`);
26959
26980
  }
26960
26981
  variantUrls.forEach((url, index) => {
26961
26982
  lines.push(`Gancho ${index + 2} (MP4): ${url}`);
26962
26983
  lines.push(`[Descargar gancho ${index + 2}](${url})`);
26984
+ const copy = result.adCopies?.[index + 1] || result.adCopy;
26985
+ if (copy) lines.push(`Copy: ${copy}`);
26963
26986
  });
26964
26987
  const delivered = (result.finalMp4Url ? 1 : 0) + variantUrls.length;
26965
26988
  if (orderedHooks > delivered) {
@@ -29110,7 +29133,7 @@ var CreateServiceImagesInput = z119.object({
29110
29133
  "en",
29111
29134
  "pt"
29112
29135
  ]).optional().describe("Idioma de los textos de la imagen (por defecto es)."),
29113
- adCopy: z119.boolean().optional().describe("Opcional. true agrega textos para el anuncio (titular y descripci\xF3n). Por defecto false."),
29136
+ adCopy: z119.boolean().optional().describe("Compatibilidad con clientes anteriores: el copy para publicar siempre est\xE1 incluido en cada imagen de servicios."),
29114
29137
  confirmed: z119.boolean().optional().describe("Solo true despu\xE9s de mostrar el precio y que el usuario acepte. Sin confirmed, solo cotiza y no cobra.")
29115
29138
  }).strict();
29116
29139
  function serviceImageModel(quality) {
@@ -29144,7 +29167,7 @@ function registerServiceImageTools(server, api, options = {}) {
29144
29167
  throw mcp(McpErrorCode.INVALID_INPUT, `${tierError} Usa quality="standard" o otro formato. No se cobr\xF3 nada.`);
29145
29168
  }
29146
29169
  const language = LANGUAGE_TAGS[input.language ?? "es"];
29147
- const adCopy = input.adCopy ?? false;
29170
+ const adCopy = true;
29148
29171
  const estimate = await api.postJson("/v1/billing/estimate", {
29149
29172
  type: "image-creative",
29150
29173
  options: {
package/dist/stdio.js CHANGED
@@ -5373,9 +5373,20 @@ var AdCreative = z23.object({
5373
5373
  /** One-to-one with `variants`: null for ProductMaker-original images and the
5374
5374
  * evidence tier for the competitor-reference variant. */
5375
5375
  variantSignals: z23.array(ImageWinnerSignal.nullable()).optional(),
5376
+ /** Caption for each delivered service image, aligned with variants. */
5377
+ adCopies: z23.array(z23.string().trim().min(1)).optional(),
5376
5378
  createdAt: z23.string().datetime().optional(),
5377
5379
  adCopy: z23.string().optional()
5378
5380
  }).superRefine((creative, ctx) => {
5381
+ if (creative.adCopies !== void 0 && creative.adCopies.length !== creative.variants?.length) {
5382
+ ctx.addIssue({
5383
+ code: z23.ZodIssueCode.custom,
5384
+ path: [
5385
+ "adCopies"
5386
+ ],
5387
+ message: "adCopies must align one-to-one with variants"
5388
+ });
5389
+ }
5379
5390
  if (creative.variantSignals !== void 0 && (creative.variants === void 0 || creative.variantSignals.length !== creative.variants.length)) {
5380
5391
  ctx.addIssue({
5381
5392
  code: z23.ZodIssueCode.custom,
@@ -5397,6 +5408,7 @@ var ImageCreativeCopy = z23.object({
5397
5408
  }).partial();
5398
5409
  var ImageCreativeVariant = z23.object({
5399
5410
  id: z23.string(),
5411
+ adCopy: z23.string().optional(),
5400
5412
  url: z23.string().url(),
5401
5413
  downloadUrl: z23.string().url().optional()
5402
5414
  });
@@ -19003,7 +19015,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
19003
19015
  ], [
19004
19016
  "service_landing"
19005
19017
  ], MCP_ONLY_CHANNEL_EXPOSURE),
19006
- defineCapability("create_service_images", "1df35139abd6b04c5ebcdd5945154555a3f0d0e49b61f7d70c98cc5dad1e1347", "credit_consuming", "creative", [
19018
+ defineCapability("create_service_images", "c36653d6744c38aa43cd7ddad34481526651a09590de5bb62d1061e39dd537c3", "credit_consuming", "creative", [
19007
19019
  "credit_consuming",
19008
19020
  "state_change"
19009
19021
  ], [
@@ -22475,7 +22487,7 @@ var ApiClient = class {
22475
22487
  };
22476
22488
 
22477
22489
  // src/index.ts
22478
- var MCP_VERSION = "11.5.0";
22490
+ var MCP_VERSION = "11.5.1";
22479
22491
 
22480
22492
  // src/meta-upload-app.ts
22481
22493
  import { readFileSync } from "fs";
@@ -24255,9 +24267,13 @@ async function fetchTaskOutputs(api, taskId, options) {
24255
24267
  const variants = raw.adCreative?.variants ?? [];
24256
24268
  const hasVariants = variants.some((v) => typeof v === "string");
24257
24269
  if (hasVariants) {
24258
- for (const variant of variants) {
24270
+ for (const [index, variant] of variants.entries()) {
24271
+ const adCopy = raw.adCreative?.adCopies?.[index];
24259
24272
  if (typeof variant === "string") images.push({
24260
- url: variant
24273
+ url: variant,
24274
+ ...adCopy ? {
24275
+ adCopy
24276
+ } : {}
24261
24277
  });
24262
24278
  }
24263
24279
  } else if (raw.adCreative?.url) {
@@ -24296,6 +24312,7 @@ function renderOutputsMarkdown(outputs) {
24296
24312
  outputs.images.forEach((img, i) => {
24297
24313
  parts.push(`![v${i}](${img.url})`);
24298
24314
  parts.push(`[\u2B07 Descargar v${i}](${img.url})`);
24315
+ if (img.adCopy) parts.push(`Copy: ${img.adCopy}`);
24299
24316
  });
24300
24317
  }
24301
24318
  if (outputs.adCopy) {
@@ -25226,6 +25243,8 @@ var AnimatedVideoResultSchema = z113.object({
25226
25243
  ]),
25227
25244
  serviceMode: z113.literal("motion_graphics"),
25228
25245
  finalMp4Url: z113.string().optional(),
25246
+ adCopy: z113.string().optional(),
25247
+ adCopies: z113.array(z113.string()).optional(),
25229
25248
  error: z113.string().optional(),
25230
25249
  motionGraphics: z113.object({
25231
25250
  stage: MotionGraphicsStageSchema,
@@ -25338,10 +25357,14 @@ function renderAnimatedVideoStatus(result) {
25338
25357
  const label = variantUrls.length > 0 ? "Gancho 1" : "Video final";
25339
25358
  lines.push(`${label} (MP4): ${result.finalMp4Url}`);
25340
25359
  lines.push(`[Descargar ${label.toLowerCase()}](${result.finalMp4Url})`);
25360
+ const copy = result.adCopies?.[0] || result.adCopy;
25361
+ if (copy) lines.push(`Copy: ${copy}`);
25341
25362
  }
25342
25363
  variantUrls.forEach((url, index) => {
25343
25364
  lines.push(`Gancho ${index + 2} (MP4): ${url}`);
25344
25365
  lines.push(`[Descargar gancho ${index + 2}](${url})`);
25366
+ const copy = result.adCopies?.[index + 1] || result.adCopy;
25367
+ if (copy) lines.push(`Copy: ${copy}`);
25345
25368
  });
25346
25369
  const delivered = (result.finalMp4Url ? 1 : 0) + variantUrls.length;
25347
25370
  if (orderedHooks > delivered) {
@@ -27492,7 +27515,7 @@ var CreateServiceImagesInput = z118.object({
27492
27515
  "en",
27493
27516
  "pt"
27494
27517
  ]).optional().describe("Idioma de los textos de la imagen (por defecto es)."),
27495
- adCopy: z118.boolean().optional().describe("Opcional. true agrega textos para el anuncio (titular y descripci\xF3n). Por defecto false."),
27518
+ adCopy: z118.boolean().optional().describe("Compatibilidad con clientes anteriores: el copy para publicar siempre est\xE1 incluido en cada imagen de servicios."),
27496
27519
  confirmed: z118.boolean().optional().describe("Solo true despu\xE9s de mostrar el precio y que el usuario acepte. Sin confirmed, solo cotiza y no cobra.")
27497
27520
  }).strict();
27498
27521
  function serviceImageModel(quality) {
@@ -27526,7 +27549,7 @@ function registerServiceImageTools(server, api, options = {}) {
27526
27549
  throw mcp(McpErrorCode.INVALID_INPUT, `${tierError} Usa quality="standard" o otro formato. No se cobr\xF3 nada.`);
27527
27550
  }
27528
27551
  const language = LANGUAGE_TAGS[input.language ?? "es"];
27529
- const adCopy = input.adCopy ?? false;
27552
+ const adCopy = true;
27530
27553
  const estimate = await api.postJson("/v1/billing/estimate", {
27531
27554
  type: "image-creative",
27532
27555
  options: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "11.5.0",
3
+ "version": "11.5.1",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "ProductMaker MCP server — cost products, generate landing pages, UGC videos, and ad creatives, and publish to Shopify, Meta Ads, and TikTok Ads.",