@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 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.9.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.",