@productmaker/mcp 6.2.0 → 6.3.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.
Files changed (3) hide show
  1. package/dist/http.js +62 -15
  2. package/dist/stdio.js +62 -15
  3. package/package.json +1 -1
package/dist/http.js CHANGED
@@ -10586,7 +10586,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10586
10586
  ], [
10587
10587
  "creative_variant"
10588
10588
  ]),
10589
- defineCapability("create_product_task", "ba700dbec8fb6454d55f996ae4567b9280256ae3b62fceb77fd729b9aa21425c", "credit_consuming", "creative", [
10589
+ defineCapability("create_product_task", "13a037c7365cc4c30d81a1d89515e663a3de92ffd4138a117fa32ecb629bca44", "credit_consuming", "creative", [
10590
10590
  "credit_consuming",
10591
10591
  "state_change"
10592
10592
  ], [
@@ -13167,7 +13167,7 @@ var ApiClient = class {
13167
13167
  };
13168
13168
 
13169
13169
  // src/index.ts
13170
- var MCP_VERSION = "6.2.0";
13170
+ var MCP_VERSION = "6.3.0";
13171
13171
 
13172
13172
  // src/meta-upload-app.ts
13173
13173
  import { readFileSync } from "fs";
@@ -13520,6 +13520,35 @@ function sleep(ms, signal) {
13520
13520
  }
13521
13521
  __name(sleep, "sleep");
13522
13522
 
13523
+ // src/polling-continuation.ts
13524
+ var NO_CONTINUATION_STATUSES = /* @__PURE__ */ new Set([
13525
+ "done",
13526
+ "complete",
13527
+ "error",
13528
+ "awaiting_review"
13529
+ ]);
13530
+ var SUGGESTED_WAIT_SECONDS = 45;
13531
+ function buildPollingContinuation(snapshot, opts = {}) {
13532
+ if (NO_CONTINUATION_STATUSES.has(snapshot.status)) return null;
13533
+ if (snapshot.pendingUserAction != null) return null;
13534
+ const suggestedWaitSeconds = opts.suggestedWaitSeconds ?? SUGGESTED_WAIT_SECONDS;
13535
+ return {
13536
+ stillRunning: true,
13537
+ nextAction: "continue_polling_get_task_status",
13538
+ suggestedWaitSeconds,
13539
+ instruction: `La tarea SIGUE CORRIENDO: no termin\xF3, no fall\xF3 y todav\xEDa no hay nada que el usuario deba revisar. Esto NO es un error ni un final de trabajo.
13540
+
13541
+ REGLA: no termines tu turno sin dejar ARMADA la siguiente consulta. Cerrar el turno est\xE1 bien; cerrarlo sin nada que vuelva a preguntar es lo que deja al usuario esperando para siempre una revisi\xF3n que nunca le vas a mostrar.
13542
+
13543
+ Elige seg\xFAn lo que tu host permita:
13544
+ 1. PREFERIDO \u2014 si puedes agendar un mensaje o turno futuro (mensajes programados, recordatorios): agenda uno a ~2 minutos que vuelva a llamar get_task_status con este mismo taskId, dile al usuario que le avisas, y ah\xED s\xED cierra el turno. Es la mejor opci\xF3n: el usuario queda libre y t\xFA vuelves solo.
13545
+ 2. SI NO PUEDES AGENDAR: llama otra vez a get_task_status AHORA MISMO con waitSeconds=${suggestedWaitSeconds}, y repite hasta un estado terminal (done/error) o una acci\xF3n pendiente del usuario. NO cierres el turno con un "te aviso cuando est\xE9": nadie te va a volver a despertar.
13546
+
13547
+ No subas waitSeconds por encima de ${suggestedWaitSeconds} salvo que sepas que tu host aguanta llamadas m\xE1s largas: muchos clientes MCP cancelan a los 60 s y ver\xEDas un error de timeout en vez del estado.`
13548
+ };
13549
+ }
13550
+ __name(buildPollingContinuation, "buildPollingContinuation");
13551
+
13523
13552
  // src/errors.ts
13524
13553
  import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
13525
13554
 
@@ -15205,7 +15234,7 @@ var CreateProductTaskInput = z54.object({
15205
15234
  paymentMethods: z54.string().min(1).max(240).optional().describe('Opcional. M\xE9todos de pago que puede mostrar la landing. Ej. "Tarjeta, PSE, Nequi, Contraentrega". Si se omite, la landing no muestra m\xE9todos de pago.'),
15206
15235
  productContext: z54.string().max(3e3).optional().describe("Opcional. Informacion adicional del producto que la IA debe usar como contexto prioritario: uso real, comprador, restricciones, diferenciadores o direccion creativa. No reemplaza la investigacion de competencia; si hay competencia, guia el primer angulo y los outputs no deben contradecirlo."),
15207
15236
  productLabel: z54.string().trim().max(80).optional().describe('Opcional. Qu\xE9 es el producto, en pocas palabras (ej. "quita pelusas para ropa"). Es AUTORITATIVO: si lo env\xEDas, la IA usa esta identidad y no la reemplaza por otra categor\xEDa. Si lo omites, la IA detecta el producto desde la imagen.'),
15208
- videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena). Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (una regla visual experimental original), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
15237
+ videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena). Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (idea imposible: un truco visual que en la vida real no podr\xEDa pasar, y al cierre la invitaci\xF3n a comprar), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
15209
15238
  durationSeconds: z54.union([
15210
15239
  z54.literal(15),
15211
15240
  z54.literal(30)
@@ -15752,18 +15781,36 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
15752
15781
  const snapshot = await pollStatus(fetcher, input.waitSeconds ?? 0, signal);
15753
15782
  if (snapshot.status !== "done") {
15754
15783
  const review = renderPendingActionMarkdown(snapshot);
15755
- return review ? {
15756
- // Human-visible content stays presentation-only. Resolution
15757
- // refetches the server-owned snapshot, so protocol IDs/hashes
15758
- // never need to be narrated to the user.
15759
- content: [
15760
- {
15761
- type: "text",
15762
- text: review
15763
- }
15764
- ],
15765
- structuredContent: snapshot
15766
- } : asText(snapshot);
15784
+ if (review) {
15785
+ return {
15786
+ content: [
15787
+ {
15788
+ type: "text",
15789
+ text: review
15790
+ }
15791
+ ],
15792
+ structuredContent: snapshot
15793
+ };
15794
+ }
15795
+ const continuation = buildPollingContinuation(snapshot);
15796
+ if (continuation) {
15797
+ return {
15798
+ content: [
15799
+ {
15800
+ type: "text",
15801
+ text: JSON.stringify({
15802
+ ...snapshot,
15803
+ pollingContinuation: continuation
15804
+ })
15805
+ },
15806
+ {
15807
+ type: "text",
15808
+ text: continuation.instruction
15809
+ }
15810
+ ]
15811
+ };
15812
+ }
15813
+ return asText(snapshot);
15767
15814
  }
15768
15815
  if (snapshot.kind === "service") {
15769
15816
  const result = await api.getJson(`/v1/tasks/${encodeURIComponent(input.taskId)}/service-result`, {
package/dist/stdio.js CHANGED
@@ -264,7 +264,7 @@ var ApiClient = class {
264
264
  };
265
265
 
266
266
  // src/index.ts
267
- var MCP_VERSION = "6.2.0";
267
+ var MCP_VERSION = "6.3.0";
268
268
 
269
269
  // src/meta-upload-app.ts
270
270
  import { readFileSync } from "fs";
@@ -10917,7 +10917,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
10917
10917
  ], [
10918
10918
  "creative_variant"
10919
10919
  ]),
10920
- defineCapability("create_product_task", "ba700dbec8fb6454d55f996ae4567b9280256ae3b62fceb77fd729b9aa21425c", "credit_consuming", "creative", [
10920
+ defineCapability("create_product_task", "13a037c7365cc4c30d81a1d89515e663a3de92ffd4138a117fa32ecb629bca44", "credit_consuming", "creative", [
10921
10921
  "credit_consuming",
10922
10922
  "state_change"
10923
10923
  ], [
@@ -12265,6 +12265,35 @@ function sleep(ms, signal) {
12265
12265
  }
12266
12266
  __name(sleep, "sleep");
12267
12267
 
12268
+ // src/polling-continuation.ts
12269
+ var NO_CONTINUATION_STATUSES = /* @__PURE__ */ new Set([
12270
+ "done",
12271
+ "complete",
12272
+ "error",
12273
+ "awaiting_review"
12274
+ ]);
12275
+ var SUGGESTED_WAIT_SECONDS = 45;
12276
+ function buildPollingContinuation(snapshot, opts = {}) {
12277
+ if (NO_CONTINUATION_STATUSES.has(snapshot.status)) return null;
12278
+ if (snapshot.pendingUserAction != null) return null;
12279
+ const suggestedWaitSeconds = opts.suggestedWaitSeconds ?? SUGGESTED_WAIT_SECONDS;
12280
+ return {
12281
+ stillRunning: true,
12282
+ nextAction: "continue_polling_get_task_status",
12283
+ suggestedWaitSeconds,
12284
+ instruction: `La tarea SIGUE CORRIENDO: no termin\xF3, no fall\xF3 y todav\xEDa no hay nada que el usuario deba revisar. Esto NO es un error ni un final de trabajo.
12285
+
12286
+ REGLA: no termines tu turno sin dejar ARMADA la siguiente consulta. Cerrar el turno est\xE1 bien; cerrarlo sin nada que vuelva a preguntar es lo que deja al usuario esperando para siempre una revisi\xF3n que nunca le vas a mostrar.
12287
+
12288
+ Elige seg\xFAn lo que tu host permita:
12289
+ 1. PREFERIDO \u2014 si puedes agendar un mensaje o turno futuro (mensajes programados, recordatorios): agenda uno a ~2 minutos que vuelva a llamar get_task_status con este mismo taskId, dile al usuario que le avisas, y ah\xED s\xED cierra el turno. Es la mejor opci\xF3n: el usuario queda libre y t\xFA vuelves solo.
12290
+ 2. SI NO PUEDES AGENDAR: llama otra vez a get_task_status AHORA MISMO con waitSeconds=${suggestedWaitSeconds}, y repite hasta un estado terminal (done/error) o una acci\xF3n pendiente del usuario. NO cierres el turno con un "te aviso cuando est\xE9": nadie te va a volver a despertar.
12291
+
12292
+ No subas waitSeconds por encima de ${suggestedWaitSeconds} salvo que sepas que tu host aguanta llamadas m\xE1s largas: muchos clientes MCP cancelan a los 60 s y ver\xEDas un error de timeout en vez del estado.`
12293
+ };
12294
+ }
12295
+ __name(buildPollingContinuation, "buildPollingContinuation");
12296
+
12268
12297
  // src/errors.ts
12269
12298
  import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
12270
12299
 
@@ -14003,7 +14032,7 @@ var CreateProductTaskInput = z53.object({
14003
14032
  paymentMethods: z53.string().min(1).max(240).optional().describe('Opcional. M\xE9todos de pago que puede mostrar la landing. Ej. "Tarjeta, PSE, Nequi, Contraentrega". Si se omite, la landing no muestra m\xE9todos de pago.'),
14004
14033
  productContext: z53.string().max(3e3).optional().describe("Opcional. Informacion adicional del producto que la IA debe usar como contexto prioritario: uso real, comprador, restricciones, diferenciadores o direccion creativa. No reemplaza la investigacion de competencia; si hay competencia, guia el primer angulo y los outputs no deben contradecirlo."),
14005
14034
  productLabel: z53.string().trim().max(80).optional().describe('Opcional. Qu\xE9 es el producto, en pocas palabras (ej. "quita pelusas para ropa"). Es AUTORITATIVO: si lo env\xEDas, la IA usa esta identidad y no la reemplaza por otra categor\xEDa. Si lo omites, la IA detecta el producto desde la imagen.'),
14006
- videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena). Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (una regla visual experimental original), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
14035
+ videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena). Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (idea imposible: un truco visual que en la vida real no podr\xEDa pasar, y al cierre la invitaci\xF3n a comprar), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
14007
14036
  durationSeconds: z53.union([
14008
14037
  z53.literal(15),
14009
14038
  z53.literal(30)
@@ -14550,18 +14579,36 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
14550
14579
  const snapshot = await pollStatus(fetcher, input.waitSeconds ?? 0, signal);
14551
14580
  if (snapshot.status !== "done") {
14552
14581
  const review = renderPendingActionMarkdown(snapshot);
14553
- return review ? {
14554
- // Human-visible content stays presentation-only. Resolution
14555
- // refetches the server-owned snapshot, so protocol IDs/hashes
14556
- // never need to be narrated to the user.
14557
- content: [
14558
- {
14559
- type: "text",
14560
- text: review
14561
- }
14562
- ],
14563
- structuredContent: snapshot
14564
- } : asText(snapshot);
14582
+ if (review) {
14583
+ return {
14584
+ content: [
14585
+ {
14586
+ type: "text",
14587
+ text: review
14588
+ }
14589
+ ],
14590
+ structuredContent: snapshot
14591
+ };
14592
+ }
14593
+ const continuation = buildPollingContinuation(snapshot);
14594
+ if (continuation) {
14595
+ return {
14596
+ content: [
14597
+ {
14598
+ type: "text",
14599
+ text: JSON.stringify({
14600
+ ...snapshot,
14601
+ pollingContinuation: continuation
14602
+ })
14603
+ },
14604
+ {
14605
+ type: "text",
14606
+ text: continuation.instruction
14607
+ }
14608
+ ]
14609
+ };
14610
+ }
14611
+ return asText(snapshot);
14565
14612
  }
14566
14613
  if (snapshot.kind === "service") {
14567
14614
  const result = await api.getJson(`/v1/tasks/${encodeURIComponent(input.taskId)}/service-result`, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "Product Maker MCP server — cost products, generate dropshipping landing pages, UGC videos, and ad creatives, and publish to Shopify and Meta Ads from Claude, ChatGPT, or Gemini.",