@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.
- package/dist/http.js +37 -29
- package/dist/stdio.js +37 -29
- 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
|
|
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
|
-
|
|
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", "
|
|
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", "
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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", "
|
|
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", "
|
|
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.
|
|
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/
|
|
71
|
-
"@packages/
|
|
70
|
+
"@packages/product-research": "0.1.0",
|
|
71
|
+
"@packages/types": "0.1.0"
|
|
72
72
|
},
|
|
73
73
|
"publishConfig": {
|
|
74
74
|
"access": "public"
|