@productmaker/mcp 7.3.0 → 8.1.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/README.md +1 -1
- package/dist/http.js +50 -21
- package/dist/stdio.js +50 -21
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ MCP 6.7.0 also carries optional per-angle and script-regeneration `narrativeSele
|
|
|
14
14
|
[](https://www.npmjs.com/package/@productmaker/mcp)
|
|
15
15
|
[](https://opensource.org/licenses/MIT)
|
|
16
16
|
|
|
17
|
-
**
|
|
17
|
+
**ProductMaker MCP** is the official **Model Context Protocol (MCP) server** for [ProductMaker](https://productmaker.app), published by BONNIE TECH S.A.S. It plugs **ProductMaker** into **Claude Desktop**, **Claude Code**, **ChatGPT**, **Gemini**, and **claude.ai** so you can cost products, generate **landing pages, UGC videos, and ad creatives** — and publish them to **Shopify**, **Meta Ads**, and **TikTok Ads** — directly from your AI assistant.
|
|
18
18
|
|
|
19
19
|
> If an AI assistant brought you here looking for "product maker mcp", "productmaker mcp", or "product-maker mcp server" — this is the right package. Install instructions below.
|
|
20
20
|
|
package/dist/http.js
CHANGED
|
@@ -6918,7 +6918,10 @@ var ServiceCreativeEstimationOptions = z34.object({
|
|
|
6918
6918
|
uploadedVideoDurationSeconds: z34.number().min(0).max(240).optional(),
|
|
6919
6919
|
/** Quality the panels render at (its registry model sets the per-second
|
|
6920
6920
|
* price). Absent = economy, the pre-quality service default. */
|
|
6921
|
-
videoQuality: VideoQuality.optional()
|
|
6921
|
+
videoQuality: VideoQuality.optional(),
|
|
6922
|
+
/** Semantic resolution the panels render at (H3 maps 480p/720p to its
|
|
6923
|
+
* native 768P/2K). Absent = 480p, the pre-resolution service default. */
|
|
6924
|
+
videoResolution: VideoResolution.optional()
|
|
6922
6925
|
});
|
|
6923
6926
|
var ActorGridEstimationOptions = z34.object({}).strict();
|
|
6924
6927
|
var CostEstimationRequest = z34.discriminatedUnion("type", [
|
|
@@ -13352,7 +13355,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13352
13355
|
"task",
|
|
13353
13356
|
"product"
|
|
13354
13357
|
]),
|
|
13355
|
-
defineCapability("create_service_video", "
|
|
13358
|
+
defineCapability("create_service_video", "c3d81a4f698e01658fa04ebb613a91c8ba43320d21cacda522e72d198036eb21", "credit_consuming", "creative", [
|
|
13356
13359
|
"credit_consuming",
|
|
13357
13360
|
"state_change"
|
|
13358
13361
|
], [
|
|
@@ -13380,6 +13383,9 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13380
13383
|
// MCP-only for now: WhatsApp's service flow keeps the economy default.
|
|
13381
13384
|
slot("video_quality", false, [
|
|
13382
13385
|
"videoQuality"
|
|
13386
|
+
], []),
|
|
13387
|
+
slot("video_resolution", false, [
|
|
13388
|
+
"videoResolution"
|
|
13383
13389
|
], [])
|
|
13384
13390
|
], [
|
|
13385
13391
|
"service_context"
|
|
@@ -14174,7 +14180,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14174
14180
|
], [
|
|
14175
14181
|
"meta_upload_session"
|
|
14176
14182
|
], WHATSAPP_ONLY_CHANNEL_EXPOSURE),
|
|
14177
|
-
defineCapability("request_media_upload", "
|
|
14183
|
+
defineCapability("request_media_upload", "9a50a4647c61f97fb12bbb9b25f7660f392e3cd9825151735cd66292058882ea", "none", "creative", [
|
|
14178
14184
|
"state_change"
|
|
14179
14185
|
], [
|
|
14180
14186
|
slot("media_kind", true, [
|
|
@@ -16876,7 +16882,7 @@ var ApiClient = class {
|
|
|
16876
16882
|
};
|
|
16877
16883
|
|
|
16878
16884
|
// src/index.ts
|
|
16879
|
-
var MCP_VERSION = "
|
|
16885
|
+
var MCP_VERSION = "8.1.0";
|
|
16880
16886
|
|
|
16881
16887
|
// src/meta-upload-app.ts
|
|
16882
16888
|
import { readFileSync } from "fs";
|
|
@@ -17907,7 +17913,7 @@ var READS_EXTERNAL = {
|
|
|
17907
17913
|
readOnlyHint: true,
|
|
17908
17914
|
destructiveHint: false,
|
|
17909
17915
|
idempotentHint: true,
|
|
17910
|
-
openWorldHint:
|
|
17916
|
+
openWorldHint: false
|
|
17911
17917
|
};
|
|
17912
17918
|
var CREATES_INTERNAL = {
|
|
17913
17919
|
readOnlyHint: false,
|
|
@@ -17916,6 +17922,24 @@ var CREATES_INTERNAL = {
|
|
|
17916
17922
|
openWorldHint: false
|
|
17917
17923
|
};
|
|
17918
17924
|
var CREATES_EXTERNAL = {
|
|
17925
|
+
readOnlyHint: false,
|
|
17926
|
+
destructiveHint: false,
|
|
17927
|
+
idempotentHint: false,
|
|
17928
|
+
openWorldHint: false
|
|
17929
|
+
};
|
|
17930
|
+
var CREATES_PAID = {
|
|
17931
|
+
readOnlyHint: false,
|
|
17932
|
+
destructiveHint: true,
|
|
17933
|
+
idempotentHint: false,
|
|
17934
|
+
openWorldHint: false
|
|
17935
|
+
};
|
|
17936
|
+
var CREATES_PAID_OPEN_WORLD = {
|
|
17937
|
+
readOnlyHint: false,
|
|
17938
|
+
destructiveHint: true,
|
|
17939
|
+
idempotentHint: false,
|
|
17940
|
+
openWorldHint: true
|
|
17941
|
+
};
|
|
17942
|
+
var CREATES_OPEN_WORLD = {
|
|
17919
17943
|
readOnlyHint: false,
|
|
17920
17944
|
destructiveHint: false,
|
|
17921
17945
|
idempotentHint: false,
|
|
@@ -17931,7 +17955,7 @@ var OVERWRITES_EXTERNAL = {
|
|
|
17931
17955
|
readOnlyHint: false,
|
|
17932
17956
|
destructiveHint: true,
|
|
17933
17957
|
idempotentHint: false,
|
|
17934
|
-
openWorldHint:
|
|
17958
|
+
openWorldHint: false
|
|
17935
17959
|
};
|
|
17936
17960
|
var DailyControlStatusEnum = z70.enum([
|
|
17937
17961
|
"ok",
|
|
@@ -19317,7 +19341,8 @@ var CreateServiceVideoInput = z73.object({
|
|
|
19317
19341
|
"cinematic",
|
|
19318
19342
|
"wild_card"
|
|
19319
19343
|
]).default("auto"),
|
|
19320
|
-
videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.')
|
|
19344
|
+
videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.'),
|
|
19345
|
+
videoResolution: VideoResolutionEnum.default("480p").describe('Opcional. Resoluci\xF3n: "480p" o "720p". 720p cuesta m\xE1s por segundo y solo est\xE1 disponible en "economy" y "pro" (Medio = 768P). Default: 480p.')
|
|
19321
19346
|
}).strict();
|
|
19322
19347
|
var GetTaskStatusInput = z73.object({
|
|
19323
19348
|
taskId: z73.string().min(1),
|
|
@@ -19681,7 +19706,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
|
|
|
19681
19706
|
|
|
19682
19707
|
REQUERIDOS: images o projectId expl\xEDcito, language y country. Cuando los outputs incluyen video (tambi\xE9n por default), pregunta SIEMPRE videoAngleCount: 1, 2 o 3; es una decisi\xF3n de costo incluso con aiDecidesAll. Si falta una foto local, llama primero \`request_media_upload\`. Pregunta price, offer, paymentMethods y compareAtPrice cuando aplique; nunca asumas country/language.
|
|
19683
19708
|
|
|
19684
|
-
ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explica que inicia trabajo pagado y espera confirmaci\xF3n expl\xEDcita. aiDecidesAll omitido/false pausa para reviews conversacionales; muestra todos los \xE1ngulos candidatos y permite escoger/editar hasta el m\xE1ximo autorizado. Usa aiDecidesAll=true s\xF3lo si el usuario pidi\xF3 \u201Cdecide todo\u201D o \u201Cno me preguntes\u201D.`, CreateProductTaskInput.shape,
|
|
19709
|
+
ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explica que inicia trabajo pagado y espera confirmaci\xF3n expl\xEDcita. aiDecidesAll omitido/false pausa para reviews conversacionales; muestra todos los \xE1ngulos candidatos y permite escoger/editar hasta el m\xE1ximo autorizado. Usa aiDecidesAll=true s\xF3lo si el usuario pidi\xF3 \u201Cdecide todo\u201D o \u201Cno me preguntes\u201D.`, CreateProductTaskInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
19685
19710
|
try {
|
|
19686
19711
|
const selectedOutputs = input.outputs ?? DEFAULT_PRODUCT_TASK_OUTPUTS;
|
|
19687
19712
|
const videoPreset = selectedOutputs.includes("video") && input.competitorScanEnabled === true ? "auto" : input.videoPreset;
|
|
@@ -19772,8 +19797,11 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
|
|
|
19772
19797
|
throw translateError(e);
|
|
19773
19798
|
}
|
|
19774
19799
|
});
|
|
19775
|
-
server.tool("create_service_video", createServiceVideoGuidance.summary + " Esta acci\xF3n consume cr\xE9ditos: confirma la intenci\xF3n del usuario antes de llamarla. `automatic` genera directamente; `guided` devuelve conceptos para que el usuario apruebe uno mediante `resolve_pending_action`. La web tambi\xE9n acepta demos y anuncios de referencia; el transporte MCP de video adjunto todav\xEDa falla cerrado hasta poder subir bytes de forma segura.", CreateServiceVideoInput.shape,
|
|
19800
|
+
server.tool("create_service_video", createServiceVideoGuidance.summary + " Esta acci\xF3n consume cr\xE9ditos: confirma la intenci\xF3n del usuario antes de llamarla. `automatic` genera directamente; `guided` devuelve conceptos para que el usuario apruebe uno mediante `resolve_pending_action`. La web tambi\xE9n acepta demos y anuncios de referencia; el transporte MCP de video adjunto todav\xEDa falla cerrado hasta poder subir bytes de forma segura.", CreateServiceVideoInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
19776
19801
|
try {
|
|
19802
|
+
if (input.videoQuality === "medium" && input.videoResolution === "720p") {
|
|
19803
|
+
throw mcp(McpErrorCode.INVALID_INPUT, 'videoResolution "720p" no est\xE1 disponible con videoQuality "medium" en videos de servicio (Medio = 768P). Usa "480p" o elige "economy"/"pro".');
|
|
19804
|
+
}
|
|
19777
19805
|
await requirePaidCreativeConfirmation(server, `Video de servicio en ${input.language}. Modo: ${input.reviewMode === "automatic" ? "la IA decide todo" : "reviews conversacionales"}.`);
|
|
19778
19806
|
const created = await api.postJson("/v2/ingest", {
|
|
19779
19807
|
taskType: "service",
|
|
@@ -19787,6 +19815,7 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
|
|
|
19787
19815
|
} : {},
|
|
19788
19816
|
videoPreset: input.videoPreset,
|
|
19789
19817
|
videoQuality: input.videoQuality,
|
|
19818
|
+
videoResolution: input.videoResolution,
|
|
19790
19819
|
reviewMode: input.reviewMode,
|
|
19791
19820
|
...input.brandId ? {
|
|
19792
19821
|
brandId: input.brandId
|
|
@@ -20697,7 +20726,7 @@ function resolveLandingSetup(setup) {
|
|
|
20697
20726
|
}
|
|
20698
20727
|
__name(resolveLandingSetup, "resolveLandingSetup");
|
|
20699
20728
|
function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
20700
|
-
server.tool("generate_free_video", generateFreeVideoGuidance.summary + ' Si el usuario adjunta o menciona una imagen local, llama primero request_media_upload con mediaKind=image y usa el assetId devuelto; no pidas path ni URL. Devuelve un taskId y procesa el job de forma as\xEDncrona.\n\nREQUERIDOS: rawPrompt, quality, durationSeconds y videoResolution.\n\nCALIDAD: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro (Wan). Economy admite 6/8/10/15s; Medium admite cualquier duraci\xF3n entera de 4 a 15s; Pro admite enteros de 2 a 30s y audio natural. `freeProModel` se elimin\xF3 \u2014 usa `modelId` (ver su descripci\xF3n); Seedance 2.5 est\xE1 inactivo y se rechaza con un error claro.\n\nSUBT\xCDTULOS: si addSubtitles=true, el rawPrompt completo se usa como texto exacto de subt\xEDtulos y debe tener m\xE1ximo 500 caracteres; no existe una pregunta adicional de transcripci\xF3n.\n\nPara videos normales con narrativa/\xE1ngulo usa generate_video_creative. Para tareas combinadas de producto usa create_product_task.', FreeVideoInput.shape,
|
|
20729
|
+
server.tool("generate_free_video", generateFreeVideoGuidance.summary + ' Si el usuario adjunta o menciona una imagen local, llama primero request_media_upload con mediaKind=image y usa el assetId devuelto; no pidas path ni URL. Devuelve un taskId y procesa el job de forma as\xEDncrona.\n\nREQUERIDOS: rawPrompt, quality, durationSeconds y videoResolution.\n\nCALIDAD: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro (Wan). Economy admite 6/8/10/15s; Medium admite cualquier duraci\xF3n entera de 4 a 15s; Pro admite enteros de 2 a 30s y audio natural. `freeProModel` se elimin\xF3 \u2014 usa `modelId` (ver su descripci\xF3n); Seedance 2.5 est\xE1 inactivo y se rechaza con un error claro.\n\nSUBT\xCDTULOS: si addSubtitles=true, el rawPrompt completo se usa como texto exacto de subt\xEDtulos y debe tener m\xE1ximo 500 caracteres; no existe una pregunta adicional de transcripci\xF3n.\n\nPara videos normales con narrativa/\xE1ngulo usa generate_video_creative. Para tareas combinadas de producto usa create_product_task.', FreeVideoInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
20701
20730
|
try {
|
|
20702
20731
|
if (input.freeProModel) {
|
|
20703
20732
|
throw new Error("freeProModel se elimin\xF3 en MCP 7.0.0. Usa `modelId` para elegir el modelo expl\xEDcitamente (ver la descripci\xF3n del par\xE1metro).");
|
|
@@ -20745,7 +20774,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
20745
20774
|
throw translateError(e);
|
|
20746
20775
|
}
|
|
20747
20776
|
});
|
|
20748
|
-
server.tool("generate_video_creative", generateVideoCreativeGuidance.summary + " Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), title, primaryAngle, language, country, aspectRatio, videoAngleCount y creativeSetup. Pregunta SIEMPRE cu\xE1ntos videos quiere (1, 2 o 3): la cantidad cambia el costo y no forma parte de \u2018la IA decide todo\u2019. Si falta una foto local, llama primero `request_media_upload` y usa los assetId; no pidas path ni URL. PREGUNTA price y offer si faltan; no asumas country/language.\n\nFORMATO Y CALIDAD: pregunta videoStructure (Un solo clip o Multiescena) y videoQuality (Econ\xF3mico, Medio o Pro). Un solo clip se genera completo y puede incluir cambios de plano. El sistema elige el proveedor internamente.\n\nCONFIGURACI\xD3N: salvo que el usuario diga expl\xEDcitamente que la IA decida todo, usa creativeSetup.mode=guided y pregunta narrativa solo si no hay estudio de mercado; recoge p\xFAblico comprador, presentador (actor guardado, descripci\xF3n o ninguno) y direcci\xF3n creativa. Si el usuario dice qui\xE9n debe aparecer (mujer, hombre o ambos), env\xEDa creativeGender; no lo preguntes si no lo menciona. creativeDirection=null s\xF3lo despu\xE9s de que el usuario delegue esa decisi\xF3n concreta. No inventes valores de setup.\n\nANTES de invocar, muestra un resumen compacto que incluya cantidad, planificaci\xF3n (estudio de mercado o narrativa), p\xFAblico, presentador y direcci\xF3n y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. Multiescena se factura por escena, as\xED que avisa ese mayor costo. Advierte tambi\xE9n que, si luego el usuario confirma que las fotos son de varios productos (combo), el pipeline r\xE1pido actualmente omite la pausa de guion aunque mantiene las dem\xE1s revisiones.\n\nREVIEWS: guided muestra los \xE1ngulos candidatos y permite escoger hasta videoAngleCount, editar cada \xE1ngulo y revisar sus guiones. automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite ambas reviews. scriptNotes agrega restricciones al guion; get_video_script y approve_video_script manejan la review palabra por palabra.", VideoInput.shape,
|
|
20777
|
+
server.tool("generate_video_creative", generateVideoCreativeGuidance.summary + " Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), title, primaryAngle, language, country, aspectRatio, videoAngleCount y creativeSetup. Pregunta SIEMPRE cu\xE1ntos videos quiere (1, 2 o 3): la cantidad cambia el costo y no forma parte de \u2018la IA decide todo\u2019. Si falta una foto local, llama primero `request_media_upload` y usa los assetId; no pidas path ni URL. PREGUNTA price y offer si faltan; no asumas country/language.\n\nFORMATO Y CALIDAD: pregunta videoStructure (Un solo clip o Multiescena) y videoQuality (Econ\xF3mico, Medio o Pro). Un solo clip se genera completo y puede incluir cambios de plano. El sistema elige el proveedor internamente.\n\nCONFIGURACI\xD3N: salvo que el usuario diga expl\xEDcitamente que la IA decida todo, usa creativeSetup.mode=guided y pregunta narrativa solo si no hay estudio de mercado; recoge p\xFAblico comprador, presentador (actor guardado, descripci\xF3n o ninguno) y direcci\xF3n creativa. Si el usuario dice qui\xE9n debe aparecer (mujer, hombre o ambos), env\xEDa creativeGender; no lo preguntes si no lo menciona. creativeDirection=null s\xF3lo despu\xE9s de que el usuario delegue esa decisi\xF3n concreta. No inventes valores de setup.\n\nANTES de invocar, muestra un resumen compacto que incluya cantidad, planificaci\xF3n (estudio de mercado o narrativa), p\xFAblico, presentador y direcci\xF3n y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. Multiescena se factura por escena, as\xED que avisa ese mayor costo. Advierte tambi\xE9n que, si luego el usuario confirma que las fotos son de varios productos (combo), el pipeline r\xE1pido actualmente omite la pausa de guion aunque mantiene las dem\xE1s revisiones.\n\nREVIEWS: guided muestra los \xE1ngulos candidatos y permite escoger hasta videoAngleCount, editar cada \xE1ngulo y revisar sus guiones. automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite ambas reviews. scriptNotes agrega restricciones al guion; get_video_script y approve_video_script manejan la review palabra por palabra.", VideoInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
20749
20778
|
try {
|
|
20750
20779
|
if (!input.images && !input.winnerReference) {
|
|
20751
20780
|
throw new Error("images o winnerReference es requerido.");
|
|
@@ -20809,7 +20838,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
20809
20838
|
throw translateError(e);
|
|
20810
20839
|
}
|
|
20811
20840
|
});
|
|
20812
|
-
server.tool("generate_image_creatives", generateImageCreativesGuidance.summary + " Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), productTitle, language, country y creativeSetup. Si falta una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language. primaryAngle es opcional: si falta, ProductMaker lo genera y guided lo muestra para revisi\xF3n.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. No hagas un interrogatorio campo por campo: presenta UN checklist compacto con arquetipo, tratamiento visual, formato, cantidad, calidad, mezcla condicional, copy, competencia, contexto, direcci\xF3n, colores y copy exacto; propone los defaults recomendados y permite que el usuario delegue los campos con ai_decides o null donde el schema lo admite. La UI ofrece 1, 2, 3, 4 o 6 variantes: para 2\u20134 pregunta styleMix; para 1 o 6 usa null, y 6 activa autom\xE1ticamente una imagen de cada estilo. Premium 2K no admite 4:5.\n\nANTES de invocar, muestra el resumen de esas decisiones y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.", ImageInput.shape,
|
|
20841
|
+
server.tool("generate_image_creatives", generateImageCreativesGuidance.summary + " Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), productTitle, language, country y creativeSetup. Si falta una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language. primaryAngle es opcional: si falta, ProductMaker lo genera y guided lo muestra para revisi\xF3n.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. No hagas un interrogatorio campo por campo: presenta UN checklist compacto con arquetipo, tratamiento visual, formato, cantidad, calidad, mezcla condicional, copy, competencia, contexto, direcci\xF3n, colores y copy exacto; propone los defaults recomendados y permite que el usuario delegue los campos con ai_decides o null donde el schema lo admite. La UI ofrece 1, 2, 3, 4 o 6 variantes: para 2\u20134 pregunta styleMix; para 1 o 6 usa null, y 6 activa autom\xE1ticamente una imagen de cada estilo. Premium 2K no admite 4:5.\n\nANTES de invocar, muestra el resumen de esas decisiones y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.", ImageInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
20813
20842
|
try {
|
|
20814
20843
|
if (!input.images && !input.winnerReference) {
|
|
20815
20844
|
throw new Error("images o winnerReference es requerido.");
|
|
@@ -20855,7 +20884,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
20855
20884
|
throw translateError(e);
|
|
20856
20885
|
}
|
|
20857
20886
|
});
|
|
20858
|
-
server.tool("generate_landing", generateLandingGuidance.summary + " No expone landing editable/code mientras siga siendo admin-only. Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), language, country y creativeSetup. Ante \u201Ccrea una landing con este producto\u201D y una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. Presenta UN checklist compacto \u2014no preguntas seriales\u2014 con estrategia, formato, competencia, m\xE9todos de pago, contexto, direcci\xF3n creativa y headline/subheadline exactos opcionales. Prop\xF3n defaults recomendados; null significa que el usuario deleg\xF3 esa decisi\xF3n concreta, nunca que el agente la olvid\xF3.\n\nANTES de invocar, muestra el resumen y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.", LandingInput.shape,
|
|
20887
|
+
server.tool("generate_landing", generateLandingGuidance.summary + " No expone landing editable/code mientras siga siendo admin-only. Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), language, country y creativeSetup. Ante \u201Ccrea una landing con este producto\u201D y una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. Presenta UN checklist compacto \u2014no preguntas seriales\u2014 con estrategia, formato, competencia, m\xE9todos de pago, contexto, direcci\xF3n creativa y headline/subheadline exactos opcionales. Prop\xF3n defaults recomendados; null significa que el usuario deleg\xF3 esa decisi\xF3n concreta, nunca que el agente la olvid\xF3.\n\nANTES de invocar, muestra el resumen y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.", LandingInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
20859
20888
|
try {
|
|
20860
20889
|
if (!input.images && !input.winnerReference) {
|
|
20861
20890
|
throw new Error("images o winnerReference es requerido.");
|
|
@@ -21133,7 +21162,7 @@ function registerCreativeVariantTools(server, api) {
|
|
|
21133
21162
|
throw translateError(error);
|
|
21134
21163
|
}
|
|
21135
21164
|
});
|
|
21136
|
-
server.tool("create_creative_variant", createCreativeVariantGuidance.summary + " ES UNA ACCI\xD3N DE PAGO: primero llama estimate_creative_variant, muestra el rango de cr\xE9ditos al usuario y solo despu\xE9s invoca este tool con confirm=true. Las recomendaciones IA tambi\xE9n son acciones pagas a 2x del costo real. clientRequestId es obligatorio: genera un UUID por intenci\xF3n y reutiliza el mismo ante timeouts o transporte ambiguo. Si recibes status=error, pide confirmaci\xF3n para un intento nuevo y usa otro UUID. Reutiliza el producto y referencias del task origen; crea un child task independiente y devuelve variantTaskId. Para landing puedes enviar instructions en texto libre y omitir sectionKey: el backend lo clasifica con IA. No expone ni permite cambiar videoModel, videoTier, videoStyle o narrativeStyle; esos valores se heredan del task origen.", CreateCreativeVariantInputBase.shape,
|
|
21165
|
+
server.tool("create_creative_variant", createCreativeVariantGuidance.summary + " ES UNA ACCI\xD3N DE PAGO: primero llama estimate_creative_variant, muestra el rango de cr\xE9ditos al usuario y solo despu\xE9s invoca este tool con confirm=true. Las recomendaciones IA tambi\xE9n son acciones pagas a 2x del costo real. clientRequestId es obligatorio: genera un UUID por intenci\xF3n y reutiliza el mismo ante timeouts o transporte ambiguo. Si recibes status=error, pide confirmaci\xF3n para un intento nuevo y usa otro UUID. Reutiliza el producto y referencias del task origen; crea un child task independiente y devuelve variantTaskId. Para landing puedes enviar instructions en texto libre y omitir sectionKey: el backend lo clasifica con IA. No expone ni permite cambiar videoModel, videoTier, videoStyle o narrativeStyle; esos valores se heredan del task origen.", CreateCreativeVariantInputBase.shape, CREATES_PAID, async (input) => {
|
|
21137
21166
|
try {
|
|
21138
21167
|
const validatedInput = parseVariantInput(CreateCreativeVariantInput, input);
|
|
21139
21168
|
const estimateInput = EstimateCreativeVariantInput.parse({
|
|
@@ -21288,9 +21317,9 @@ function registerScriptReviewTools(server, api) {
|
|
|
21288
21317
|
// Not CREATES_INTERNAL: approving the script is what STARTS the render, so
|
|
21289
21318
|
// this call dispatches jobs to the video providers and burns credits. Its own
|
|
21290
21319
|
// description says so ("Tras llamarlo, el render arranca y consume créditos").
|
|
21291
|
-
//
|
|
21292
|
-
//
|
|
21293
|
-
|
|
21320
|
+
// `destructiveHint` keeps a host from treating the credit charge as a
|
|
21321
|
+
// reversible bookkeeping update.
|
|
21322
|
+
CREATES_PAID,
|
|
21294
21323
|
async (input) => {
|
|
21295
21324
|
try {
|
|
21296
21325
|
await requirePaidCreativeConfirmation(server, `Aprobar ${input.scenes.length} escena(s) y comenzar el render pagado del video.`);
|
|
@@ -22119,7 +22148,7 @@ var UploadSessionInputBase = z80.object({
|
|
|
22119
22148
|
maxFiles: z80.number().int().min(1).max(10).optional().describe("Optional batch limit: image accepts 1-5, video exactly 1, and mixed 1-10.")
|
|
22120
22149
|
});
|
|
22121
22150
|
var OpenAiFileReference = z80.object({
|
|
22122
|
-
download_url: z80.string().url().
|
|
22151
|
+
download_url: z80.string().url().describe("Required by ChatGPT's openai/fileParams schema. The App prefers getFileDownloadUrl(file_id) for a fresh URL, and the server never fetches this value."),
|
|
22123
22152
|
file_id: z80.string().min(1),
|
|
22124
22153
|
mime_type: z80.string().min(1).optional(),
|
|
22125
22154
|
file_name: z80.string().min(1).optional()
|
|
@@ -22234,7 +22263,7 @@ __name(resolveEndpointForSession, "resolveEndpointForSession");
|
|
|
22234
22263
|
function registerMediaUploadTools(server, api) {
|
|
22235
22264
|
registerAppTool(server, "request_media_upload", {
|
|
22236
22265
|
title: "Subir archivos",
|
|
22237
|
-
description: requestMediaUploadGuidance.summary + " Cuando la foto o el video sea el siguiente dato faltante, ll\xE1malo en esa misma respuesta: no te limites a pedir que lo adjunte en el chat y esperar otro turno. Ll\xE1malo tambi\xE9n autom\xE1ticamente y antes de preguntar por campos faltantes adicionales cuando una petici\xF3n natural adjunte o mencione un archivo local, por ejemplo \u2018crea una landing con este producto\u2019, \u2018haz creativos con esta foto\u2019 o \u2018sube este video a Meta\u2019; hazlo aunque el usuario diga que todav\xEDa no generes ni publiques, porque esta herramienta solo prepara el archivo y no consume cr\xE9ditos, salvo que proh\xEDba expl\xEDcitamente subir, compartir o almacenar el archivo; no pidas una ruta local ni URL. Es la \xFAnica ruta de carga para create_product_task, generate_image_creatives, generate_video_creative, generate_free_video, generate_landing y publish_creatives_to_meta. Pasa las referencias
|
|
22266
|
+
description: requestMediaUploadGuidance.summary + " Cuando la foto o el video sea el siguiente dato faltante, ll\xE1malo en esa misma respuesta: no te limites a pedir que lo adjunte en el chat y esperar otro turno. Ll\xE1malo tambi\xE9n autom\xE1ticamente y antes de preguntar por campos faltantes adicionales cuando una petici\xF3n natural adjunte o mencione un archivo local, por ejemplo \u2018crea una landing con este producto\u2019, \u2018haz creativos con esta foto\u2019 o \u2018sube este video a Meta\u2019; hazlo aunque el usuario diga que todav\xEDa no generes ni publiques, porque esta herramienta solo prepara el archivo y no consume cr\xE9ditos, salvo que proh\xEDba expl\xEDcitamente subir, compartir o almacenar el archivo; no pidas una ruta local ni URL. Es la \xFAnica ruta de carga para create_product_task, generate_image_creatives, generate_video_creative, generate_free_video, generate_landing y publish_creatives_to_meta. Pasa las referencias de ChatGPT en files con download_url y file_id. Si otro host no puede proporcionar ambos, omite files para que el App abra el selector inline o el enlace de carga. Usa uploadPurpose=product_reference para fotos de producto y landings, creative para creativos o anuncios, y generic solo cuando ninguno aplique. Usa mediaKind=image para referencias de producto y landings; mixed solo cuando el consumidor acepte ambos tipos. El App NO te avisa cuando termina: en cuanto el usuario diga que ya subi\xF3 el archivo o que sigas, llama `check_media_upload` con este sessionId para obtener los assetId, y reanuda la intenci\xF3n original usando \xFAnicamente assetId y mediaKind, sin pedir que vuelva a subir ni mostrar datos t\xE9cnicos. El enlace externo es fallback solo si el App inline falla. Esta herramienta no genera, publica ni consume cr\xE9ditos.",
|
|
22238
22267
|
inputSchema: UploadSessionToolInputShape,
|
|
22239
22268
|
annotations: CREATES_INTERNAL,
|
|
22240
22269
|
outputSchema: UniversalUploadStructuredResponse.shape,
|
|
@@ -23362,7 +23391,7 @@ async function pollUntilTerminal(api, runId, waitSeconds) {
|
|
|
23362
23391
|
}
|
|
23363
23392
|
__name(pollUntilTerminal, "pollUntilTerminal");
|
|
23364
23393
|
function registerProductResearchTools(server, api) {
|
|
23365
|
-
server.tool("find_winning_products", `${findWinningProductsGuidance.summary} CUESTA ${PRICE_CREDITS} CR\xC9DITOS por ejecuci\xF3n. ANTES de invocar, dile al usuario el costo y espera su aceptaci\xF3n expl\xEDcita; s\xF3lo entonces pasa confirmed: true. Consulta primero list_product_research_runs (GRATIS) \u2014 puede que el usuario ya tenga un reporte pagado para ese pa\xEDs/categor\xEDa y no necesites cobrar de nuevo. Pa\xEDses disponibles: CO, MX, PE, EC, CL. Tarda varios minutos: usa waitSeconds para esperar, y si expira consulta el resultado con get_product_research_run \u2014 el reporte NO se pierde.`, FindInput.shape,
|
|
23394
|
+
server.tool("find_winning_products", `${findWinningProductsGuidance.summary} CUESTA ${PRICE_CREDITS} CR\xC9DITOS por ejecuci\xF3n. ANTES de invocar, dile al usuario el costo y espera su aceptaci\xF3n expl\xEDcita; s\xF3lo entonces pasa confirmed: true. Consulta primero list_product_research_runs (GRATIS) \u2014 puede que el usuario ya tenga un reporte pagado para ese pa\xEDs/categor\xEDa y no necesites cobrar de nuevo. Pa\xEDses disponibles: CO, MX, PE, EC, CL. Tarda varios minutos: usa waitSeconds para esperar, y si expira consulta el resultado con get_product_research_run \u2014 el reporte NO se pierde.`, FindInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
23366
23395
|
const parsed = FindInput.parse(input);
|
|
23367
23396
|
if (!parsed.confirmed) {
|
|
23368
23397
|
throw mcp(McpErrorCode.INVALID_INPUT, `This research run costs ${PRICE_CREDITS} credits. Tell the user the cost, get an explicit yes, then call again with confirmed: true.`);
|
|
@@ -23417,7 +23446,7 @@ _Esta llamada no cobr\xF3 cr\xE9ditos: se reutiliz\xF3 una investigaci\xF3n reci
|
|
|
23417
23446
|
throw translateError(error);
|
|
23418
23447
|
}
|
|
23419
23448
|
});
|
|
23420
|
-
server.tool("prepare_winning_product_image", prepareWinningProductImageGuidance.summary + " GRATIS. \xDAsalo s\xF3lo despu\xE9s de que el usuario elija un candidato del reporte. Importa de forma segura la foto exacta a ProductMaker, la muestra y luego pide elegir: usarla, usarla y agregar m\xE1s, o subir s\xF3lo fotos propias.", WinnerReferenceInput.shape,
|
|
23449
|
+
server.tool("prepare_winning_product_image", prepareWinningProductImageGuidance.summary + " GRATIS. \xDAsalo s\xF3lo despu\xE9s de que el usuario elija un candidato del reporte. Importa de forma segura la foto exacta a ProductMaker, la muestra y luego pide elegir: usarla, usarla y agregar m\xE1s, o subir s\xF3lo fotos propias.", WinnerReferenceInput.shape, CREATES_OPEN_WORLD, async (input) => {
|
|
23421
23450
|
const parsed = WinnerReferenceInput.parse(input);
|
|
23422
23451
|
try {
|
|
23423
23452
|
const prepared = WinningProductPreparedImageSchema.parse(await api.postJson(`/v1/product-research/runs/${encodeURIComponent(parsed.runId)}/candidates/${encodeURIComponent(parsed.candidateSourceId)}/image-asset`, {}));
|
package/dist/stdio.js
CHANGED
|
@@ -6940,7 +6940,10 @@ var ServiceCreativeEstimationOptions = z34.object({
|
|
|
6940
6940
|
uploadedVideoDurationSeconds: z34.number().min(0).max(240).optional(),
|
|
6941
6941
|
/** Quality the panels render at (its registry model sets the per-second
|
|
6942
6942
|
* price). Absent = economy, the pre-quality service default. */
|
|
6943
|
-
videoQuality: VideoQuality.optional()
|
|
6943
|
+
videoQuality: VideoQuality.optional(),
|
|
6944
|
+
/** Semantic resolution the panels render at (H3 maps 480p/720p to its
|
|
6945
|
+
* native 768P/2K). Absent = 480p, the pre-resolution service default. */
|
|
6946
|
+
videoResolution: VideoResolution.optional()
|
|
6944
6947
|
});
|
|
6945
6948
|
var ActorGridEstimationOptions = z34.object({}).strict();
|
|
6946
6949
|
var CostEstimationRequest = z34.discriminatedUnion("type", [
|
|
@@ -13374,7 +13377,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13374
13377
|
"task",
|
|
13375
13378
|
"product"
|
|
13376
13379
|
]),
|
|
13377
|
-
defineCapability("create_service_video", "
|
|
13380
|
+
defineCapability("create_service_video", "c3d81a4f698e01658fa04ebb613a91c8ba43320d21cacda522e72d198036eb21", "credit_consuming", "creative", [
|
|
13378
13381
|
"credit_consuming",
|
|
13379
13382
|
"state_change"
|
|
13380
13383
|
], [
|
|
@@ -13402,6 +13405,9 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13402
13405
|
// MCP-only for now: WhatsApp's service flow keeps the economy default.
|
|
13403
13406
|
slot("video_quality", false, [
|
|
13404
13407
|
"videoQuality"
|
|
13408
|
+
], []),
|
|
13409
|
+
slot("video_resolution", false, [
|
|
13410
|
+
"videoResolution"
|
|
13405
13411
|
], [])
|
|
13406
13412
|
], [
|
|
13407
13413
|
"service_context"
|
|
@@ -14196,7 +14202,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14196
14202
|
], [
|
|
14197
14203
|
"meta_upload_session"
|
|
14198
14204
|
], WHATSAPP_ONLY_CHANNEL_EXPOSURE),
|
|
14199
|
-
defineCapability("request_media_upload", "
|
|
14205
|
+
defineCapability("request_media_upload", "9a50a4647c61f97fb12bbb9b25f7660f392e3cd9825151735cd66292058882ea", "none", "creative", [
|
|
14200
14206
|
"state_change"
|
|
14201
14207
|
], [
|
|
14202
14208
|
slot("media_kind", true, [
|
|
@@ -15255,7 +15261,7 @@ var ApiClient = class {
|
|
|
15255
15261
|
};
|
|
15256
15262
|
|
|
15257
15263
|
// src/index.ts
|
|
15258
|
-
var MCP_VERSION = "
|
|
15264
|
+
var MCP_VERSION = "8.1.0";
|
|
15259
15265
|
|
|
15260
15266
|
// src/meta-upload-app.ts
|
|
15261
15267
|
import { readFileSync } from "fs";
|
|
@@ -16286,7 +16292,7 @@ var READS_EXTERNAL = {
|
|
|
16286
16292
|
readOnlyHint: true,
|
|
16287
16293
|
destructiveHint: false,
|
|
16288
16294
|
idempotentHint: true,
|
|
16289
|
-
openWorldHint:
|
|
16295
|
+
openWorldHint: false
|
|
16290
16296
|
};
|
|
16291
16297
|
var CREATES_INTERNAL = {
|
|
16292
16298
|
readOnlyHint: false,
|
|
@@ -16295,6 +16301,24 @@ var CREATES_INTERNAL = {
|
|
|
16295
16301
|
openWorldHint: false
|
|
16296
16302
|
};
|
|
16297
16303
|
var CREATES_EXTERNAL = {
|
|
16304
|
+
readOnlyHint: false,
|
|
16305
|
+
destructiveHint: false,
|
|
16306
|
+
idempotentHint: false,
|
|
16307
|
+
openWorldHint: false
|
|
16308
|
+
};
|
|
16309
|
+
var CREATES_PAID = {
|
|
16310
|
+
readOnlyHint: false,
|
|
16311
|
+
destructiveHint: true,
|
|
16312
|
+
idempotentHint: false,
|
|
16313
|
+
openWorldHint: false
|
|
16314
|
+
};
|
|
16315
|
+
var CREATES_PAID_OPEN_WORLD = {
|
|
16316
|
+
readOnlyHint: false,
|
|
16317
|
+
destructiveHint: true,
|
|
16318
|
+
idempotentHint: false,
|
|
16319
|
+
openWorldHint: true
|
|
16320
|
+
};
|
|
16321
|
+
var CREATES_OPEN_WORLD = {
|
|
16298
16322
|
readOnlyHint: false,
|
|
16299
16323
|
destructiveHint: false,
|
|
16300
16324
|
idempotentHint: false,
|
|
@@ -16310,7 +16334,7 @@ var OVERWRITES_EXTERNAL = {
|
|
|
16310
16334
|
readOnlyHint: false,
|
|
16311
16335
|
destructiveHint: true,
|
|
16312
16336
|
idempotentHint: false,
|
|
16313
|
-
openWorldHint:
|
|
16337
|
+
openWorldHint: false
|
|
16314
16338
|
};
|
|
16315
16339
|
var DailyControlStatusEnum = z69.enum([
|
|
16316
16340
|
"ok",
|
|
@@ -17749,7 +17773,8 @@ var CreateServiceVideoInput = z72.object({
|
|
|
17749
17773
|
"cinematic",
|
|
17750
17774
|
"wild_card"
|
|
17751
17775
|
]).default("auto"),
|
|
17752
|
-
videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.')
|
|
17776
|
+
videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.'),
|
|
17777
|
+
videoResolution: VideoResolutionEnum.default("480p").describe('Opcional. Resoluci\xF3n: "480p" o "720p". 720p cuesta m\xE1s por segundo y solo est\xE1 disponible en "economy" y "pro" (Medio = 768P). Default: 480p.')
|
|
17753
17778
|
}).strict();
|
|
17754
17779
|
var GetTaskStatusInput = z72.object({
|
|
17755
17780
|
taskId: z72.string().min(1),
|
|
@@ -18113,7 +18138,7 @@ function registerTaskTools(server, api, { proxyBaseUrl = null, transport = "http
|
|
|
18113
18138
|
|
|
18114
18139
|
REQUERIDOS: images o projectId expl\xEDcito, language y country. Cuando los outputs incluyen video (tambi\xE9n por default), pregunta SIEMPRE videoAngleCount: 1, 2 o 3; es una decisi\xF3n de costo incluso con aiDecidesAll. Si falta una foto local, llama primero \`request_media_upload\`. Pregunta price, offer, paymentMethods y compareAtPrice cuando aplique; nunca asumas country/language.
|
|
18115
18140
|
|
|
18116
|
-
ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explica que inicia trabajo pagado y espera confirmaci\xF3n expl\xEDcita. aiDecidesAll omitido/false pausa para reviews conversacionales; muestra todos los \xE1ngulos candidatos y permite escoger/editar hasta el m\xE1ximo autorizado. Usa aiDecidesAll=true s\xF3lo si el usuario pidi\xF3 \u201Cdecide todo\u201D o \u201Cno me preguntes\u201D.`, CreateProductTaskInput.shape,
|
|
18141
|
+
ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explica que inicia trabajo pagado y espera confirmaci\xF3n expl\xEDcita. aiDecidesAll omitido/false pausa para reviews conversacionales; muestra todos los \xE1ngulos candidatos y permite escoger/editar hasta el m\xE1ximo autorizado. Usa aiDecidesAll=true s\xF3lo si el usuario pidi\xF3 \u201Cdecide todo\u201D o \u201Cno me preguntes\u201D.`, CreateProductTaskInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
18117
18142
|
try {
|
|
18118
18143
|
const selectedOutputs = input.outputs ?? DEFAULT_PRODUCT_TASK_OUTPUTS;
|
|
18119
18144
|
const videoPreset = selectedOutputs.includes("video") && input.competitorScanEnabled === true ? "auto" : input.videoPreset;
|
|
@@ -18204,8 +18229,11 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
|
|
|
18204
18229
|
throw translateError(e);
|
|
18205
18230
|
}
|
|
18206
18231
|
});
|
|
18207
|
-
server.tool("create_service_video", createServiceVideoGuidance.summary + " Esta acci\xF3n consume cr\xE9ditos: confirma la intenci\xF3n del usuario antes de llamarla. `automatic` genera directamente; `guided` devuelve conceptos para que el usuario apruebe uno mediante `resolve_pending_action`. La web tambi\xE9n acepta demos y anuncios de referencia; el transporte MCP de video adjunto todav\xEDa falla cerrado hasta poder subir bytes de forma segura.", CreateServiceVideoInput.shape,
|
|
18232
|
+
server.tool("create_service_video", createServiceVideoGuidance.summary + " Esta acci\xF3n consume cr\xE9ditos: confirma la intenci\xF3n del usuario antes de llamarla. `automatic` genera directamente; `guided` devuelve conceptos para que el usuario apruebe uno mediante `resolve_pending_action`. La web tambi\xE9n acepta demos y anuncios de referencia; el transporte MCP de video adjunto todav\xEDa falla cerrado hasta poder subir bytes de forma segura.", CreateServiceVideoInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
18208
18233
|
try {
|
|
18234
|
+
if (input.videoQuality === "medium" && input.videoResolution === "720p") {
|
|
18235
|
+
throw mcp(McpErrorCode.INVALID_INPUT, 'videoResolution "720p" no est\xE1 disponible con videoQuality "medium" en videos de servicio (Medio = 768P). Usa "480p" o elige "economy"/"pro".');
|
|
18236
|
+
}
|
|
18209
18237
|
await requirePaidCreativeConfirmation(server, `Video de servicio en ${input.language}. Modo: ${input.reviewMode === "automatic" ? "la IA decide todo" : "reviews conversacionales"}.`);
|
|
18210
18238
|
const created = await api.postJson("/v2/ingest", {
|
|
18211
18239
|
taskType: "service",
|
|
@@ -18219,6 +18247,7 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
|
|
|
18219
18247
|
} : {},
|
|
18220
18248
|
videoPreset: input.videoPreset,
|
|
18221
18249
|
videoQuality: input.videoQuality,
|
|
18250
|
+
videoResolution: input.videoResolution,
|
|
18222
18251
|
reviewMode: input.reviewMode,
|
|
18223
18252
|
...input.brandId ? {
|
|
18224
18253
|
brandId: input.brandId
|
|
@@ -19129,7 +19158,7 @@ function resolveLandingSetup(setup) {
|
|
|
19129
19158
|
}
|
|
19130
19159
|
__name(resolveLandingSetup, "resolveLandingSetup");
|
|
19131
19160
|
function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
19132
|
-
server.tool("generate_free_video", generateFreeVideoGuidance.summary + ' Si el usuario adjunta o menciona una imagen local, llama primero request_media_upload con mediaKind=image y usa el assetId devuelto; no pidas path ni URL. Devuelve un taskId y procesa el job de forma as\xEDncrona.\n\nREQUERIDOS: rawPrompt, quality, durationSeconds y videoResolution.\n\nCALIDAD: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro (Wan). Economy admite 6/8/10/15s; Medium admite cualquier duraci\xF3n entera de 4 a 15s; Pro admite enteros de 2 a 30s y audio natural. `freeProModel` se elimin\xF3 \u2014 usa `modelId` (ver su descripci\xF3n); Seedance 2.5 est\xE1 inactivo y se rechaza con un error claro.\n\nSUBT\xCDTULOS: si addSubtitles=true, el rawPrompt completo se usa como texto exacto de subt\xEDtulos y debe tener m\xE1ximo 500 caracteres; no existe una pregunta adicional de transcripci\xF3n.\n\nPara videos normales con narrativa/\xE1ngulo usa generate_video_creative. Para tareas combinadas de producto usa create_product_task.', FreeVideoInput.shape,
|
|
19161
|
+
server.tool("generate_free_video", generateFreeVideoGuidance.summary + ' Si el usuario adjunta o menciona una imagen local, llama primero request_media_upload con mediaKind=image y usa el assetId devuelto; no pidas path ni URL. Devuelve un taskId y procesa el job de forma as\xEDncrona.\n\nREQUERIDOS: rawPrompt, quality, durationSeconds y videoResolution.\n\nCALIDAD: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro (Wan). Economy admite 6/8/10/15s; Medium admite cualquier duraci\xF3n entera de 4 a 15s; Pro admite enteros de 2 a 30s y audio natural. `freeProModel` se elimin\xF3 \u2014 usa `modelId` (ver su descripci\xF3n); Seedance 2.5 est\xE1 inactivo y se rechaza con un error claro.\n\nSUBT\xCDTULOS: si addSubtitles=true, el rawPrompt completo se usa como texto exacto de subt\xEDtulos y debe tener m\xE1ximo 500 caracteres; no existe una pregunta adicional de transcripci\xF3n.\n\nPara videos normales con narrativa/\xE1ngulo usa generate_video_creative. Para tareas combinadas de producto usa create_product_task.', FreeVideoInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
19133
19162
|
try {
|
|
19134
19163
|
if (input.freeProModel) {
|
|
19135
19164
|
throw new Error("freeProModel se elimin\xF3 en MCP 7.0.0. Usa `modelId` para elegir el modelo expl\xEDcitamente (ver la descripci\xF3n del par\xE1metro).");
|
|
@@ -19177,7 +19206,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
19177
19206
|
throw translateError(e);
|
|
19178
19207
|
}
|
|
19179
19208
|
});
|
|
19180
|
-
server.tool("generate_video_creative", generateVideoCreativeGuidance.summary + " Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), title, primaryAngle, language, country, aspectRatio, videoAngleCount y creativeSetup. Pregunta SIEMPRE cu\xE1ntos videos quiere (1, 2 o 3): la cantidad cambia el costo y no forma parte de \u2018la IA decide todo\u2019. Si falta una foto local, llama primero `request_media_upload` y usa los assetId; no pidas path ni URL. PREGUNTA price y offer si faltan; no asumas country/language.\n\nFORMATO Y CALIDAD: pregunta videoStructure (Un solo clip o Multiescena) y videoQuality (Econ\xF3mico, Medio o Pro). Un solo clip se genera completo y puede incluir cambios de plano. El sistema elige el proveedor internamente.\n\nCONFIGURACI\xD3N: salvo que el usuario diga expl\xEDcitamente que la IA decida todo, usa creativeSetup.mode=guided y pregunta narrativa solo si no hay estudio de mercado; recoge p\xFAblico comprador, presentador (actor guardado, descripci\xF3n o ninguno) y direcci\xF3n creativa. Si el usuario dice qui\xE9n debe aparecer (mujer, hombre o ambos), env\xEDa creativeGender; no lo preguntes si no lo menciona. creativeDirection=null s\xF3lo despu\xE9s de que el usuario delegue esa decisi\xF3n concreta. No inventes valores de setup.\n\nANTES de invocar, muestra un resumen compacto que incluya cantidad, planificaci\xF3n (estudio de mercado o narrativa), p\xFAblico, presentador y direcci\xF3n y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. Multiescena se factura por escena, as\xED que avisa ese mayor costo. Advierte tambi\xE9n que, si luego el usuario confirma que las fotos son de varios productos (combo), el pipeline r\xE1pido actualmente omite la pausa de guion aunque mantiene las dem\xE1s revisiones.\n\nREVIEWS: guided muestra los \xE1ngulos candidatos y permite escoger hasta videoAngleCount, editar cada \xE1ngulo y revisar sus guiones. automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite ambas reviews. scriptNotes agrega restricciones al guion; get_video_script y approve_video_script manejan la review palabra por palabra.", VideoInput.shape,
|
|
19209
|
+
server.tool("generate_video_creative", generateVideoCreativeGuidance.summary + " Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), title, primaryAngle, language, country, aspectRatio, videoAngleCount y creativeSetup. Pregunta SIEMPRE cu\xE1ntos videos quiere (1, 2 o 3): la cantidad cambia el costo y no forma parte de \u2018la IA decide todo\u2019. Si falta una foto local, llama primero `request_media_upload` y usa los assetId; no pidas path ni URL. PREGUNTA price y offer si faltan; no asumas country/language.\n\nFORMATO Y CALIDAD: pregunta videoStructure (Un solo clip o Multiescena) y videoQuality (Econ\xF3mico, Medio o Pro). Un solo clip se genera completo y puede incluir cambios de plano. El sistema elige el proveedor internamente.\n\nCONFIGURACI\xD3N: salvo que el usuario diga expl\xEDcitamente que la IA decida todo, usa creativeSetup.mode=guided y pregunta narrativa solo si no hay estudio de mercado; recoge p\xFAblico comprador, presentador (actor guardado, descripci\xF3n o ninguno) y direcci\xF3n creativa. Si el usuario dice qui\xE9n debe aparecer (mujer, hombre o ambos), env\xEDa creativeGender; no lo preguntes si no lo menciona. creativeDirection=null s\xF3lo despu\xE9s de que el usuario delegue esa decisi\xF3n concreta. No inventes valores de setup.\n\nANTES de invocar, muestra un resumen compacto que incluya cantidad, planificaci\xF3n (estudio de mercado o narrativa), p\xFAblico, presentador y direcci\xF3n y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. Multiescena se factura por escena, as\xED que avisa ese mayor costo. Advierte tambi\xE9n que, si luego el usuario confirma que las fotos son de varios productos (combo), el pipeline r\xE1pido actualmente omite la pausa de guion aunque mantiene las dem\xE1s revisiones.\n\nREVIEWS: guided muestra los \xE1ngulos candidatos y permite escoger hasta videoAngleCount, editar cada \xE1ngulo y revisar sus guiones. automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite ambas reviews. scriptNotes agrega restricciones al guion; get_video_script y approve_video_script manejan la review palabra por palabra.", VideoInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
19181
19210
|
try {
|
|
19182
19211
|
if (!input.images && !input.winnerReference) {
|
|
19183
19212
|
throw new Error("images o winnerReference es requerido.");
|
|
@@ -19241,7 +19270,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
19241
19270
|
throw translateError(e);
|
|
19242
19271
|
}
|
|
19243
19272
|
});
|
|
19244
|
-
server.tool("generate_image_creatives", generateImageCreativesGuidance.summary + " Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), productTitle, language, country y creativeSetup. Si falta una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language. primaryAngle es opcional: si falta, ProductMaker lo genera y guided lo muestra para revisi\xF3n.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. No hagas un interrogatorio campo por campo: presenta UN checklist compacto con arquetipo, tratamiento visual, formato, cantidad, calidad, mezcla condicional, copy, competencia, contexto, direcci\xF3n, colores y copy exacto; propone los defaults recomendados y permite que el usuario delegue los campos con ai_decides o null donde el schema lo admite. La UI ofrece 1, 2, 3, 4 o 6 variantes: para 2\u20134 pregunta styleMix; para 1 o 6 usa null, y 6 activa autom\xE1ticamente una imagen de cada estilo. Premium 2K no admite 4:5.\n\nANTES de invocar, muestra el resumen de esas decisiones y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.", ImageInput.shape,
|
|
19273
|
+
server.tool("generate_image_creatives", generateImageCreativesGuidance.summary + " Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), productTitle, language, country y creativeSetup. Si falta una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language. primaryAngle es opcional: si falta, ProductMaker lo genera y guided lo muestra para revisi\xF3n.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. No hagas un interrogatorio campo por campo: presenta UN checklist compacto con arquetipo, tratamiento visual, formato, cantidad, calidad, mezcla condicional, copy, competencia, contexto, direcci\xF3n, colores y copy exacto; propone los defaults recomendados y permite que el usuario delegue los campos con ai_decides o null donde el schema lo admite. La UI ofrece 1, 2, 3, 4 o 6 variantes: para 2\u20134 pregunta styleMix; para 1 o 6 usa null, y 6 activa autom\xE1ticamente una imagen de cada estilo. Premium 2K no admite 4:5.\n\nANTES de invocar, muestra el resumen de esas decisiones y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.", ImageInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
19245
19274
|
try {
|
|
19246
19275
|
if (!input.images && !input.winnerReference) {
|
|
19247
19276
|
throw new Error("images o winnerReference es requerido.");
|
|
@@ -19287,7 +19316,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
19287
19316
|
throw translateError(e);
|
|
19288
19317
|
}
|
|
19289
19318
|
});
|
|
19290
|
-
server.tool("generate_landing", generateLandingGuidance.summary + " No expone landing editable/code mientras siga siendo admin-only. Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), language, country y creativeSetup. Ante \u201Ccrea una landing con este producto\u201D y una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. Presenta UN checklist compacto \u2014no preguntas seriales\u2014 con estrategia, formato, competencia, m\xE9todos de pago, contexto, direcci\xF3n creativa y headline/subheadline exactos opcionales. Prop\xF3n defaults recomendados; null significa que el usuario deleg\xF3 esa decisi\xF3n concreta, nunca que el agente la olvid\xF3.\n\nANTES de invocar, muestra el resumen y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.", LandingInput.shape,
|
|
19319
|
+
server.tool("generate_landing", generateLandingGuidance.summary + " No expone landing editable/code mientras siga siendo admin-only. Devuelve un taskId. Esta solicitud es directa: nunca busques, reutilices ni menciones un DropshippingProject.\n\nREQUERIDOS: images (1-5 fotos), language, country y creativeSetup. Ante \u201Ccrea una landing con este producto\u201D y una foto local, llama primero `request_media_upload` y usa los assetId. Pregunta price, offer y compareAtPrice cuando aplique; no asumas country/language.\n\nCONFIGURACI\xD3N: usa guided salvo delegaci\xF3n total expl\xEDcita. Presenta UN checklist compacto \u2014no preguntas seriales\u2014 con estrategia, formato, competencia, m\xE9todos de pago, contexto, direcci\xF3n creativa y headline/subheadline exactos opcionales. Prop\xF3n defaults recomendados; null significa que el usuario deleg\xF3 esa decisi\xF3n concreta, nunca que el agente la olvid\xF3.\n\nANTES de invocar, muestra el resumen y espera confirmaci\xF3n expl\xEDcita porque inicia trabajo pagado. guided pausa para revisar el \xE1ngulo; automatic equivale al toggle web \u201CDejar que la IA decida todo\u201D y omite la review.", LandingInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
19291
19320
|
try {
|
|
19292
19321
|
if (!input.images && !input.winnerReference) {
|
|
19293
19322
|
throw new Error("images o winnerReference es requerido.");
|
|
@@ -19565,7 +19594,7 @@ function registerCreativeVariantTools(server, api) {
|
|
|
19565
19594
|
throw translateError(error);
|
|
19566
19595
|
}
|
|
19567
19596
|
});
|
|
19568
|
-
server.tool("create_creative_variant", createCreativeVariantGuidance.summary + " ES UNA ACCI\xD3N DE PAGO: primero llama estimate_creative_variant, muestra el rango de cr\xE9ditos al usuario y solo despu\xE9s invoca este tool con confirm=true. Las recomendaciones IA tambi\xE9n son acciones pagas a 2x del costo real. clientRequestId es obligatorio: genera un UUID por intenci\xF3n y reutiliza el mismo ante timeouts o transporte ambiguo. Si recibes status=error, pide confirmaci\xF3n para un intento nuevo y usa otro UUID. Reutiliza el producto y referencias del task origen; crea un child task independiente y devuelve variantTaskId. Para landing puedes enviar instructions en texto libre y omitir sectionKey: el backend lo clasifica con IA. No expone ni permite cambiar videoModel, videoTier, videoStyle o narrativeStyle; esos valores se heredan del task origen.", CreateCreativeVariantInputBase.shape,
|
|
19597
|
+
server.tool("create_creative_variant", createCreativeVariantGuidance.summary + " ES UNA ACCI\xD3N DE PAGO: primero llama estimate_creative_variant, muestra el rango de cr\xE9ditos al usuario y solo despu\xE9s invoca este tool con confirm=true. Las recomendaciones IA tambi\xE9n son acciones pagas a 2x del costo real. clientRequestId es obligatorio: genera un UUID por intenci\xF3n y reutiliza el mismo ante timeouts o transporte ambiguo. Si recibes status=error, pide confirmaci\xF3n para un intento nuevo y usa otro UUID. Reutiliza el producto y referencias del task origen; crea un child task independiente y devuelve variantTaskId. Para landing puedes enviar instructions en texto libre y omitir sectionKey: el backend lo clasifica con IA. No expone ni permite cambiar videoModel, videoTier, videoStyle o narrativeStyle; esos valores se heredan del task origen.", CreateCreativeVariantInputBase.shape, CREATES_PAID, async (input) => {
|
|
19569
19598
|
try {
|
|
19570
19599
|
const validatedInput = parseVariantInput(CreateCreativeVariantInput, input);
|
|
19571
19600
|
const estimateInput = EstimateCreativeVariantInput.parse({
|
|
@@ -19720,9 +19749,9 @@ function registerScriptReviewTools(server, api) {
|
|
|
19720
19749
|
// Not CREATES_INTERNAL: approving the script is what STARTS the render, so
|
|
19721
19750
|
// this call dispatches jobs to the video providers and burns credits. Its own
|
|
19722
19751
|
// description says so ("Tras llamarlo, el render arranca y consume créditos").
|
|
19723
|
-
//
|
|
19724
|
-
//
|
|
19725
|
-
|
|
19752
|
+
// `destructiveHint` keeps a host from treating the credit charge as a
|
|
19753
|
+
// reversible bookkeeping update.
|
|
19754
|
+
CREATES_PAID,
|
|
19726
19755
|
async (input) => {
|
|
19727
19756
|
try {
|
|
19728
19757
|
await requirePaidCreativeConfirmation(server, `Aprobar ${input.scenes.length} escena(s) y comenzar el render pagado del video.`);
|
|
@@ -20551,7 +20580,7 @@ var UploadSessionInputBase = z79.object({
|
|
|
20551
20580
|
maxFiles: z79.number().int().min(1).max(10).optional().describe("Optional batch limit: image accepts 1-5, video exactly 1, and mixed 1-10.")
|
|
20552
20581
|
});
|
|
20553
20582
|
var OpenAiFileReference = z79.object({
|
|
20554
|
-
download_url: z79.string().url().
|
|
20583
|
+
download_url: z79.string().url().describe("Required by ChatGPT's openai/fileParams schema. The App prefers getFileDownloadUrl(file_id) for a fresh URL, and the server never fetches this value."),
|
|
20555
20584
|
file_id: z79.string().min(1),
|
|
20556
20585
|
mime_type: z79.string().min(1).optional(),
|
|
20557
20586
|
file_name: z79.string().min(1).optional()
|
|
@@ -20666,7 +20695,7 @@ __name(resolveEndpointForSession, "resolveEndpointForSession");
|
|
|
20666
20695
|
function registerMediaUploadTools(server, api) {
|
|
20667
20696
|
registerAppTool(server, "request_media_upload", {
|
|
20668
20697
|
title: "Subir archivos",
|
|
20669
|
-
description: requestMediaUploadGuidance.summary + " Cuando la foto o el video sea el siguiente dato faltante, ll\xE1malo en esa misma respuesta: no te limites a pedir que lo adjunte en el chat y esperar otro turno. Ll\xE1malo tambi\xE9n autom\xE1ticamente y antes de preguntar por campos faltantes adicionales cuando una petici\xF3n natural adjunte o mencione un archivo local, por ejemplo \u2018crea una landing con este producto\u2019, \u2018haz creativos con esta foto\u2019 o \u2018sube este video a Meta\u2019; hazlo aunque el usuario diga que todav\xEDa no generes ni publiques, porque esta herramienta solo prepara el archivo y no consume cr\xE9ditos, salvo que proh\xEDba expl\xEDcitamente subir, compartir o almacenar el archivo; no pidas una ruta local ni URL. Es la \xFAnica ruta de carga para create_product_task, generate_image_creatives, generate_video_creative, generate_free_video, generate_landing y publish_creatives_to_meta. Pasa las referencias
|
|
20698
|
+
description: requestMediaUploadGuidance.summary + " Cuando la foto o el video sea el siguiente dato faltante, ll\xE1malo en esa misma respuesta: no te limites a pedir que lo adjunte en el chat y esperar otro turno. Ll\xE1malo tambi\xE9n autom\xE1ticamente y antes de preguntar por campos faltantes adicionales cuando una petici\xF3n natural adjunte o mencione un archivo local, por ejemplo \u2018crea una landing con este producto\u2019, \u2018haz creativos con esta foto\u2019 o \u2018sube este video a Meta\u2019; hazlo aunque el usuario diga que todav\xEDa no generes ni publiques, porque esta herramienta solo prepara el archivo y no consume cr\xE9ditos, salvo que proh\xEDba expl\xEDcitamente subir, compartir o almacenar el archivo; no pidas una ruta local ni URL. Es la \xFAnica ruta de carga para create_product_task, generate_image_creatives, generate_video_creative, generate_free_video, generate_landing y publish_creatives_to_meta. Pasa las referencias de ChatGPT en files con download_url y file_id. Si otro host no puede proporcionar ambos, omite files para que el App abra el selector inline o el enlace de carga. Usa uploadPurpose=product_reference para fotos de producto y landings, creative para creativos o anuncios, y generic solo cuando ninguno aplique. Usa mediaKind=image para referencias de producto y landings; mixed solo cuando el consumidor acepte ambos tipos. El App NO te avisa cuando termina: en cuanto el usuario diga que ya subi\xF3 el archivo o que sigas, llama `check_media_upload` con este sessionId para obtener los assetId, y reanuda la intenci\xF3n original usando \xFAnicamente assetId y mediaKind, sin pedir que vuelva a subir ni mostrar datos t\xE9cnicos. El enlace externo es fallback solo si el App inline falla. Esta herramienta no genera, publica ni consume cr\xE9ditos.",
|
|
20670
20699
|
inputSchema: UploadSessionToolInputShape,
|
|
20671
20700
|
annotations: CREATES_INTERNAL,
|
|
20672
20701
|
outputSchema: UniversalUploadStructuredResponse.shape,
|
|
@@ -21794,7 +21823,7 @@ async function pollUntilTerminal(api, runId, waitSeconds) {
|
|
|
21794
21823
|
}
|
|
21795
21824
|
__name(pollUntilTerminal, "pollUntilTerminal");
|
|
21796
21825
|
function registerProductResearchTools(server, api) {
|
|
21797
|
-
server.tool("find_winning_products", `${findWinningProductsGuidance.summary} CUESTA ${PRICE_CREDITS} CR\xC9DITOS por ejecuci\xF3n. ANTES de invocar, dile al usuario el costo y espera su aceptaci\xF3n expl\xEDcita; s\xF3lo entonces pasa confirmed: true. Consulta primero list_product_research_runs (GRATIS) \u2014 puede que el usuario ya tenga un reporte pagado para ese pa\xEDs/categor\xEDa y no necesites cobrar de nuevo. Pa\xEDses disponibles: CO, MX, PE, EC, CL. Tarda varios minutos: usa waitSeconds para esperar, y si expira consulta el resultado con get_product_research_run \u2014 el reporte NO se pierde.`, FindInput.shape,
|
|
21826
|
+
server.tool("find_winning_products", `${findWinningProductsGuidance.summary} CUESTA ${PRICE_CREDITS} CR\xC9DITOS por ejecuci\xF3n. ANTES de invocar, dile al usuario el costo y espera su aceptaci\xF3n expl\xEDcita; s\xF3lo entonces pasa confirmed: true. Consulta primero list_product_research_runs (GRATIS) \u2014 puede que el usuario ya tenga un reporte pagado para ese pa\xEDs/categor\xEDa y no necesites cobrar de nuevo. Pa\xEDses disponibles: CO, MX, PE, EC, CL. Tarda varios minutos: usa waitSeconds para esperar, y si expira consulta el resultado con get_product_research_run \u2014 el reporte NO se pierde.`, FindInput.shape, CREATES_PAID_OPEN_WORLD, async (input) => {
|
|
21798
21827
|
const parsed = FindInput.parse(input);
|
|
21799
21828
|
if (!parsed.confirmed) {
|
|
21800
21829
|
throw mcp(McpErrorCode.INVALID_INPUT, `This research run costs ${PRICE_CREDITS} credits. Tell the user the cost, get an explicit yes, then call again with confirmed: true.`);
|
|
@@ -21849,7 +21878,7 @@ _Esta llamada no cobr\xF3 cr\xE9ditos: se reutiliz\xF3 una investigaci\xF3n reci
|
|
|
21849
21878
|
throw translateError(error);
|
|
21850
21879
|
}
|
|
21851
21880
|
});
|
|
21852
|
-
server.tool("prepare_winning_product_image", prepareWinningProductImageGuidance.summary + " GRATIS. \xDAsalo s\xF3lo despu\xE9s de que el usuario elija un candidato del reporte. Importa de forma segura la foto exacta a ProductMaker, la muestra y luego pide elegir: usarla, usarla y agregar m\xE1s, o subir s\xF3lo fotos propias.", WinnerReferenceInput.shape,
|
|
21881
|
+
server.tool("prepare_winning_product_image", prepareWinningProductImageGuidance.summary + " GRATIS. \xDAsalo s\xF3lo despu\xE9s de que el usuario elija un candidato del reporte. Importa de forma segura la foto exacta a ProductMaker, la muestra y luego pide elegir: usarla, usarla y agregar m\xE1s, o subir s\xF3lo fotos propias.", WinnerReferenceInput.shape, CREATES_OPEN_WORLD, async (input) => {
|
|
21853
21882
|
const parsed = WinnerReferenceInput.parse(input);
|
|
21854
21883
|
try {
|
|
21855
21884
|
const prepared = WinningProductPreparedImageSchema.parse(await api.postJson(`/v1/product-research/runs/${encodeURIComponent(parsed.runId)}/candidates/${encodeURIComponent(parsed.candidateSourceId)}/image-asset`, {}));
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@productmaker/mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
|
-
"description": "
|
|
6
|
+
"description": "ProductMaker MCP server — cost products, generate landing pages, UGC videos, and ad creatives, and publish to Shopify, Meta Ads, and TikTok Ads.",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"mcp",
|
|
9
9
|
"mcp-server",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"bugs": {
|
|
37
37
|
"email": "infoapp@productmaker.app"
|
|
38
38
|
},
|
|
39
|
-
"author": "
|
|
39
|
+
"author": "BONNIE TECH S.A.S <infoapp@productmaker.app> (https://productmaker.app)",
|
|
40
40
|
"license": "MIT",
|
|
41
41
|
"bin": {
|
|
42
42
|
"productmaker-mcp": "./dist/stdio.js"
|