@productmaker/mcp 1.8.1 → 1.10.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 CHANGED
@@ -113,7 +113,7 @@ var ApiClient = class {
113
113
  };
114
114
 
115
115
  // src/index.ts
116
- var MCP_VERSION = "1.8.1";
116
+ var MCP_VERSION = "1.10.0";
117
117
 
118
118
  // src/tools/tasks.ts
119
119
  import { z as z2 } from "zod";
@@ -405,6 +405,11 @@ var LandingStrategyEnum = z.enum([
405
405
  "offer_value",
406
406
  "lifestyle_identity"
407
407
  ]);
408
+ var LandingImageFormatEnum = z.enum([
409
+ "9:16",
410
+ "4:5",
411
+ "1:1"
412
+ ]);
408
413
  var VideoPresetEnum = z.enum([
409
414
  "auto",
410
415
  "ugc_dynamic",
@@ -533,6 +538,14 @@ var ProductReferenceCandidateGroupingEnum = z.enum([
533
538
  "different_products",
534
539
  "unclear"
535
540
  ]);
541
+ var GapDurationChoiceMirror = z.object({
542
+ angleIndex: z.number().int().nonnegative(),
543
+ recommendedSec: z.union([
544
+ z.literal(15),
545
+ z.literal(30)
546
+ ]),
547
+ estimatedDeltaCredits: z.number().int().nonnegative().optional()
548
+ });
536
549
  function buildSelectedImageUrlsHash(urls) {
537
550
  const input = [
538
551
  ...urls
@@ -1199,7 +1212,8 @@ var CreateProductTaskInput = z2.object({
1199
1212
  competitorScanEnabled: z2.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."),
1200
1213
  brandId: z2.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."),
1201
1214
  creativeDirection: z2.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.'),
1202
- landingStrategy: LandingStrategyEnum.default("classic").describe('Opcional. Estructura de la landing cl\xE1sica cuando landing est\xE1 entre outputs: "classic" (estructura original probada y recomendada; default del primer rollout), "auto" (la IA decide; experimental), "pain_solution", "social_proof", "benefits_clarity", "offer_value" o "lifestyle_identity". Default "classic".')
1215
+ landingStrategy: LandingStrategyEnum.default("classic").describe('Opcional. Estructura de la landing cl\xE1sica cuando landing est\xE1 entre outputs: "classic" (estructura original probada y recomendada; default del primer rollout), "auto" (la IA decide; experimental), "pain_solution", "social_proof", "benefits_clarity", "offer_value" o "lifestyle_identity". Default "classic".'),
1216
+ landingImageFormat: LandingImageFormatEnum.default("9:16").describe('Opcional. Formato/relaci\xF3n de aspecto de las im\xE1genes de la landing cl\xE1sica cuando landing est\xE1 entre outputs: "9:16" (vertical, por defecto), "4:5" (vertical compacto para feed) o "1:1" (cuadrado). Default "9:16".')
1203
1217
  }).strict();
1204
1218
  var GetTaskStatusInput = z2.object({
1205
1219
  taskId: z2.string().min(1),
@@ -1270,7 +1284,12 @@ var StatusForResolveSchema = z2.object({
1270
1284
  customAngleDraft: z2.string().optional(),
1271
1285
  painPointsDraft: z2.string().optional(),
1272
1286
  benefitsDraft: z2.string().optional(),
1273
- featuresDraft: z2.array(z2.string()).optional()
1287
+ featuresDraft: z2.array(z2.string()).optional(),
1288
+ // Informational-only recommendation (see GapDurationChoiceMirror in
1289
+ // shared.ts). Not read by the switch below — v1 has no consent input for
1290
+ // it — mirrored here purely so it survives the parse instead of being
1291
+ // silently stripped by this object's default unknown-key behavior.
1292
+ gapDurationChoice: GapDurationChoiceMirror.optional()
1274
1293
  }).optional()
1275
1294
  }).passthrough();
1276
1295
  var DEFAULT_PRODUCT_TASK_OUTPUTS = [
@@ -1324,6 +1343,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
1324
1343
  "options.brandId": input.brandId,
1325
1344
  "options.creativeDirection": input.creativeDirection,
1326
1345
  "options.landingStrategy": input.landingStrategy,
1346
+ "options.landingImageFormat": input.landingImageFormat,
1327
1347
  url: input.productUrl
1328
1348
  });
1329
1349
  const r = await api.postMultipart("/v1/ingest", {
@@ -1341,7 +1361,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
1341
1361
  throw translateError(e);
1342
1362
  }
1343
1363
  });
1344
- server.tool("get_task_status", 'Devuelve el estado y URLs de outputs de una tarea. Si waitSeconds>0, hace polling hasta que cambie la fase, aparezca `pendingUserAction`, o llegue al timeout (max 120s). Cuando la tarea queda en `done`, la respuesta incluye un segundo bloque markdown con previews inline de las im\xE1genes, links descargables al video MP4 y un enlace a Product Maker para ver el resultado completo.\n\nIMPORTANTE \u2014 `pendingUserAction`: si est\xE1 presente, el pipeline est\xE1 PARADO esperando que el usuario decida algo. Mira el `kind` y llama `resolve_pending_action` con `action: { kind: <mismo kind>, ... }`; sin esto la tarea NUNCA avanza por m\xE1s que esperes. Kinds actuales:\n- `product_reference_confirmation`: el clasificador no est\xE1 seguro si las fotos son variantes del mismo producto o productos distintos. Mu\xE9strale al usuario `targetProductLabel` + `reason`, recoge su respuesta, y usa SOLO valores presentes en `options`.\n- `angle_review_approval`: la IA ya gener\xF3 el \xE1ngulo/revisi\xF3n antes de renderizar. Mu\xE9strale `customAngleDraft`, `painPointsDraft`, `benefitsDraft`, `featuresDraft` si vienen; si no vienen, puedes pedir aprobaci\xF3n general y llamar `resolve_pending_action` con solo `{ kind: "angle_review_approval" }` para aprobar tal cual.\nUse this to check on a task progress; pass waitSeconds for a near-synchronous response.', GetTaskStatusInput.shape, async (input, extra) => {
1364
+ server.tool("get_task_status", 'Devuelve el estado y URLs de outputs de una tarea. Si waitSeconds>0, hace polling hasta que cambie la fase, aparezca `pendingUserAction`, o llegue al timeout (max 120s). Cuando la tarea queda en `done`, la respuesta incluye un segundo bloque markdown con previews inline de las im\xE1genes, links descargables al video MP4 y un enlace a Product Maker para ver el resultado completo.\n\nIMPORTANTE \u2014 `pendingUserAction`: si est\xE1 presente, el pipeline est\xE1 PARADO esperando que el usuario decida algo. Mira el `kind` y llama `resolve_pending_action` con `action: { kind: <mismo kind>, ... }`; sin esto la tarea NUNCA avanza por m\xE1s que esperes. Kinds actuales:\n- `product_reference_confirmation`: el clasificador no est\xE1 seguro si las fotos son variantes del mismo producto o productos distintos. Mu\xE9strale al usuario `targetProductLabel` + `reason`, recoge su respuesta, y usa SOLO valores presentes en `options`.\n- `angle_review_approval`: la IA ya gener\xF3 el \xE1ngulo/revisi\xF3n antes de renderizar. Mu\xE9strale `customAngleDraft`, `painPointsDraft`, `benefitsDraft`, `featuresDraft` si vienen; si no vienen, puedes pedir aprobaci\xF3n general y llamar `resolve_pending_action` con solo `{ kind: "angle_review_approval" }` para aprobar tal cual.\n\nSi ves `gapDurationChoice` (a nivel ra\xEDz de la respuesta, o dentro de `pendingUserAction` cuando el kind es `angle_review_approval`), es solo informativo: indica que el anuncio de referencia dura m\xE1s que la duraci\xF3n cotizada para esta tarea y cu\xE1nto costar\xEDa extenderla a `recommendedSec` segundos (el costo extra viene en `estimatedDeltaCredits`, si est\xE1 disponible), pero el MCP no tiene forma de aceptar ese cambio \u2014 com\xE9ntaselo al usuario y dile que lo active desde la web si le interesa.\nUse this to check on a task progress; pass waitSeconds for a near-synchronous response.', GetTaskStatusInput.shape, async (input, extra) => {
1345
1365
  try {
1346
1366
  const fetcher = /* @__PURE__ */ __name(() => api.getJson(`/v1/status/${encodeURIComponent(input.taskId)}`), "fetcher");
1347
1367
  const signal = extra?.signal;
@@ -1558,7 +1578,8 @@ var LandingInput = z3.object({
1558
1578
  competitorScanEnabled: CreativeRefs.competitorScanEnabled,
1559
1579
  brandId: CreativeRefs.brandId,
1560
1580
  creativeDirection: CreativeRefs.creativeDirection,
1561
- landingStrategy: LandingStrategyEnum.default("classic").describe('Opcional. Estructura de la landing cl\xE1sica: "classic" (estructura original probada y recomendada; default del primer rollout), "auto" (la IA decide; experimental), "pain_solution" (problema\u2192soluci\xF3n), "social_proof" (confianza y evidencia), "benefits_clarity" (beneficios claros), "offer_value" (promoci\xF3n/valor) o "lifestyle_identity" (estilo de vida). Default "classic".')
1581
+ landingStrategy: LandingStrategyEnum.default("classic").describe('Opcional. Estructura de la landing cl\xE1sica: "classic" (estructura original probada y recomendada; default del primer rollout), "auto" (la IA decide; experimental), "pain_solution" (problema\u2192soluci\xF3n), "social_proof" (confianza y evidencia), "benefits_clarity" (beneficios claros), "offer_value" (promoci\xF3n/valor) o "lifestyle_identity" (estilo de vida). Default "classic".'),
1582
+ landingImageFormat: LandingImageFormatEnum.default("9:16").describe('Opcional. Formato/relaci\xF3n de aspecto de las im\xE1genes de la landing cl\xE1sica: "9:16" (vertical, por defecto), "4:5" (vertical compacto para feed) o "1:1" (cuadrado). Default "9:16".')
1562
1583
  });
1563
1584
  function registerCreativeTools(server, api, { transport = "http" } = {}) {
1564
1585
  server.tool("generate_video_creative", 'Genera UN video creativo independiente. Devuelve un taskId.\n\nREQUERIDOS: images (array de 1-5 fotos), title, primaryAngle, language, country, aspectRatio.\n\nANTES de invocar, PREG\xDANTALE al usuario por price y offer si no los mencion\xF3 \u2014 son los inputs de mayor impacto en conversi\xF3n y nunca debes asumirlos. NO defaultes country/language desde el contexto: preg\xFAntale expl\xEDcitamente. Si el usuario te dice "t\xFA elige" para price/offer, om\xEDtelos.\n\nOTROS OPCIONALES (puedes invocar sin ellos y dejar que la IA elija defaults sensatos): durationSeconds (m\xE1x 15), videoPreset (tipo/narrativa del video), features, cta, scriptNotes (dirige el guion Y el ambiente/escenario/est\xE9tica del video, ej. "en una playa, opulento").\n\nESTILO: v\xEDa MCP todos los videos se generan en estilo "Realista" (render \xFAnico de 15s con audio nativo). El estilo "Multiescena" (30s, multi-toma) NO est\xE1 disponible por MCP por su costo \u2014 si el usuario lo pide, dile que lo genere desde la web.\n\nGUION: el usuario NO escribe el guion desde cero \u2014 la IA lo redacta. Si quiere REVISARLO/EDITARLO antes de renderizar (igual que en la web), pasa `pauseForVideoScriptReview: true`; cuando la tarea quede pausada, usa get_video_script para leer las escenas, ofr\xE9celas al usuario, y llama approve_video_script con las ediciones. Para dirigir el guion ANTES de generar (sin pausar), usa scriptNotes.', VideoInput.shape, async (input) => {
package/dist/stdio.js CHANGED
@@ -110,7 +110,7 @@ var ApiClient = class {
110
110
  };
111
111
 
112
112
  // src/index.ts
113
- var MCP_VERSION = "1.8.1";
113
+ var MCP_VERSION = "1.10.0";
114
114
 
115
115
  // src/tools/tasks.ts
116
116
  import { z as z2 } from "zod";
@@ -402,6 +402,11 @@ var LandingStrategyEnum = z.enum([
402
402
  "offer_value",
403
403
  "lifestyle_identity"
404
404
  ]);
405
+ var LandingImageFormatEnum = z.enum([
406
+ "9:16",
407
+ "4:5",
408
+ "1:1"
409
+ ]);
405
410
  var VideoPresetEnum = z.enum([
406
411
  "auto",
407
412
  "ugc_dynamic",
@@ -530,6 +535,14 @@ var ProductReferenceCandidateGroupingEnum = z.enum([
530
535
  "different_products",
531
536
  "unclear"
532
537
  ]);
538
+ var GapDurationChoiceMirror = z.object({
539
+ angleIndex: z.number().int().nonnegative(),
540
+ recommendedSec: z.union([
541
+ z.literal(15),
542
+ z.literal(30)
543
+ ]),
544
+ estimatedDeltaCredits: z.number().int().nonnegative().optional()
545
+ });
533
546
  function buildSelectedImageUrlsHash(urls) {
534
547
  const input = [
535
548
  ...urls
@@ -1155,7 +1168,8 @@ var CreateProductTaskInput = z2.object({
1155
1168
  competitorScanEnabled: z2.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."),
1156
1169
  brandId: z2.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."),
1157
1170
  creativeDirection: z2.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.'),
1158
- landingStrategy: LandingStrategyEnum.default("classic").describe('Opcional. Estructura de la landing cl\xE1sica cuando landing est\xE1 entre outputs: "classic" (estructura original probada y recomendada; default del primer rollout), "auto" (la IA decide; experimental), "pain_solution", "social_proof", "benefits_clarity", "offer_value" o "lifestyle_identity". Default "classic".')
1171
+ landingStrategy: LandingStrategyEnum.default("classic").describe('Opcional. Estructura de la landing cl\xE1sica cuando landing est\xE1 entre outputs: "classic" (estructura original probada y recomendada; default del primer rollout), "auto" (la IA decide; experimental), "pain_solution", "social_proof", "benefits_clarity", "offer_value" o "lifestyle_identity". Default "classic".'),
1172
+ landingImageFormat: LandingImageFormatEnum.default("9:16").describe('Opcional. Formato/relaci\xF3n de aspecto de las im\xE1genes de la landing cl\xE1sica cuando landing est\xE1 entre outputs: "9:16" (vertical, por defecto), "4:5" (vertical compacto para feed) o "1:1" (cuadrado). Default "9:16".')
1159
1173
  }).strict();
1160
1174
  var GetTaskStatusInput = z2.object({
1161
1175
  taskId: z2.string().min(1),
@@ -1226,7 +1240,12 @@ var StatusForResolveSchema = z2.object({
1226
1240
  customAngleDraft: z2.string().optional(),
1227
1241
  painPointsDraft: z2.string().optional(),
1228
1242
  benefitsDraft: z2.string().optional(),
1229
- featuresDraft: z2.array(z2.string()).optional()
1243
+ featuresDraft: z2.array(z2.string()).optional(),
1244
+ // Informational-only recommendation (see GapDurationChoiceMirror in
1245
+ // shared.ts). Not read by the switch below — v1 has no consent input for
1246
+ // it — mirrored here purely so it survives the parse instead of being
1247
+ // silently stripped by this object's default unknown-key behavior.
1248
+ gapDurationChoice: GapDurationChoiceMirror.optional()
1230
1249
  }).optional()
1231
1250
  }).passthrough();
1232
1251
  var DEFAULT_PRODUCT_TASK_OUTPUTS = [
@@ -1280,6 +1299,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
1280
1299
  "options.brandId": input.brandId,
1281
1300
  "options.creativeDirection": input.creativeDirection,
1282
1301
  "options.landingStrategy": input.landingStrategy,
1302
+ "options.landingImageFormat": input.landingImageFormat,
1283
1303
  url: input.productUrl
1284
1304
  });
1285
1305
  const r = await api.postMultipart("/v1/ingest", {
@@ -1297,7 +1317,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
1297
1317
  throw translateError(e);
1298
1318
  }
1299
1319
  });
1300
- server.tool("get_task_status", 'Devuelve el estado y URLs de outputs de una tarea. Si waitSeconds>0, hace polling hasta que cambie la fase, aparezca `pendingUserAction`, o llegue al timeout (max 120s). Cuando la tarea queda en `done`, la respuesta incluye un segundo bloque markdown con previews inline de las im\xE1genes, links descargables al video MP4 y un enlace a Product Maker para ver el resultado completo.\n\nIMPORTANTE \u2014 `pendingUserAction`: si est\xE1 presente, el pipeline est\xE1 PARADO esperando que el usuario decida algo. Mira el `kind` y llama `resolve_pending_action` con `action: { kind: <mismo kind>, ... }`; sin esto la tarea NUNCA avanza por m\xE1s que esperes. Kinds actuales:\n- `product_reference_confirmation`: el clasificador no est\xE1 seguro si las fotos son variantes del mismo producto o productos distintos. Mu\xE9strale al usuario `targetProductLabel` + `reason`, recoge su respuesta, y usa SOLO valores presentes en `options`.\n- `angle_review_approval`: la IA ya gener\xF3 el \xE1ngulo/revisi\xF3n antes de renderizar. Mu\xE9strale `customAngleDraft`, `painPointsDraft`, `benefitsDraft`, `featuresDraft` si vienen; si no vienen, puedes pedir aprobaci\xF3n general y llamar `resolve_pending_action` con solo `{ kind: "angle_review_approval" }` para aprobar tal cual.\nUse this to check on a task progress; pass waitSeconds for a near-synchronous response.', GetTaskStatusInput.shape, async (input, extra) => {
1320
+ server.tool("get_task_status", 'Devuelve el estado y URLs de outputs de una tarea. Si waitSeconds>0, hace polling hasta que cambie la fase, aparezca `pendingUserAction`, o llegue al timeout (max 120s). Cuando la tarea queda en `done`, la respuesta incluye un segundo bloque markdown con previews inline de las im\xE1genes, links descargables al video MP4 y un enlace a Product Maker para ver el resultado completo.\n\nIMPORTANTE \u2014 `pendingUserAction`: si est\xE1 presente, el pipeline est\xE1 PARADO esperando que el usuario decida algo. Mira el `kind` y llama `resolve_pending_action` con `action: { kind: <mismo kind>, ... }`; sin esto la tarea NUNCA avanza por m\xE1s que esperes. Kinds actuales:\n- `product_reference_confirmation`: el clasificador no est\xE1 seguro si las fotos son variantes del mismo producto o productos distintos. Mu\xE9strale al usuario `targetProductLabel` + `reason`, recoge su respuesta, y usa SOLO valores presentes en `options`.\n- `angle_review_approval`: la IA ya gener\xF3 el \xE1ngulo/revisi\xF3n antes de renderizar. Mu\xE9strale `customAngleDraft`, `painPointsDraft`, `benefitsDraft`, `featuresDraft` si vienen; si no vienen, puedes pedir aprobaci\xF3n general y llamar `resolve_pending_action` con solo `{ kind: "angle_review_approval" }` para aprobar tal cual.\n\nSi ves `gapDurationChoice` (a nivel ra\xEDz de la respuesta, o dentro de `pendingUserAction` cuando el kind es `angle_review_approval`), es solo informativo: indica que el anuncio de referencia dura m\xE1s que la duraci\xF3n cotizada para esta tarea y cu\xE1nto costar\xEDa extenderla a `recommendedSec` segundos (el costo extra viene en `estimatedDeltaCredits`, si est\xE1 disponible), pero el MCP no tiene forma de aceptar ese cambio \u2014 com\xE9ntaselo al usuario y dile que lo active desde la web si le interesa.\nUse this to check on a task progress; pass waitSeconds for a near-synchronous response.', GetTaskStatusInput.shape, async (input, extra) => {
1301
1321
  try {
1302
1322
  const fetcher = /* @__PURE__ */ __name(() => api.getJson(`/v1/status/${encodeURIComponent(input.taskId)}`), "fetcher");
1303
1323
  const signal = extra?.signal;
@@ -1514,7 +1534,8 @@ var LandingInput = z3.object({
1514
1534
  competitorScanEnabled: CreativeRefs.competitorScanEnabled,
1515
1535
  brandId: CreativeRefs.brandId,
1516
1536
  creativeDirection: CreativeRefs.creativeDirection,
1517
- landingStrategy: LandingStrategyEnum.default("classic").describe('Opcional. Estructura de la landing cl\xE1sica: "classic" (estructura original probada y recomendada; default del primer rollout), "auto" (la IA decide; experimental), "pain_solution" (problema\u2192soluci\xF3n), "social_proof" (confianza y evidencia), "benefits_clarity" (beneficios claros), "offer_value" (promoci\xF3n/valor) o "lifestyle_identity" (estilo de vida). Default "classic".')
1537
+ landingStrategy: LandingStrategyEnum.default("classic").describe('Opcional. Estructura de la landing cl\xE1sica: "classic" (estructura original probada y recomendada; default del primer rollout), "auto" (la IA decide; experimental), "pain_solution" (problema\u2192soluci\xF3n), "social_proof" (confianza y evidencia), "benefits_clarity" (beneficios claros), "offer_value" (promoci\xF3n/valor) o "lifestyle_identity" (estilo de vida). Default "classic".'),
1538
+ landingImageFormat: LandingImageFormatEnum.default("9:16").describe('Opcional. Formato/relaci\xF3n de aspecto de las im\xE1genes de la landing cl\xE1sica: "9:16" (vertical, por defecto), "4:5" (vertical compacto para feed) o "1:1" (cuadrado). Default "9:16".')
1518
1539
  });
1519
1540
  function registerCreativeTools(server, api, { transport = "http" } = {}) {
1520
1541
  server.tool("generate_video_creative", 'Genera UN video creativo independiente. Devuelve un taskId.\n\nREQUERIDOS: images (array de 1-5 fotos), title, primaryAngle, language, country, aspectRatio.\n\nANTES de invocar, PREG\xDANTALE al usuario por price y offer si no los mencion\xF3 \u2014 son los inputs de mayor impacto en conversi\xF3n y nunca debes asumirlos. NO defaultes country/language desde el contexto: preg\xFAntale expl\xEDcitamente. Si el usuario te dice "t\xFA elige" para price/offer, om\xEDtelos.\n\nOTROS OPCIONALES (puedes invocar sin ellos y dejar que la IA elija defaults sensatos): durationSeconds (m\xE1x 15), videoPreset (tipo/narrativa del video), features, cta, scriptNotes (dirige el guion Y el ambiente/escenario/est\xE9tica del video, ej. "en una playa, opulento").\n\nESTILO: v\xEDa MCP todos los videos se generan en estilo "Realista" (render \xFAnico de 15s con audio nativo). El estilo "Multiescena" (30s, multi-toma) NO est\xE1 disponible por MCP por su costo \u2014 si el usuario lo pide, dile que lo genere desde la web.\n\nGUION: el usuario NO escribe el guion desde cero \u2014 la IA lo redacta. Si quiere REVISARLO/EDITARLO antes de renderizar (igual que en la web), pasa `pauseForVideoScriptReview: true`; cuando la tarea quede pausada, usa get_video_script para leer las escenas, ofr\xE9celas al usuario, y llama approve_video_script con las ediciones. Para dirigir el guion ANTES de generar (sin pausar), usa scriptNotes.', VideoInput.shape, async (input) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "1.8.1",
3
+ "version": "1.10.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "Product Maker MCP server — connect Claude Desktop, Claude Code, ChatGPT, or Gemini to Product Maker AI to generate dropshipping landing pages, UGC videos, and ad creatives, and publish to Shopify and Meta Ads from your AI assistant.",