@productmaker/mcp 1.2.0 → 1.2.1
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 +12 -6
- package/dist/stdio.js +12 -6
- 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.2.1";
|
|
117
117
|
|
|
118
118
|
// src/tools/tasks.ts
|
|
119
119
|
import { z as z2 } from "zod";
|
|
@@ -1185,7 +1185,8 @@ var CreateProductTaskInput = z2.object({
|
|
|
1185
1185
|
"video",
|
|
1186
1186
|
"image"
|
|
1187
1187
|
])).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.'),
|
|
1188
|
-
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.")
|
|
1188
|
+
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."),
|
|
1189
|
+
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.")
|
|
1189
1190
|
}).strict();
|
|
1190
1191
|
var GetTaskStatusInput = z2.object({
|
|
1191
1192
|
taskId: z2.string().min(1),
|
|
@@ -1290,6 +1291,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
|
|
|
1290
1291
|
"options.angleNarratives": input.angleNarratives,
|
|
1291
1292
|
"options.selectedOutputs": input.outputs,
|
|
1292
1293
|
"options.competitorScanEnabled": input.competitorScanEnabled,
|
|
1294
|
+
"options.brandId": input.brandId,
|
|
1293
1295
|
url: input.productUrl
|
|
1294
1296
|
});
|
|
1295
1297
|
const r = await api.postMultipart("/v1/ingest", {
|
|
@@ -1438,7 +1440,8 @@ var CreativeRefs = {
|
|
|
1438
1440
|
productLabel: z3.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.'),
|
|
1439
1441
|
buyerPersona: z3.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.'),
|
|
1440
1442
|
isCombo: z3.boolean().optional().describe("Opcional. Si true, el creativo presenta el producto como combo/pack. Default false."),
|
|
1441
|
-
competitorScanEnabled: z3.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.")
|
|
1443
|
+
competitorScanEnabled: z3.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."),
|
|
1444
|
+
brandId: z3.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.")
|
|
1442
1445
|
};
|
|
1443
1446
|
var VideoInput = z3.object({
|
|
1444
1447
|
images: CreativeRefs.images,
|
|
@@ -1463,7 +1466,8 @@ var VideoInput = z3.object({
|
|
|
1463
1466
|
cta: z3.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.'),
|
|
1464
1467
|
scriptNotes: z3.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 \u2014 para editar el guion palabra-por-palabra, pasa `pauseForVideoScriptReview: true` y usa get_video_script / approve_video_script tras la pausa.'),
|
|
1465
1468
|
pauseForVideoScriptReview: z3.boolean().optional().describe("Opcional. Si true, la tarea pausa despu\xE9s de generar el guion y antes de renderizar. \xDAsalo cuando el usuario quiera editar el guion antes de gastar cr\xE9ditos en el video. Tras la pausa: get_video_script para leerlo, approve_video_script para aprobar (con o sin ediciones). Default false."),
|
|
1466
|
-
competitorScanEnabled: CreativeRefs.competitorScanEnabled
|
|
1469
|
+
competitorScanEnabled: CreativeRefs.competitorScanEnabled,
|
|
1470
|
+
brandId: CreativeRefs.brandId
|
|
1467
1471
|
}).strict();
|
|
1468
1472
|
var imageStyleList = ImageCreativeStyleEnum.options.join(" | ");
|
|
1469
1473
|
var archetypeList = ImageCreativeArchetypeEnum.options.join(" | ");
|
|
@@ -1493,7 +1497,8 @@ var ImageInput = z3.object({
|
|
|
1493
1497
|
productContext: CreativeRefs.productContext,
|
|
1494
1498
|
productLabel: CreativeRefs.productLabel,
|
|
1495
1499
|
isCombo: CreativeRefs.isCombo,
|
|
1496
|
-
competitorScanEnabled: CreativeRefs.competitorScanEnabled
|
|
1500
|
+
competitorScanEnabled: CreativeRefs.competitorScanEnabled,
|
|
1501
|
+
brandId: CreativeRefs.brandId
|
|
1497
1502
|
});
|
|
1498
1503
|
var LandingInput = z3.object({
|
|
1499
1504
|
images: CreativeRefs.images,
|
|
@@ -1507,7 +1512,8 @@ var LandingInput = z3.object({
|
|
|
1507
1512
|
productLabel: CreativeRefs.productLabel,
|
|
1508
1513
|
paymentMethods: z3.string().optional().describe('Opcional. M\xE9todos de pago a mostrar (lista libre). Ej. "Tarjeta, PSE, Nequi, Contraentrega". Si se omite, la IA usa los m\xE1s comunes del pa\xEDs.'),
|
|
1509
1514
|
isCombo: CreativeRefs.isCombo,
|
|
1510
|
-
competitorScanEnabled: CreativeRefs.competitorScanEnabled
|
|
1515
|
+
competitorScanEnabled: CreativeRefs.competitorScanEnabled,
|
|
1516
|
+
brandId: CreativeRefs.brandId
|
|
1511
1517
|
});
|
|
1512
1518
|
function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
1513
1519
|
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.\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.2.1";
|
|
114
114
|
|
|
115
115
|
// src/tools/tasks.ts
|
|
116
116
|
import { z as z2 } from "zod";
|
|
@@ -1141,7 +1141,8 @@ var CreateProductTaskInput = z2.object({
|
|
|
1141
1141
|
"video",
|
|
1142
1142
|
"image"
|
|
1143
1143
|
])).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.'),
|
|
1144
|
-
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.")
|
|
1144
|
+
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."),
|
|
1145
|
+
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.")
|
|
1145
1146
|
}).strict();
|
|
1146
1147
|
var GetTaskStatusInput = z2.object({
|
|
1147
1148
|
taskId: z2.string().min(1),
|
|
@@ -1246,6 +1247,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
|
|
|
1246
1247
|
"options.angleNarratives": input.angleNarratives,
|
|
1247
1248
|
"options.selectedOutputs": input.outputs,
|
|
1248
1249
|
"options.competitorScanEnabled": input.competitorScanEnabled,
|
|
1250
|
+
"options.brandId": input.brandId,
|
|
1249
1251
|
url: input.productUrl
|
|
1250
1252
|
});
|
|
1251
1253
|
const r = await api.postMultipart("/v1/ingest", {
|
|
@@ -1394,7 +1396,8 @@ var CreativeRefs = {
|
|
|
1394
1396
|
productLabel: z3.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.'),
|
|
1395
1397
|
buyerPersona: z3.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.'),
|
|
1396
1398
|
isCombo: z3.boolean().optional().describe("Opcional. Si true, el creativo presenta el producto como combo/pack. Default false."),
|
|
1397
|
-
competitorScanEnabled: z3.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.")
|
|
1399
|
+
competitorScanEnabled: z3.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."),
|
|
1400
|
+
brandId: z3.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.")
|
|
1398
1401
|
};
|
|
1399
1402
|
var VideoInput = z3.object({
|
|
1400
1403
|
images: CreativeRefs.images,
|
|
@@ -1419,7 +1422,8 @@ var VideoInput = z3.object({
|
|
|
1419
1422
|
cta: z3.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.'),
|
|
1420
1423
|
scriptNotes: z3.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 \u2014 para editar el guion palabra-por-palabra, pasa `pauseForVideoScriptReview: true` y usa get_video_script / approve_video_script tras la pausa.'),
|
|
1421
1424
|
pauseForVideoScriptReview: z3.boolean().optional().describe("Opcional. Si true, la tarea pausa despu\xE9s de generar el guion y antes de renderizar. \xDAsalo cuando el usuario quiera editar el guion antes de gastar cr\xE9ditos en el video. Tras la pausa: get_video_script para leerlo, approve_video_script para aprobar (con o sin ediciones). Default false."),
|
|
1422
|
-
competitorScanEnabled: CreativeRefs.competitorScanEnabled
|
|
1425
|
+
competitorScanEnabled: CreativeRefs.competitorScanEnabled,
|
|
1426
|
+
brandId: CreativeRefs.brandId
|
|
1423
1427
|
}).strict();
|
|
1424
1428
|
var imageStyleList = ImageCreativeStyleEnum.options.join(" | ");
|
|
1425
1429
|
var archetypeList = ImageCreativeArchetypeEnum.options.join(" | ");
|
|
@@ -1449,7 +1453,8 @@ var ImageInput = z3.object({
|
|
|
1449
1453
|
productContext: CreativeRefs.productContext,
|
|
1450
1454
|
productLabel: CreativeRefs.productLabel,
|
|
1451
1455
|
isCombo: CreativeRefs.isCombo,
|
|
1452
|
-
competitorScanEnabled: CreativeRefs.competitorScanEnabled
|
|
1456
|
+
competitorScanEnabled: CreativeRefs.competitorScanEnabled,
|
|
1457
|
+
brandId: CreativeRefs.brandId
|
|
1453
1458
|
});
|
|
1454
1459
|
var LandingInput = z3.object({
|
|
1455
1460
|
images: CreativeRefs.images,
|
|
@@ -1463,7 +1468,8 @@ var LandingInput = z3.object({
|
|
|
1463
1468
|
productLabel: CreativeRefs.productLabel,
|
|
1464
1469
|
paymentMethods: z3.string().optional().describe('Opcional. M\xE9todos de pago a mostrar (lista libre). Ej. "Tarjeta, PSE, Nequi, Contraentrega". Si se omite, la IA usa los m\xE1s comunes del pa\xEDs.'),
|
|
1465
1470
|
isCombo: CreativeRefs.isCombo,
|
|
1466
|
-
competitorScanEnabled: CreativeRefs.competitorScanEnabled
|
|
1471
|
+
competitorScanEnabled: CreativeRefs.competitorScanEnabled,
|
|
1472
|
+
brandId: CreativeRefs.brandId
|
|
1467
1473
|
});
|
|
1468
1474
|
function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
1469
1475
|
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.\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.2.
|
|
3
|
+
"version": "1.2.1",
|
|
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.",
|