@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.
- package/dist/http.js +62 -15
- package/dist/stdio.js +62 -15
- 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", "
|
|
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.
|
|
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" (
|
|
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
|
-
|
|
15756
|
-
|
|
15757
|
-
|
|
15758
|
-
|
|
15759
|
-
|
|
15760
|
-
|
|
15761
|
-
|
|
15762
|
-
|
|
15763
|
-
|
|
15764
|
-
|
|
15765
|
-
|
|
15766
|
-
|
|
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.
|
|
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", "
|
|
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" (
|
|
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
|
-
|
|
14554
|
-
|
|
14555
|
-
|
|
14556
|
-
|
|
14557
|
-
|
|
14558
|
-
|
|
14559
|
-
|
|
14560
|
-
|
|
14561
|
-
|
|
14562
|
-
|
|
14563
|
-
|
|
14564
|
-
|
|
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.
|
|
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.",
|