@productmaker/mcp 11.5.0 → 11.5.2

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
  });
@@ -13263,9 +13275,16 @@ var MetaTrackingOwnerSchema = z66.enum([
13263
13275
  var MetaTrackingPixelSchema = z66.object({
13264
13276
  pixelId: z66.string().regex(/^[1-9]\d{0,31}$/),
13265
13277
  initiateCheckout: MetaTrackingOwnerSchema,
13266
- addToCart: MetaTrackingOwnerSchema
13278
+ addToCart: MetaTrackingOwnerSchema,
13279
+ /** Explicit adoption of an existing, server-verified manual installation. */
13280
+ bootstrap: z66.enum([
13281
+ "productmaker",
13282
+ "external"
13283
+ ]).optional(),
13284
+ pageView: MetaTrackingOwnerSchema.optional(),
13285
+ viewContent: MetaTrackingOwnerSchema.optional()
13267
13286
  }).strict();
13268
- var pixelsSchema = z66.array(MetaTrackingPixelSchema).max(20).superRefine((pixels, ctx) => {
13287
+ function validateMetaTrackingPixelCollection(pixels, ctx) {
13269
13288
  if (new Set(pixels.map((pixel) => pixel.pixelId)).size !== pixels.length) {
13270
13289
  ctx.addIssue({
13271
13290
  code: z66.ZodIssueCode.custom,
@@ -13278,12 +13297,29 @@ var pixelsSchema = z66.array(MetaTrackingPixelSchema).max(20).superRefine((pixel
13278
13297
  message: "Policy exceeds 8 KiB"
13279
13298
  });
13280
13299
  }
13281
- });
13300
+ }
13301
+ __name(validateMetaTrackingPixelCollection, "validateMetaTrackingPixelCollection");
13302
+ var pixelsSchema = z66.array(MetaTrackingPixelSchema).max(20).superRefine(validateMetaTrackingPixelCollection);
13282
13303
  var MetaTrackingPolicySchema = z66.object({
13283
13304
  schemaVersion: z66.literal(1),
13284
13305
  revision: z66.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
13285
13306
  pixels: pixelsSchema
13286
13307
  }).strict();
13308
+ var MetaTrackingPolicyV1PixelSchema = MetaTrackingPixelSchema.omit({
13309
+ bootstrap: true,
13310
+ pageView: true,
13311
+ viewContent: true
13312
+ });
13313
+ var MetaTrackingPolicyV1ProjectionSchema = z66.object({
13314
+ schemaVersion: z66.literal(1),
13315
+ revision: z66.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
13316
+ pixels: z66.array(MetaTrackingPolicyV1PixelSchema).max(20).superRefine(validateMetaTrackingPixelCollection)
13317
+ }).strict();
13318
+ var MetaTrackingPolicyV2Schema = z66.object({
13319
+ schemaVersion: z66.literal(2),
13320
+ revision: z66.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
13321
+ pixels: pixelsSchema
13322
+ }).strict();
13287
13323
  var MetaTrackingUpdateSchema = z66.object({
13288
13324
  pixels: pixelsSchema,
13289
13325
  expectedDigest: z66.string().min(1).max(256).nullable()
@@ -18981,7 +19017,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
18981
19017
  ], [
18982
19018
  "service_landing"
18983
19019
  ], MCP_ONLY_CHANNEL_EXPOSURE),
18984
- defineCapability("create_service_images", "1df35139abd6b04c5ebcdd5945154555a3f0d0e49b61f7d70c98cc5dad1e1347", "credit_consuming", "creative", [
19020
+ defineCapability("create_service_images", "c36653d6744c38aa43cd7ddad34481526651a09590de5bb62d1061e39dd537c3", "credit_consuming", "creative", [
18985
19021
  "credit_consuming",
18986
19022
  "state_change"
18987
19023
  ], [
@@ -22198,7 +22234,9 @@ var WebsiteCaptureResponseSchema = z109.object({
22198
22234
  var WebsiteCaptureJobSchema = WebsiteCaptureRequestSchema.extend({
22199
22235
  captureId: z109.string().uuid(),
22200
22236
  attempt: z109.number().int().positive(),
22201
- leaseUntil: z109.string().datetime()
22237
+ leaseUntil: z109.string().datetime(),
22238
+ /** Public profile document prepared by the API; never contains a provider credential. */
22239
+ socialProfileHtml: z109.string().max(2e5).optional()
22202
22240
  });
22203
22241
  var WebsiteCaptureClaimResponseSchema = z109.object({
22204
22242
  capture: WebsiteCaptureJobSchema.nullable()
@@ -24146,7 +24184,7 @@ var ApiClient = class {
24146
24184
  };
24147
24185
 
24148
24186
  // src/index.ts
24149
- var MCP_VERSION = "11.5.0";
24187
+ var MCP_VERSION = "11.5.2";
24150
24188
 
24151
24189
  // src/meta-upload-app.ts
24152
24190
  import { readFileSync } from "fs";
@@ -25873,9 +25911,13 @@ async function fetchTaskOutputs(api, taskId, options) {
25873
25911
  const variants = raw.adCreative?.variants ?? [];
25874
25912
  const hasVariants = variants.some((v) => typeof v === "string");
25875
25913
  if (hasVariants) {
25876
- for (const variant of variants) {
25914
+ for (const [index, variant] of variants.entries()) {
25915
+ const adCopy = raw.adCreative?.adCopies?.[index];
25877
25916
  if (typeof variant === "string") images.push({
25878
- url: variant
25917
+ url: variant,
25918
+ ...adCopy ? {
25919
+ adCopy
25920
+ } : {}
25879
25921
  });
25880
25922
  }
25881
25923
  } else if (raw.adCreative?.url) {
@@ -25914,6 +25956,7 @@ function renderOutputsMarkdown(outputs) {
25914
25956
  outputs.images.forEach((img, i) => {
25915
25957
  parts.push(`![v${i}](${img.url})`);
25916
25958
  parts.push(`[\u2B07 Descargar v${i}](${img.url})`);
25959
+ if (img.adCopy) parts.push(`Copy: ${img.adCopy}`);
25917
25960
  });
25918
25961
  }
25919
25962
  if (outputs.adCopy) {
@@ -26844,6 +26887,8 @@ var AnimatedVideoResultSchema = z114.object({
26844
26887
  ]),
26845
26888
  serviceMode: z114.literal("motion_graphics"),
26846
26889
  finalMp4Url: z114.string().optional(),
26890
+ adCopy: z114.string().optional(),
26891
+ adCopies: z114.array(z114.string()).optional(),
26847
26892
  error: z114.string().optional(),
26848
26893
  motionGraphics: z114.object({
26849
26894
  stage: MotionGraphicsStageSchema,
@@ -26956,10 +27001,14 @@ function renderAnimatedVideoStatus(result) {
26956
27001
  const label = variantUrls.length > 0 ? "Gancho 1" : "Video final";
26957
27002
  lines.push(`${label} (MP4): ${result.finalMp4Url}`);
26958
27003
  lines.push(`[Descargar ${label.toLowerCase()}](${result.finalMp4Url})`);
27004
+ const copy = result.adCopies?.[0] || result.adCopy;
27005
+ if (copy) lines.push(`Copy: ${copy}`);
26959
27006
  }
26960
27007
  variantUrls.forEach((url, index) => {
26961
27008
  lines.push(`Gancho ${index + 2} (MP4): ${url}`);
26962
27009
  lines.push(`[Descargar gancho ${index + 2}](${url})`);
27010
+ const copy = result.adCopies?.[index + 1] || result.adCopy;
27011
+ if (copy) lines.push(`Copy: ${copy}`);
26963
27012
  });
26964
27013
  const delivered = (result.finalMp4Url ? 1 : 0) + variantUrls.length;
26965
27014
  if (orderedHooks > delivered) {
@@ -29110,7 +29159,7 @@ var CreateServiceImagesInput = z119.object({
29110
29159
  "en",
29111
29160
  "pt"
29112
29161
  ]).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."),
29162
+ adCopy: z119.boolean().optional().describe("Compatibilidad con clientes anteriores: el copy para publicar siempre est\xE1 incluido en cada imagen de servicios."),
29114
29163
  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
29164
  }).strict();
29116
29165
  function serviceImageModel(quality) {
@@ -29144,7 +29193,7 @@ function registerServiceImageTools(server, api, options = {}) {
29144
29193
  throw mcp(McpErrorCode.INVALID_INPUT, `${tierError} Usa quality="standard" o otro formato. No se cobr\xF3 nada.`);
29145
29194
  }
29146
29195
  const language = LANGUAGE_TAGS[input.language ?? "es"];
29147
- const adCopy = input.adCopy ?? false;
29196
+ const adCopy = true;
29148
29197
  const estimate = await api.postJson("/v1/billing/estimate", {
29149
29198
  type: "image-creative",
29150
29199
  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
  });
@@ -13285,9 +13297,16 @@ var MetaTrackingOwnerSchema = z66.enum([
13285
13297
  var MetaTrackingPixelSchema = z66.object({
13286
13298
  pixelId: z66.string().regex(/^[1-9]\d{0,31}$/),
13287
13299
  initiateCheckout: MetaTrackingOwnerSchema,
13288
- addToCart: MetaTrackingOwnerSchema
13300
+ addToCart: MetaTrackingOwnerSchema,
13301
+ /** Explicit adoption of an existing, server-verified manual installation. */
13302
+ bootstrap: z66.enum([
13303
+ "productmaker",
13304
+ "external"
13305
+ ]).optional(),
13306
+ pageView: MetaTrackingOwnerSchema.optional(),
13307
+ viewContent: MetaTrackingOwnerSchema.optional()
13289
13308
  }).strict();
13290
- var pixelsSchema = z66.array(MetaTrackingPixelSchema).max(20).superRefine((pixels, ctx) => {
13309
+ function validateMetaTrackingPixelCollection(pixels, ctx) {
13291
13310
  if (new Set(pixels.map((pixel) => pixel.pixelId)).size !== pixels.length) {
13292
13311
  ctx.addIssue({
13293
13312
  code: z66.ZodIssueCode.custom,
@@ -13300,12 +13319,29 @@ var pixelsSchema = z66.array(MetaTrackingPixelSchema).max(20).superRefine((pixel
13300
13319
  message: "Policy exceeds 8 KiB"
13301
13320
  });
13302
13321
  }
13303
- });
13322
+ }
13323
+ __name(validateMetaTrackingPixelCollection, "validateMetaTrackingPixelCollection");
13324
+ var pixelsSchema = z66.array(MetaTrackingPixelSchema).max(20).superRefine(validateMetaTrackingPixelCollection);
13304
13325
  var MetaTrackingPolicySchema = z66.object({
13305
13326
  schemaVersion: z66.literal(1),
13306
13327
  revision: z66.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
13307
13328
  pixels: pixelsSchema
13308
13329
  }).strict();
13330
+ var MetaTrackingPolicyV1PixelSchema = MetaTrackingPixelSchema.omit({
13331
+ bootstrap: true,
13332
+ pageView: true,
13333
+ viewContent: true
13334
+ });
13335
+ var MetaTrackingPolicyV1ProjectionSchema = z66.object({
13336
+ schemaVersion: z66.literal(1),
13337
+ revision: z66.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
13338
+ pixels: z66.array(MetaTrackingPolicyV1PixelSchema).max(20).superRefine(validateMetaTrackingPixelCollection)
13339
+ }).strict();
13340
+ var MetaTrackingPolicyV2Schema = z66.object({
13341
+ schemaVersion: z66.literal(2),
13342
+ revision: z66.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
13343
+ pixels: pixelsSchema
13344
+ }).strict();
13309
13345
  var MetaTrackingUpdateSchema = z66.object({
13310
13346
  pixels: pixelsSchema,
13311
13347
  expectedDigest: z66.string().min(1).max(256).nullable()
@@ -19003,7 +19039,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
19003
19039
  ], [
19004
19040
  "service_landing"
19005
19041
  ], MCP_ONLY_CHANNEL_EXPOSURE),
19006
- defineCapability("create_service_images", "1df35139abd6b04c5ebcdd5945154555a3f0d0e49b61f7d70c98cc5dad1e1347", "credit_consuming", "creative", [
19042
+ defineCapability("create_service_images", "c36653d6744c38aa43cd7ddad34481526651a09590de5bb62d1061e39dd537c3", "credit_consuming", "creative", [
19007
19043
  "credit_consuming",
19008
19044
  "state_change"
19009
19045
  ], [
@@ -21966,7 +22002,9 @@ var WebsiteCaptureResponseSchema = z109.object({
21966
22002
  var WebsiteCaptureJobSchema = WebsiteCaptureRequestSchema.extend({
21967
22003
  captureId: z109.string().uuid(),
21968
22004
  attempt: z109.number().int().positive(),
21969
- leaseUntil: z109.string().datetime()
22005
+ leaseUntil: z109.string().datetime(),
22006
+ /** Public profile document prepared by the API; never contains a provider credential. */
22007
+ socialProfileHtml: z109.string().max(2e5).optional()
21970
22008
  });
21971
22009
  var WebsiteCaptureClaimResponseSchema = z109.object({
21972
22010
  capture: WebsiteCaptureJobSchema.nullable()
@@ -22475,7 +22513,7 @@ var ApiClient = class {
22475
22513
  };
22476
22514
 
22477
22515
  // src/index.ts
22478
- var MCP_VERSION = "11.5.0";
22516
+ var MCP_VERSION = "11.5.2";
22479
22517
 
22480
22518
  // src/meta-upload-app.ts
22481
22519
  import { readFileSync } from "fs";
@@ -24255,9 +24293,13 @@ async function fetchTaskOutputs(api, taskId, options) {
24255
24293
  const variants = raw.adCreative?.variants ?? [];
24256
24294
  const hasVariants = variants.some((v) => typeof v === "string");
24257
24295
  if (hasVariants) {
24258
- for (const variant of variants) {
24296
+ for (const [index, variant] of variants.entries()) {
24297
+ const adCopy = raw.adCreative?.adCopies?.[index];
24259
24298
  if (typeof variant === "string") images.push({
24260
- url: variant
24299
+ url: variant,
24300
+ ...adCopy ? {
24301
+ adCopy
24302
+ } : {}
24261
24303
  });
24262
24304
  }
24263
24305
  } else if (raw.adCreative?.url) {
@@ -24296,6 +24338,7 @@ function renderOutputsMarkdown(outputs) {
24296
24338
  outputs.images.forEach((img, i) => {
24297
24339
  parts.push(`![v${i}](${img.url})`);
24298
24340
  parts.push(`[\u2B07 Descargar v${i}](${img.url})`);
24341
+ if (img.adCopy) parts.push(`Copy: ${img.adCopy}`);
24299
24342
  });
24300
24343
  }
24301
24344
  if (outputs.adCopy) {
@@ -25226,6 +25269,8 @@ var AnimatedVideoResultSchema = z113.object({
25226
25269
  ]),
25227
25270
  serviceMode: z113.literal("motion_graphics"),
25228
25271
  finalMp4Url: z113.string().optional(),
25272
+ adCopy: z113.string().optional(),
25273
+ adCopies: z113.array(z113.string()).optional(),
25229
25274
  error: z113.string().optional(),
25230
25275
  motionGraphics: z113.object({
25231
25276
  stage: MotionGraphicsStageSchema,
@@ -25338,10 +25383,14 @@ function renderAnimatedVideoStatus(result) {
25338
25383
  const label = variantUrls.length > 0 ? "Gancho 1" : "Video final";
25339
25384
  lines.push(`${label} (MP4): ${result.finalMp4Url}`);
25340
25385
  lines.push(`[Descargar ${label.toLowerCase()}](${result.finalMp4Url})`);
25386
+ const copy = result.adCopies?.[0] || result.adCopy;
25387
+ if (copy) lines.push(`Copy: ${copy}`);
25341
25388
  }
25342
25389
  variantUrls.forEach((url, index) => {
25343
25390
  lines.push(`Gancho ${index + 2} (MP4): ${url}`);
25344
25391
  lines.push(`[Descargar gancho ${index + 2}](${url})`);
25392
+ const copy = result.adCopies?.[index + 1] || result.adCopy;
25393
+ if (copy) lines.push(`Copy: ${copy}`);
25345
25394
  });
25346
25395
  const delivered = (result.finalMp4Url ? 1 : 0) + variantUrls.length;
25347
25396
  if (orderedHooks > delivered) {
@@ -27492,7 +27541,7 @@ var CreateServiceImagesInput = z118.object({
27492
27541
  "en",
27493
27542
  "pt"
27494
27543
  ]).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."),
27544
+ adCopy: z118.boolean().optional().describe("Compatibilidad con clientes anteriores: el copy para publicar siempre est\xE1 incluido en cada imagen de servicios."),
27496
27545
  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
27546
  }).strict();
27498
27547
  function serviceImageModel(quality) {
@@ -27526,7 +27575,7 @@ function registerServiceImageTools(server, api, options = {}) {
27526
27575
  throw mcp(McpErrorCode.INVALID_INPUT, `${tierError} Usa quality="standard" o otro formato. No se cobr\xF3 nada.`);
27527
27576
  }
27528
27577
  const language = LANGUAGE_TAGS[input.language ?? "es"];
27529
- const adCopy = input.adCopy ?? false;
27578
+ const adCopy = true;
27530
27579
  const estimate = await api.postJson("/v1/billing/estimate", {
27531
27580
  type: "image-creative",
27532
27581
  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.2",
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.",