@productmaker/mcp 6.0.0 → 6.1.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.
Files changed (3) hide show
  1. package/dist/http.js +37 -29
  2. package/dist/stdio.js +37 -29
  3. package/package.json +3 -3
package/dist/http.js CHANGED
@@ -2278,6 +2278,11 @@ var IngestOptions = z15.object({
2278
2278
  * scan. Default true preserves the existing flow; users with their own
2279
2279
  * competitor intel or in privacy-sensitive niches can disable. */
2280
2280
  competitorScanEnabled: z15.boolean().default(true),
2281
+ /** Consent for a replicable competitor winner to override an explicitly
2282
+ * chosen videoPreset. Default true preserves the 2026-08-04 decision;
2283
+ * only a deliberate `false` suspends replication. See
2284
+ * `shouldAskReplicationConsent` for when this is even asked. */
2285
+ replicateWinnerWhenFound: z15.boolean().default(true),
2281
2286
  brandId: z15.string().uuid().optional()
2282
2287
  }).partial().superRefine((data, ctx) => {
2283
2288
  const message = validatePriceInversion(data.price, data.compareAtPrice);
@@ -3920,14 +3925,7 @@ var CostEstimationType = z25.enum([
3920
3925
  "service-creative",
3921
3926
  "actor-grid"
3922
3927
  ]);
3923
- var IngestEstimationOptions = z25.object({
3924
- /** Number of product references that the extract stage will clean. */
3925
- productImageCount: z25.number().int().min(1).max(INGEST_MAX_REFERENCE_IMAGES).optional(),
3926
- videoModel: VideoModel.optional(),
3927
- videoTier: VideoTier.optional(),
3928
- multiAngleVideos: z25.boolean().optional(),
3929
- videoAngleCount: z25.number().int().min(1).max(3).optional(),
3930
- ugcFormat: VideoFormat.optional(),
3928
+ var SharedOutputEstimationFields = {
3931
3929
  generateAdCopy: z25.boolean().optional(),
3932
3930
  landingEnabled: z25.boolean().optional(),
3933
3931
  /** Landing render mode. 'code' (structured config + ~6 1K images) is markedly
@@ -3944,6 +3942,20 @@ var IngestEstimationOptions = z25.object({
3944
3942
  * ~$0.48 worst case: 20 ads × 1.2¢ + 12 transcripts × 2¢). Default
3945
3943
  * behavior (undefined / true) keeps the full ceiling. */
3946
3944
  competitorScanEnabled: z25.boolean().optional(),
3945
+ /** Declining the winner replica makes `gap_replication` unreachable, so its
3946
+ * forced-STANDARD ceiling must not be quoted. See
3947
+ * `.agent/specs/winner-replication-consent.spec.test.ts`. */
3948
+ replicateWinnerWhenFound: z25.boolean().optional()
3949
+ };
3950
+ var IngestEstimationOptions = z25.object({
3951
+ /** Number of product references that the extract stage will clean. */
3952
+ productImageCount: z25.number().int().min(1).max(INGEST_MAX_REFERENCE_IMAGES).optional(),
3953
+ videoModel: VideoModel.optional(),
3954
+ videoTier: VideoTier.optional(),
3955
+ multiAngleVideos: z25.boolean().optional(),
3956
+ videoAngleCount: z25.number().int().min(1).max(3).optional(),
3957
+ ugcFormat: VideoFormat.optional(),
3958
+ ...SharedOutputEstimationFields,
3947
3959
  videoStyle: VideoStyle.optional(),
3948
3960
  narrativeStyle: NarrativeStyle.optional(),
3949
3961
  videoPreset: VideoPreset.optional(),
@@ -3965,20 +3977,7 @@ var IngestResumeEstimationOptions = z25.object({
3965
3977
  videoResolution: VideoResolution.optional(),
3966
3978
  selectedAngleIndices: z25.array(z25.number().int().nonnegative()).min(1).max(3).optional(),
3967
3979
  angleVideoOptions: z25.array(AngleVideoOptions).max(3).optional(),
3968
- generateAdCopy: z25.boolean().optional(),
3969
- landingEnabled: z25.boolean().optional(),
3970
- /** Landing render mode. 'code' (~6 1K images) is cheaper than 'classic' (~12 2K
3971
- * images). Undefined ⇒ classic (the default render mode). */
3972
- landingMode: LandingModeSchema.optional(),
3973
- /** Classic landing strategy. Undefined follows the public classic default; code mode ignores it. */
3974
- landingStrategy: LandingStrategySchema.optional(),
3975
- adCreativeEnabled: z25.boolean().optional(),
3976
- /** When false, skip video generation cost. Multi-output autopilot
3977
- * selections (e.g. {landing, image}) set this false. */
3978
- videoGeneratorEnabled: z25.boolean().optional(),
3979
- /** When false, drop the Apify + Whisper competitor-spy ceiling (up to ~$0.48
3980
- * worst case) from the resume estimate so the chat preview matches what's billed. */
3981
- competitorScanEnabled: z25.boolean().optional(),
3980
+ ...SharedOutputEstimationFields,
3982
3981
  /** Whether the ingest flow will generate the ad creative image (typically true when angle_0 is included). */
3983
3982
  generateCreative: z25.boolean().optional(),
3984
3983
  generateAiMusic: z25.boolean().optional(),
@@ -4019,6 +4018,7 @@ var VideoCreativeEstimationOptions = z25.object({
4019
4018
  requiresAngles: z25.boolean().optional(),
4020
4019
  /** When false, omit the Meta/Whisper competitor-scan ceiling from the estimate. */
4021
4020
  competitorScanEnabled: z25.boolean().optional(),
4021
+ replicateWinnerWhenFound: z25.boolean().optional(),
4022
4022
  /** Quote the competitor scan even when product extraction is skipped (direct video auto path). */
4023
4023
  requiresCompetitorScan: z25.boolean().optional(),
4024
4024
  generateAiMusic: z25.boolean().optional(),
@@ -9652,7 +9652,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
9652
9652
  ], [
9653
9653
  "creative_variant"
9654
9654
  ]),
9655
- defineCapability("create_product_task", "1e112848ec1433249e7add9994ca07b5322a743f7444808bd51b8257c3988366", "credit_consuming", "creative", [
9655
+ defineCapability("create_product_task", "ba700dbec8fb6454d55f996ae4567b9280256ae3b62fceb77fd729b9aa21425c", "credit_consuming", "creative", [
9656
9656
  "credit_consuming",
9657
9657
  "state_change"
9658
9658
  ], [
@@ -9703,7 +9703,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
9703
9703
  "videoResolution",
9704
9704
  "videoAngleCount",
9705
9705
  "angleNarratives",
9706
- "competitorScanEnabled"
9706
+ "competitorScanEnabled",
9707
+ "replicateWinnerWhenFound"
9707
9708
  ], [
9708
9709
  "videoPreset",
9709
9710
  "durationSeconds",
@@ -9712,7 +9713,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
9712
9713
  "videoResolution",
9713
9714
  "multiAngleVideos",
9714
9715
  "angleNarratives",
9715
- "competitorScanEnabled"
9716
+ "competitorScanEnabled",
9717
+ "replicateWinnerWhenFound"
9716
9718
  ]),
9717
9719
  slot("brand_direction", false, [
9718
9720
  "brandId",
@@ -10027,7 +10029,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10027
10029
  fieldCompletion: "all"
10028
10030
  }
10029
10031
  ]),
10030
- defineCapability("generate_video_creative", "be67eb577c59070d8f77a0b783e4a6e9534ed917dda03d60200fbeb9365db66d", "credit_consuming", "creative", [
10032
+ defineCapability("generate_video_creative", "d99875f4e137c570510e2adac423e5419c3ed135d4505007d9bdfe30ad1b43d5", "credit_consuming", "creative", [
10031
10033
  "credit_consuming",
10032
10034
  "state_change"
10033
10035
  ], [
@@ -10057,7 +10059,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10057
10059
  "features",
10058
10060
  "cta",
10059
10061
  "scriptNotes",
10060
- "competitorScanEnabled"
10062
+ "competitorScanEnabled",
10063
+ "replicateWinnerWhenFound"
10061
10064
  ], [
10062
10065
  "aspectRatio",
10063
10066
  "durationSeconds",
@@ -10069,7 +10072,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10069
10072
  "scriptNotes",
10070
10073
  "pauseForVideoScriptReview",
10071
10074
  "pauseForAngleReview",
10072
- "competitorScanEnabled"
10075
+ "competitorScanEnabled",
10076
+ "replicateWinnerWhenFound"
10073
10077
  ]),
10074
10078
  slot("commercial_offer", false, [
10075
10079
  "price",
@@ -12229,7 +12233,7 @@ var ApiClient = class {
12229
12233
  };
12230
12234
 
12231
12235
  // src/index.ts
12232
- var MCP_VERSION = "6.0.0";
12236
+ var MCP_VERSION = "6.1.0";
12233
12237
 
12234
12238
  // src/meta-upload-app.ts
12235
12239
  import { readFileSync } from "fs";
@@ -14269,6 +14273,7 @@ var CreateProductTaskInput = z52.object({
14269
14273
  "image"
14270
14274
  ])).min(2).max(3).optional().describe('Opcional. Qu\xE9 outputs generar. Default: todos ["landing","video","image"]. Para 2 outputs: ["landing","image"] (sin video), ["video","image"] (sin landing), ["landing","video"] (sin imagen). Para 1 solo output, usa generate_landing / generate_video_creative / generate_image_creatives.'),
14271
14275
  competitorScanEnabled: z52.boolean().optional().describe("Opcional. Si true (default), el sistema analiza ads de competencia en Meta Ad Library y enriquece los \xE1ngulos generados con hooks y painPoints validados por el mercado (\u2248$0.20-0.48 extra por task \u2014 var\xEDa con cu\xE1ntas transcripciones de video se capturen). Si false, el pipeline genera \xE1ngulos sin esa se\xF1al \u2014 usa esto SOLO si el usuario ya tiene su propia investigaci\xF3n de mercado o quiere ahorrar costos en productos muy nicho sin presencia en Meta. Default true."),
14276
+ replicateWinnerWhenFound: z52.boolean().optional().describe('Opcional. Consentimiento para que, si encontramos un anuncio GANADOR de la competencia que podemos replicar, ese ganador reemplace la narrativa concreta que el usuario eligi\xF3 (videoPreset). Default true: la r\xE9plica del ganador es el formato que mejor convierte y sigue ganando por defecto. P\xE1salo en false SOLO si el usuario dice expl\xEDcitamente que quiere conservar su estilo elegido pase lo que pase (ej. pidi\xF3 Pixar y quiere Pixar aunque haya un ganador live-action). Irrelevante cuando videoPreset es "auto" (no hay elecci\xF3n que respetar) o cuando competitorScanEnabled es false (nunca habr\xE1 ganador).'),
14272
14277
  brandId: z52.string().uuid().optional().describe("Opcional. ID de una marca del usuario; si se env\xEDa, el sistema usa su voz, colores y persona para enriquecer los outputs generados."),
14273
14278
  actorId: z52.string().trim().min(1).optional().describe("Opcional. ID de un personaje guardado (usa list_actors para verlos). Si lo env\xEDas, su foto y su voz mandan sobre la descripci\xF3n de texto."),
14274
14279
  creativeDirection: z52.string().max(500).optional().describe('Opcional. Direcci\xF3n creativa en texto libre (colores, mood, estilo) que aplica a los outputs de IMAGEN y LANDING (no al video \u2014 el estilo/ambiente del video se dirige con scriptNotes). M\xC1XIMA PRIORIDAD: anula marca, colores y estilo por defecto. Ej. "amarillo y azul, minimalista". M\xE1x 500 caracteres.'),
@@ -14703,6 +14708,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
14703
14708
  "options.angleNarratives": input.angleNarratives,
14704
14709
  "options.selectedOutputs": input.outputs,
14705
14710
  "options.competitorScanEnabled": input.competitorScanEnabled,
14711
+ "options.replicateWinnerWhenFound": input.replicateWinnerWhenFound,
14706
14712
  "options.brandId": input.brandId,
14707
14713
  "options.actorId": input.actorId,
14708
14714
  "options.creativeDirection": input.creativeDirection,
@@ -15266,6 +15272,7 @@ var CreativeRefs = {
15266
15272
  productLabel: z53.string().trim().max(80).optional().describe('Opcional. Nombre o tipo del producto en pocas palabras (ej. "collar de oro", "quita pelusas para ropa"). Es AUTORITATIVO: la IA usa esta identidad y no la reemplaza por otra categor\xEDa. Si lo omites, la IA lo detecta desde la imagen. NO salta la extracci\xF3n.'),
15267
15273
  buyerPersona: z53.string().optional().describe('Opcional. Descripci\xF3n del comprador objetivo. Ej. "Mujeres 35-50, profesionales urbanas". Si se omite, la IA infiere desde el \xE1ngulo y producto.'),
15268
15274
  isCombo: z53.boolean().optional().describe("Opcional. Si true, el creativo presenta el producto como combo/pack. Default false."),
15275
+ replicateWinnerWhenFound: z53.boolean().optional().describe('Opcional. Consentimiento para que, si encontramos un anuncio GANADOR de la competencia que podemos replicar, ese ganador reemplace la narrativa concreta que el usuario eligi\xF3 (videoPreset). Default true: la r\xE9plica del ganador es el formato que mejor convierte y sigue ganando por defecto. P\xE1salo en false SOLO si el usuario dice expl\xEDcitamente que quiere conservar su estilo elegido pase lo que pase (ej. pidi\xF3 Pixar y quiere Pixar aunque haya un ganador live-action). Irrelevante cuando videoPreset es "auto" (no hay elecci\xF3n que respetar) o cuando competitorScanEnabled es false (nunca habr\xE1 ganador).'),
15269
15276
  competitorScanEnabled: z53.boolean().optional().describe("Opcional. Si true (default), el sistema analiza ads de competencia en Meta Ad Library y enriquece los \xE1ngulos generados con hooks y painPoints validados por el mercado (\u2248$0.20-0.48 extra por task \u2014 var\xEDa con cu\xE1ntas transcripciones de video se capturen). Si false, el pipeline genera \xE1ngulos sin esa se\xF1al \u2014 usa esto SOLO si el usuario ya tiene su propia investigaci\xF3n de mercado o quiere ahorrar costos en productos muy nicho sin presencia en Meta. Default true."),
15270
15277
  brandId: z53.string().uuid().optional().describe("Opcional. ID de una marca del usuario; si se env\xEDa, el sistema usa su voz, colores y persona para enriquecer el creativo.")
15271
15278
  };
@@ -15321,6 +15328,7 @@ var VideoInput = z53.object({
15321
15328
  cta: z53.string().optional().describe('Opcional. Call-to-action final del video. Ej. "Compra ahora", "Pide el tuyo hoy", "Link en bio". Si se omite, la IA escribe uno.'),
15322
15329
  scriptNotes: z53.string().optional().describe('Opcional. Notas/restricciones para el guion (la IA las usa al redactar). Ej. "No mencionar la marca X", "Tono divertido, no cl\xEDnico", "Mencionar 2x1". NO es el guion literal: creativeSetup.mode=guided activa siempre la revisi\xF3n palabra-por-palabra con get_video_script / approve_video_script.'),
15323
15330
  competitorScanEnabled: CreativeRefs.competitorScanEnabled,
15331
+ replicateWinnerWhenFound: CreativeRefs.replicateWinnerWhenFound,
15324
15332
  brandId: CreativeRefs.brandId
15325
15333
  }).strict();
15326
15334
  var FreeVideoQualityEnum = z53.enum([
package/dist/stdio.js CHANGED
@@ -264,7 +264,7 @@ var ApiClient = class {
264
264
  };
265
265
 
266
266
  // src/index.ts
267
- var MCP_VERSION = "6.0.0";
267
+ var MCP_VERSION = "6.1.0";
268
268
 
269
269
  // src/meta-upload-app.ts
270
270
  import { readFileSync } from "fs";
@@ -2900,6 +2900,11 @@ var IngestOptions = z15.object({
2900
2900
  * scan. Default true preserves the existing flow; users with their own
2901
2901
  * competitor intel or in privacy-sensitive niches can disable. */
2902
2902
  competitorScanEnabled: z15.boolean().default(true),
2903
+ /** Consent for a replicable competitor winner to override an explicitly
2904
+ * chosen videoPreset. Default true preserves the 2026-08-04 decision;
2905
+ * only a deliberate `false` suspends replication. See
2906
+ * `shouldAskReplicationConsent` for when this is even asked. */
2907
+ replicateWinnerWhenFound: z15.boolean().default(true),
2903
2908
  brandId: z15.string().uuid().optional()
2904
2909
  }).partial().superRefine((data, ctx) => {
2905
2910
  const message = validatePriceInversion(data.price, data.compareAtPrice);
@@ -4542,14 +4547,7 @@ var CostEstimationType = z25.enum([
4542
4547
  "service-creative",
4543
4548
  "actor-grid"
4544
4549
  ]);
4545
- var IngestEstimationOptions = z25.object({
4546
- /** Number of product references that the extract stage will clean. */
4547
- productImageCount: z25.number().int().min(1).max(INGEST_MAX_REFERENCE_IMAGES).optional(),
4548
- videoModel: VideoModel.optional(),
4549
- videoTier: VideoTier.optional(),
4550
- multiAngleVideos: z25.boolean().optional(),
4551
- videoAngleCount: z25.number().int().min(1).max(3).optional(),
4552
- ugcFormat: VideoFormat.optional(),
4550
+ var SharedOutputEstimationFields = {
4553
4551
  generateAdCopy: z25.boolean().optional(),
4554
4552
  landingEnabled: z25.boolean().optional(),
4555
4553
  /** Landing render mode. 'code' (structured config + ~6 1K images) is markedly
@@ -4566,6 +4564,20 @@ var IngestEstimationOptions = z25.object({
4566
4564
  * ~$0.48 worst case: 20 ads × 1.2¢ + 12 transcripts × 2¢). Default
4567
4565
  * behavior (undefined / true) keeps the full ceiling. */
4568
4566
  competitorScanEnabled: z25.boolean().optional(),
4567
+ /** Declining the winner replica makes `gap_replication` unreachable, so its
4568
+ * forced-STANDARD ceiling must not be quoted. See
4569
+ * `.agent/specs/winner-replication-consent.spec.test.ts`. */
4570
+ replicateWinnerWhenFound: z25.boolean().optional()
4571
+ };
4572
+ var IngestEstimationOptions = z25.object({
4573
+ /** Number of product references that the extract stage will clean. */
4574
+ productImageCount: z25.number().int().min(1).max(INGEST_MAX_REFERENCE_IMAGES).optional(),
4575
+ videoModel: VideoModel.optional(),
4576
+ videoTier: VideoTier.optional(),
4577
+ multiAngleVideos: z25.boolean().optional(),
4578
+ videoAngleCount: z25.number().int().min(1).max(3).optional(),
4579
+ ugcFormat: VideoFormat.optional(),
4580
+ ...SharedOutputEstimationFields,
4569
4581
  videoStyle: VideoStyle.optional(),
4570
4582
  narrativeStyle: NarrativeStyle.optional(),
4571
4583
  videoPreset: VideoPreset.optional(),
@@ -4587,20 +4599,7 @@ var IngestResumeEstimationOptions = z25.object({
4587
4599
  videoResolution: VideoResolution.optional(),
4588
4600
  selectedAngleIndices: z25.array(z25.number().int().nonnegative()).min(1).max(3).optional(),
4589
4601
  angleVideoOptions: z25.array(AngleVideoOptions).max(3).optional(),
4590
- generateAdCopy: z25.boolean().optional(),
4591
- landingEnabled: z25.boolean().optional(),
4592
- /** Landing render mode. 'code' (~6 1K images) is cheaper than 'classic' (~12 2K
4593
- * images). Undefined ⇒ classic (the default render mode). */
4594
- landingMode: LandingModeSchema.optional(),
4595
- /** Classic landing strategy. Undefined follows the public classic default; code mode ignores it. */
4596
- landingStrategy: LandingStrategySchema.optional(),
4597
- adCreativeEnabled: z25.boolean().optional(),
4598
- /** When false, skip video generation cost. Multi-output autopilot
4599
- * selections (e.g. {landing, image}) set this false. */
4600
- videoGeneratorEnabled: z25.boolean().optional(),
4601
- /** When false, drop the Apify + Whisper competitor-spy ceiling (up to ~$0.48
4602
- * worst case) from the resume estimate so the chat preview matches what's billed. */
4603
- competitorScanEnabled: z25.boolean().optional(),
4602
+ ...SharedOutputEstimationFields,
4604
4603
  /** Whether the ingest flow will generate the ad creative image (typically true when angle_0 is included). */
4605
4604
  generateCreative: z25.boolean().optional(),
4606
4605
  generateAiMusic: z25.boolean().optional(),
@@ -4641,6 +4640,7 @@ var VideoCreativeEstimationOptions = z25.object({
4641
4640
  requiresAngles: z25.boolean().optional(),
4642
4641
  /** When false, omit the Meta/Whisper competitor-scan ceiling from the estimate. */
4643
4642
  competitorScanEnabled: z25.boolean().optional(),
4643
+ replicateWinnerWhenFound: z25.boolean().optional(),
4644
4644
  /** Quote the competitor scan even when product extraction is skipped (direct video auto path). */
4645
4645
  requiresCompetitorScan: z25.boolean().optional(),
4646
4646
  generateAiMusic: z25.boolean().optional(),
@@ -10274,7 +10274,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10274
10274
  ], [
10275
10275
  "creative_variant"
10276
10276
  ]),
10277
- defineCapability("create_product_task", "1e112848ec1433249e7add9994ca07b5322a743f7444808bd51b8257c3988366", "credit_consuming", "creative", [
10277
+ defineCapability("create_product_task", "ba700dbec8fb6454d55f996ae4567b9280256ae3b62fceb77fd729b9aa21425c", "credit_consuming", "creative", [
10278
10278
  "credit_consuming",
10279
10279
  "state_change"
10280
10280
  ], [
@@ -10325,7 +10325,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10325
10325
  "videoResolution",
10326
10326
  "videoAngleCount",
10327
10327
  "angleNarratives",
10328
- "competitorScanEnabled"
10328
+ "competitorScanEnabled",
10329
+ "replicateWinnerWhenFound"
10329
10330
  ], [
10330
10331
  "videoPreset",
10331
10332
  "durationSeconds",
@@ -10334,7 +10335,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10334
10335
  "videoResolution",
10335
10336
  "multiAngleVideos",
10336
10337
  "angleNarratives",
10337
- "competitorScanEnabled"
10338
+ "competitorScanEnabled",
10339
+ "replicateWinnerWhenFound"
10338
10340
  ]),
10339
10341
  slot("brand_direction", false, [
10340
10342
  "brandId",
@@ -10649,7 +10651,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10649
10651
  fieldCompletion: "all"
10650
10652
  }
10651
10653
  ]),
10652
- defineCapability("generate_video_creative", "be67eb577c59070d8f77a0b783e4a6e9534ed917dda03d60200fbeb9365db66d", "credit_consuming", "creative", [
10654
+ defineCapability("generate_video_creative", "d99875f4e137c570510e2adac423e5419c3ed135d4505007d9bdfe30ad1b43d5", "credit_consuming", "creative", [
10653
10655
  "credit_consuming",
10654
10656
  "state_change"
10655
10657
  ], [
@@ -10679,7 +10681,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10679
10681
  "features",
10680
10682
  "cta",
10681
10683
  "scriptNotes",
10682
- "competitorScanEnabled"
10684
+ "competitorScanEnabled",
10685
+ "replicateWinnerWhenFound"
10683
10686
  ], [
10684
10687
  "aspectRatio",
10685
10688
  "durationSeconds",
@@ -10691,7 +10694,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10691
10694
  "scriptNotes",
10692
10695
  "pauseForVideoScriptReview",
10693
10696
  "pauseForAngleReview",
10694
- "competitorScanEnabled"
10697
+ "competitorScanEnabled",
10698
+ "replicateWinnerWhenFound"
10695
10699
  ]),
10696
10700
  slot("commercial_offer", false, [
10697
10701
  "price",
@@ -13069,6 +13073,7 @@ var CreateProductTaskInput = z51.object({
13069
13073
  "image"
13070
13074
  ])).min(2).max(3).optional().describe('Opcional. Qu\xE9 outputs generar. Default: todos ["landing","video","image"]. Para 2 outputs: ["landing","image"] (sin video), ["video","image"] (sin landing), ["landing","video"] (sin imagen). Para 1 solo output, usa generate_landing / generate_video_creative / generate_image_creatives.'),
13071
13075
  competitorScanEnabled: z51.boolean().optional().describe("Opcional. Si true (default), el sistema analiza ads de competencia en Meta Ad Library y enriquece los \xE1ngulos generados con hooks y painPoints validados por el mercado (\u2248$0.20-0.48 extra por task \u2014 var\xEDa con cu\xE1ntas transcripciones de video se capturen). Si false, el pipeline genera \xE1ngulos sin esa se\xF1al \u2014 usa esto SOLO si el usuario ya tiene su propia investigaci\xF3n de mercado o quiere ahorrar costos en productos muy nicho sin presencia en Meta. Default true."),
13076
+ replicateWinnerWhenFound: z51.boolean().optional().describe('Opcional. Consentimiento para que, si encontramos un anuncio GANADOR de la competencia que podemos replicar, ese ganador reemplace la narrativa concreta que el usuario eligi\xF3 (videoPreset). Default true: la r\xE9plica del ganador es el formato que mejor convierte y sigue ganando por defecto. P\xE1salo en false SOLO si el usuario dice expl\xEDcitamente que quiere conservar su estilo elegido pase lo que pase (ej. pidi\xF3 Pixar y quiere Pixar aunque haya un ganador live-action). Irrelevante cuando videoPreset es "auto" (no hay elecci\xF3n que respetar) o cuando competitorScanEnabled es false (nunca habr\xE1 ganador).'),
13072
13077
  brandId: z51.string().uuid().optional().describe("Opcional. ID de una marca del usuario; si se env\xEDa, el sistema usa su voz, colores y persona para enriquecer los outputs generados."),
13073
13078
  actorId: z51.string().trim().min(1).optional().describe("Opcional. ID de un personaje guardado (usa list_actors para verlos). Si lo env\xEDas, su foto y su voz mandan sobre la descripci\xF3n de texto."),
13074
13079
  creativeDirection: z51.string().max(500).optional().describe('Opcional. Direcci\xF3n creativa en texto libre (colores, mood, estilo) que aplica a los outputs de IMAGEN y LANDING (no al video \u2014 el estilo/ambiente del video se dirige con scriptNotes). M\xC1XIMA PRIORIDAD: anula marca, colores y estilo por defecto. Ej. "amarillo y azul, minimalista". M\xE1x 500 caracteres.'),
@@ -13503,6 +13508,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
13503
13508
  "options.angleNarratives": input.angleNarratives,
13504
13509
  "options.selectedOutputs": input.outputs,
13505
13510
  "options.competitorScanEnabled": input.competitorScanEnabled,
13511
+ "options.replicateWinnerWhenFound": input.replicateWinnerWhenFound,
13506
13512
  "options.brandId": input.brandId,
13507
13513
  "options.actorId": input.actorId,
13508
13514
  "options.creativeDirection": input.creativeDirection,
@@ -14066,6 +14072,7 @@ var CreativeRefs = {
14066
14072
  productLabel: z52.string().trim().max(80).optional().describe('Opcional. Nombre o tipo del producto en pocas palabras (ej. "collar de oro", "quita pelusas para ropa"). Es AUTORITATIVO: la IA usa esta identidad y no la reemplaza por otra categor\xEDa. Si lo omites, la IA lo detecta desde la imagen. NO salta la extracci\xF3n.'),
14067
14073
  buyerPersona: z52.string().optional().describe('Opcional. Descripci\xF3n del comprador objetivo. Ej. "Mujeres 35-50, profesionales urbanas". Si se omite, la IA infiere desde el \xE1ngulo y producto.'),
14068
14074
  isCombo: z52.boolean().optional().describe("Opcional. Si true, el creativo presenta el producto como combo/pack. Default false."),
14075
+ replicateWinnerWhenFound: z52.boolean().optional().describe('Opcional. Consentimiento para que, si encontramos un anuncio GANADOR de la competencia que podemos replicar, ese ganador reemplace la narrativa concreta que el usuario eligi\xF3 (videoPreset). Default true: la r\xE9plica del ganador es el formato que mejor convierte y sigue ganando por defecto. P\xE1salo en false SOLO si el usuario dice expl\xEDcitamente que quiere conservar su estilo elegido pase lo que pase (ej. pidi\xF3 Pixar y quiere Pixar aunque haya un ganador live-action). Irrelevante cuando videoPreset es "auto" (no hay elecci\xF3n que respetar) o cuando competitorScanEnabled es false (nunca habr\xE1 ganador).'),
14069
14076
  competitorScanEnabled: z52.boolean().optional().describe("Opcional. Si true (default), el sistema analiza ads de competencia en Meta Ad Library y enriquece los \xE1ngulos generados con hooks y painPoints validados por el mercado (\u2248$0.20-0.48 extra por task \u2014 var\xEDa con cu\xE1ntas transcripciones de video se capturen). Si false, el pipeline genera \xE1ngulos sin esa se\xF1al \u2014 usa esto SOLO si el usuario ya tiene su propia investigaci\xF3n de mercado o quiere ahorrar costos en productos muy nicho sin presencia en Meta. Default true."),
14070
14077
  brandId: z52.string().uuid().optional().describe("Opcional. ID de una marca del usuario; si se env\xEDa, el sistema usa su voz, colores y persona para enriquecer el creativo.")
14071
14078
  };
@@ -14121,6 +14128,7 @@ var VideoInput = z52.object({
14121
14128
  cta: z52.string().optional().describe('Opcional. Call-to-action final del video. Ej. "Compra ahora", "Pide el tuyo hoy", "Link en bio". Si se omite, la IA escribe uno.'),
14122
14129
  scriptNotes: z52.string().optional().describe('Opcional. Notas/restricciones para el guion (la IA las usa al redactar). Ej. "No mencionar la marca X", "Tono divertido, no cl\xEDnico", "Mencionar 2x1". NO es el guion literal: creativeSetup.mode=guided activa siempre la revisi\xF3n palabra-por-palabra con get_video_script / approve_video_script.'),
14123
14130
  competitorScanEnabled: CreativeRefs.competitorScanEnabled,
14131
+ replicateWinnerWhenFound: CreativeRefs.replicateWinnerWhenFound,
14124
14132
  brandId: CreativeRefs.brandId
14125
14133
  }).strict();
14126
14134
  var FreeVideoQualityEnum = z52.enum([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "6.0.0",
3
+ "version": "6.1.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "Product Maker MCP server — cost products, generate dropshipping landing pages, UGC videos, and ad creatives, and publish to Shopify and Meta Ads from Claude, ChatGPT, or Gemini.",
@@ -67,8 +67,8 @@
67
67
  "typescript": "^7.0.2",
68
68
  "vitest": "^2.1.9",
69
69
  "@packages/product-economics": "0.1.0",
70
- "@packages/types": "0.1.0",
71
- "@packages/product-research": "0.1.0"
70
+ "@packages/product-research": "0.1.0",
71
+ "@packages/types": "0.1.0"
72
72
  },
73
73
  "publishConfig": {
74
74
  "access": "public"