@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 +26 -5
- package/dist/stdio.js +26 -5
- package/package.json +1 -1
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.
|
|
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.
|
|
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.
|
|
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.",
|