@productmaker/mcp 0.9.0 → 0.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 +13 -1
- package/dist/stdio.js +13 -1
- package/package.json +1 -1
package/dist/http.js
CHANGED
|
@@ -582,6 +582,10 @@ function resolveVideoTier(tier) {
|
|
|
582
582
|
return tier === "basic" ? "grok" : "standard";
|
|
583
583
|
}
|
|
584
584
|
__name(resolveVideoTier, "resolveVideoTier");
|
|
585
|
+
var VideoResolutionEnum = z.enum([
|
|
586
|
+
"480p",
|
|
587
|
+
"720p"
|
|
588
|
+
]);
|
|
585
589
|
var VideoStyleEnum = z.enum([
|
|
586
590
|
"ugc",
|
|
587
591
|
"cartoon_3d",
|
|
@@ -931,6 +935,7 @@ var CreateProductTaskInput = z2.object({
|
|
|
931
935
|
offer: z2.string().optional().describe('Oferta o promoci\xF3n a destacar. Ej. "2x1", "Env\xEDo gratis hoy", "50% OFF". Opcional pero MUY IMPACTANTE: si el usuario no lo mencion\xF3, PREG\xDANTALE antes de invocar (es v\xE1lido que diga "sin oferta"). Si te dice "t\xFA elige", om\xEDtelo.'),
|
|
932
936
|
videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla (en la web es el \xFAnico dropdown). Default "auto" (la IA escoge tras analizar el producto). Opciones: "auto", "ugc_dynamic" (UGC testimonial), "ugc_unboxing_chaos" (unboxing agresivo), "ugc_curiosity_reveal" (hook con producto oculto), "ugc_listicle_3" (3 razones, ideal 30s), "ugc_skeptic_confession" (esc\xE9ptico\u2192conversi\xF3n, ideal 30s), "ugc_demo_review" (demo en uso), "problem_solution" (problema\u2192producto\u2192CTA), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla), "product_showcase" (solo producto, sin actor), "wearable_showcase" (ropa/accesorios puestos). Si el usuario pide algo fuera de esta lista (ej. "estilo anime"), p\xEDdele una opci\xF3n v\xE1lida.'),
|
|
933
937
|
videoTier: VideoTierEnum.optional().describe('Opcional. Estilo del video (en la web la etiqueta es "\xBFCalidad de video?", 2 opciones \u2014 sin escalera de calidad, son ESTILOS distintos). "basic" = "Realista" (RECOMENDADO por la web): render de 15s con audio nativo, el m\xE1s natural \u2014 S\xD3LO v\xE1lido si la duraci\xF3n del video es 15s. "standard" = "Multiescena": m\xFAltiples tomas, hasta 30s. Si el usuario no menciona estilo, OMITE este campo y el backend usa su default. Para duraci\xF3n 30s s\xF3lo aplica "standard" (Realista est\xE1 vetada).'),
|
|
938
|
+
videoResolution: VideoResolutionEnum.optional().describe('Opcional. Resoluci\xF3n del render \u2014 aplica S\xD3LO al tier "basic" (Realista); "standard" la deriva solo. En la web se pregunta "\xBFResoluci\xF3n del video?" tras elegir "basic". "720p" = m\xE1xima nitidez (default si se omite); "480p" = m\xE1s econ\xF3mico (~la mitad del precio). Si el usuario no menciona resoluci\xF3n, OMITE este campo (el backend usa 720p para basic).'),
|
|
934
939
|
multiAngleVideos: z2.boolean().optional().describe("Opcional. Si true, genera m\xFAltiples \xE1ngulos de venta en paralelo (3-5 videos). Si false/omitido, genera 1 video del \xE1ngulo principal. Default false."),
|
|
935
940
|
angleNarratives: NarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional, override avanzado). Usa los mismos identificadores de narrativa que videoPreset (ej. "animated_problem_pixar", "review", "ugc_skeptic_confession"). angleNarratives[i] fuerza la narrativa del \xE1ngulo en la posici\xF3n i; si la lista es m\xE1s corta que la cantidad de \xE1ngulos, las posiciones restantes las elige la IA. Requiere multiAngleVideos:true para que haya varios \xE1ngulos. Si se omite, todas las narrativas se auto-seleccionan seg\xFAn el producto.'),
|
|
936
941
|
outputs: z2.array(z2.enum([
|
|
@@ -1015,6 +1020,11 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
|
|
|
1015
1020
|
"options.videoStyle": resolved?.videoStyle,
|
|
1016
1021
|
"options.narrativeStyle": resolved?.narrativeStyle,
|
|
1017
1022
|
"options.videoTier": wireTier,
|
|
1023
|
+
// Resolution is meaningful ONLY for the basic/grok tier; for every
|
|
1024
|
+
// other tier the backend derives it. Forward it ONLY for grok so the
|
|
1025
|
+
// MCP never presents a "user choice where there is none" (the web has
|
|
1026
|
+
// no resolution knob for standard) — for non-grok it's dropped.
|
|
1027
|
+
"options.videoResolution": wireTier === "grok" ? input.videoResolution : void 0,
|
|
1018
1028
|
"options.multiAngleVideos": input.multiAngleVideos,
|
|
1019
1029
|
"options.angleNarratives": input.angleNarratives,
|
|
1020
1030
|
"options.selectedOutputs": input.outputs,
|
|
@@ -1173,6 +1183,7 @@ var VideoInput = z3.object({
|
|
|
1173
1183
|
durationSeconds: z3.number().int().min(5).max(60).optional().describe("Opcional. Duraci\xF3n del video en segundos (5-60). Default 15s. Para hooks cortos usa 8, para storytelling usa 30."),
|
|
1174
1184
|
videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla (en la web es el \xFAnico dropdown). Default "auto" (la IA escoge tras analizar el producto). Opciones: "auto", "ugc_dynamic" (UGC cl\xE1sico testimonial multi-hook), "ugc_unboxing_chaos" (unboxing agresivo), "ugc_curiosity_reveal" (hook con producto oculto), "ugc_listicle_3" (3 razones numeradas, recomendado 30s), "ugc_skeptic_confession" (esc\xE9ptico\u2192conversi\xF3n, recomendado 30s), "ugc_demo_review" (demo en uso a lo largo de d\xEDas), "problem_solution" (problema\u2192producto\u2192CTA), "pixar_problem" (problema animado 3D estilo Pixar), "pixar_sassy" (producto que habla con personalidad), "product_showcase" (sin actor, solo producto), "wearable_showcase" (ropa/accesorios puestos).'),
|
|
1175
1185
|
videoTier: VideoTierEnum.optional().describe('Opcional. Estilo del video (en la web la etiqueta es "\xBFCalidad de video?", 2 opciones \u2014 sin escalera de calidad, son ESTILOS distintos). "basic" = "Realista" (RECOMENDADO por la web): render de 15s con audio nativo, el m\xE1s natural \u2014 S\xD3LO v\xE1lido cuando durationSeconds \u2264 15 (el handler lo valida). "standard" = "Multiescena": m\xFAltiples tomas, hasta 30s. Si la duraci\xF3n es 30s, s\xF3lo aplica "standard". Si el usuario no menciona estilo, OMITE este campo y el backend usa su default.'),
|
|
1186
|
+
videoResolution: VideoResolutionEnum.optional().describe('Opcional. Resoluci\xF3n del render \u2014 aplica S\xD3LO al tier "basic" (Realista); el tier "standard" la deriva solo. En la web se pregunta "\xBFResoluci\xF3n del video?" tras elegir "basic". "720p" = m\xE1xima nitidez (default si se omite); "480p" = m\xE1s econ\xF3mico (~la mitad del precio). Si el usuario no menciona resoluci\xF3n, OMITE este campo (el backend usa 720p para basic).'),
|
|
1176
1187
|
features: z3.array(z3.string()).optional().describe('Opcional. Lista de features/beneficios clave a mencionar. Ej. ["resistente al agua", "bater\xEDa 24h", "carga inal\xE1mbrica"].'),
|
|
1177
1188
|
price: CreativeRefs.price,
|
|
1178
1189
|
offer: CreativeRefs.offer,
|
|
@@ -1226,7 +1237,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
1226
1237
|
}
|
|
1227
1238
|
const resolved = resolveVideoPreset(input.videoPreset);
|
|
1228
1239
|
const wireTier = resolveVideoTier(input.videoTier);
|
|
1229
|
-
const { videoTier: _publicTier, ...rest } = input;
|
|
1240
|
+
const { videoTier: _publicTier, videoResolution: _vr, ...rest } = input;
|
|
1230
1241
|
const wirePayload = {
|
|
1231
1242
|
...rest
|
|
1232
1243
|
};
|
|
@@ -1235,6 +1246,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
1235
1246
|
wirePayload.narrativeStyle = resolved.narrativeStyle;
|
|
1236
1247
|
}
|
|
1237
1248
|
if (wireTier !== void 0) wirePayload.videoTier = wireTier;
|
|
1249
|
+
if (wireTier === "grok" && input.videoResolution) wirePayload.videoResolution = input.videoResolution;
|
|
1238
1250
|
return await submitCreative(api, {
|
|
1239
1251
|
path: "/v1/creatives/videos",
|
|
1240
1252
|
estimatedSeconds: 300,
|
package/dist/stdio.js
CHANGED
|
@@ -579,6 +579,10 @@ function resolveVideoTier(tier) {
|
|
|
579
579
|
return tier === "basic" ? "grok" : "standard";
|
|
580
580
|
}
|
|
581
581
|
__name(resolveVideoTier, "resolveVideoTier");
|
|
582
|
+
var VideoResolutionEnum = z.enum([
|
|
583
|
+
"480p",
|
|
584
|
+
"720p"
|
|
585
|
+
]);
|
|
582
586
|
var VideoStyleEnum = z.enum([
|
|
583
587
|
"ugc",
|
|
584
588
|
"cartoon_3d",
|
|
@@ -887,6 +891,7 @@ var CreateProductTaskInput = z2.object({
|
|
|
887
891
|
offer: z2.string().optional().describe('Oferta o promoci\xF3n a destacar. Ej. "2x1", "Env\xEDo gratis hoy", "50% OFF". Opcional pero MUY IMPACTANTE: si el usuario no lo mencion\xF3, PREG\xDANTALE antes de invocar (es v\xE1lido que diga "sin oferta"). Si te dice "t\xFA elige", om\xEDtelo.'),
|
|
888
892
|
videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla (en la web es el \xFAnico dropdown). Default "auto" (la IA escoge tras analizar el producto). Opciones: "auto", "ugc_dynamic" (UGC testimonial), "ugc_unboxing_chaos" (unboxing agresivo), "ugc_curiosity_reveal" (hook con producto oculto), "ugc_listicle_3" (3 razones, ideal 30s), "ugc_skeptic_confession" (esc\xE9ptico\u2192conversi\xF3n, ideal 30s), "ugc_demo_review" (demo en uso), "problem_solution" (problema\u2192producto\u2192CTA), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla), "product_showcase" (solo producto, sin actor), "wearable_showcase" (ropa/accesorios puestos). Si el usuario pide algo fuera de esta lista (ej. "estilo anime"), p\xEDdele una opci\xF3n v\xE1lida.'),
|
|
889
893
|
videoTier: VideoTierEnum.optional().describe('Opcional. Estilo del video (en la web la etiqueta es "\xBFCalidad de video?", 2 opciones \u2014 sin escalera de calidad, son ESTILOS distintos). "basic" = "Realista" (RECOMENDADO por la web): render de 15s con audio nativo, el m\xE1s natural \u2014 S\xD3LO v\xE1lido si la duraci\xF3n del video es 15s. "standard" = "Multiescena": m\xFAltiples tomas, hasta 30s. Si el usuario no menciona estilo, OMITE este campo y el backend usa su default. Para duraci\xF3n 30s s\xF3lo aplica "standard" (Realista est\xE1 vetada).'),
|
|
894
|
+
videoResolution: VideoResolutionEnum.optional().describe('Opcional. Resoluci\xF3n del render \u2014 aplica S\xD3LO al tier "basic" (Realista); "standard" la deriva solo. En la web se pregunta "\xBFResoluci\xF3n del video?" tras elegir "basic". "720p" = m\xE1xima nitidez (default si se omite); "480p" = m\xE1s econ\xF3mico (~la mitad del precio). Si el usuario no menciona resoluci\xF3n, OMITE este campo (el backend usa 720p para basic).'),
|
|
890
895
|
multiAngleVideos: z2.boolean().optional().describe("Opcional. Si true, genera m\xFAltiples \xE1ngulos de venta en paralelo (3-5 videos). Si false/omitido, genera 1 video del \xE1ngulo principal. Default false."),
|
|
891
896
|
angleNarratives: NarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional, override avanzado). Usa los mismos identificadores de narrativa que videoPreset (ej. "animated_problem_pixar", "review", "ugc_skeptic_confession"). angleNarratives[i] fuerza la narrativa del \xE1ngulo en la posici\xF3n i; si la lista es m\xE1s corta que la cantidad de \xE1ngulos, las posiciones restantes las elige la IA. Requiere multiAngleVideos:true para que haya varios \xE1ngulos. Si se omite, todas las narrativas se auto-seleccionan seg\xFAn el producto.'),
|
|
892
897
|
outputs: z2.array(z2.enum([
|
|
@@ -971,6 +976,11 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
|
|
|
971
976
|
"options.videoStyle": resolved?.videoStyle,
|
|
972
977
|
"options.narrativeStyle": resolved?.narrativeStyle,
|
|
973
978
|
"options.videoTier": wireTier,
|
|
979
|
+
// Resolution is meaningful ONLY for the basic/grok tier; for every
|
|
980
|
+
// other tier the backend derives it. Forward it ONLY for grok so the
|
|
981
|
+
// MCP never presents a "user choice where there is none" (the web has
|
|
982
|
+
// no resolution knob for standard) — for non-grok it's dropped.
|
|
983
|
+
"options.videoResolution": wireTier === "grok" ? input.videoResolution : void 0,
|
|
974
984
|
"options.multiAngleVideos": input.multiAngleVideos,
|
|
975
985
|
"options.angleNarratives": input.angleNarratives,
|
|
976
986
|
"options.selectedOutputs": input.outputs,
|
|
@@ -1129,6 +1139,7 @@ var VideoInput = z3.object({
|
|
|
1129
1139
|
durationSeconds: z3.number().int().min(5).max(60).optional().describe("Opcional. Duraci\xF3n del video en segundos (5-60). Default 15s. Para hooks cortos usa 8, para storytelling usa 30."),
|
|
1130
1140
|
videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla (en la web es el \xFAnico dropdown). Default "auto" (la IA escoge tras analizar el producto). Opciones: "auto", "ugc_dynamic" (UGC cl\xE1sico testimonial multi-hook), "ugc_unboxing_chaos" (unboxing agresivo), "ugc_curiosity_reveal" (hook con producto oculto), "ugc_listicle_3" (3 razones numeradas, recomendado 30s), "ugc_skeptic_confession" (esc\xE9ptico\u2192conversi\xF3n, recomendado 30s), "ugc_demo_review" (demo en uso a lo largo de d\xEDas), "problem_solution" (problema\u2192producto\u2192CTA), "pixar_problem" (problema animado 3D estilo Pixar), "pixar_sassy" (producto que habla con personalidad), "product_showcase" (sin actor, solo producto), "wearable_showcase" (ropa/accesorios puestos).'),
|
|
1131
1141
|
videoTier: VideoTierEnum.optional().describe('Opcional. Estilo del video (en la web la etiqueta es "\xBFCalidad de video?", 2 opciones \u2014 sin escalera de calidad, son ESTILOS distintos). "basic" = "Realista" (RECOMENDADO por la web): render de 15s con audio nativo, el m\xE1s natural \u2014 S\xD3LO v\xE1lido cuando durationSeconds \u2264 15 (el handler lo valida). "standard" = "Multiescena": m\xFAltiples tomas, hasta 30s. Si la duraci\xF3n es 30s, s\xF3lo aplica "standard". Si el usuario no menciona estilo, OMITE este campo y el backend usa su default.'),
|
|
1142
|
+
videoResolution: VideoResolutionEnum.optional().describe('Opcional. Resoluci\xF3n del render \u2014 aplica S\xD3LO al tier "basic" (Realista); el tier "standard" la deriva solo. En la web se pregunta "\xBFResoluci\xF3n del video?" tras elegir "basic". "720p" = m\xE1xima nitidez (default si se omite); "480p" = m\xE1s econ\xF3mico (~la mitad del precio). Si el usuario no menciona resoluci\xF3n, OMITE este campo (el backend usa 720p para basic).'),
|
|
1132
1143
|
features: z3.array(z3.string()).optional().describe('Opcional. Lista de features/beneficios clave a mencionar. Ej. ["resistente al agua", "bater\xEDa 24h", "carga inal\xE1mbrica"].'),
|
|
1133
1144
|
price: CreativeRefs.price,
|
|
1134
1145
|
offer: CreativeRefs.offer,
|
|
@@ -1182,7 +1193,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
1182
1193
|
}
|
|
1183
1194
|
const resolved = resolveVideoPreset(input.videoPreset);
|
|
1184
1195
|
const wireTier = resolveVideoTier(input.videoTier);
|
|
1185
|
-
const { videoTier: _publicTier, ...rest } = input;
|
|
1196
|
+
const { videoTier: _publicTier, videoResolution: _vr, ...rest } = input;
|
|
1186
1197
|
const wirePayload = {
|
|
1187
1198
|
...rest
|
|
1188
1199
|
};
|
|
@@ -1191,6 +1202,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
1191
1202
|
wirePayload.narrativeStyle = resolved.narrativeStyle;
|
|
1192
1203
|
}
|
|
1193
1204
|
if (wireTier !== void 0) wirePayload.videoTier = wireTier;
|
|
1205
|
+
if (wireTier === "grok" && input.videoResolution) wirePayload.videoResolution = input.videoResolution;
|
|
1194
1206
|
return await submitCreative(api, {
|
|
1195
1207
|
path: "/v1/creatives/videos",
|
|
1196
1208
|
estimatedSeconds: 300,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@productmaker/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.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.",
|