@productmaker/mcp 8.7.1 → 8.8.1
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 +9 -0
- package/dist/http.js +104 -24
- package/dist/stdio.js +104 -24
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -276,6 +276,15 @@ The `base64` field was removed. MCP JSON-RPC transports truncate large tool argu
|
|
|
276
276
|
|
|
277
277
|
## Version history
|
|
278
278
|
|
|
279
|
+
### 8.8.1 — Variantes en video de una sola toma
|
|
280
|
+
|
|
281
|
+
- La generación canónica conserva las variantes confirmadas en una sola toma de Grok, H3 y Wan, con la misma persona usando cada prenda y sin cambiar la estructura ni el precio cotizado.
|
|
282
|
+
- Versión patch sincronizada con ProductMaker; las herramientas y los esquemas públicos MCP permanecen iguales.
|
|
283
|
+
|
|
284
|
+
### 8.7.1 — Mix con múltiples ejes y referencias
|
|
285
|
+
|
|
286
|
+
- Versión patch sincronizada con la mejora canónica de Mix: múltiples ejes y referencias, con análisis acotado; las herramientas y los esquemas públicos MCP permanecen iguales.
|
|
287
|
+
|
|
279
288
|
### 8.7.0 — Control financiero en beta cerrada
|
|
280
289
|
|
|
281
290
|
- Operaciones por país, importación de pedidos, sincronización Shopify, gastos fijos, publicidad y P&L usan las mismas rutas canónicas protegidas para administradores y colaboradores beta.
|
package/dist/http.js
CHANGED
|
@@ -1998,6 +1998,28 @@ var CreativeGeneratorJob = z14.object({
|
|
|
1998
1998
|
referenceVersionId: z14.string().uuid().optional(),
|
|
1999
1999
|
cleanImagesWaitAttempt: z14.number().int().nonnegative().optional()
|
|
2000
2000
|
});
|
|
2001
|
+
var ImageCreativeEditStatus = z14.enum([
|
|
2002
|
+
"queued",
|
|
2003
|
+
"processing",
|
|
2004
|
+
"published",
|
|
2005
|
+
"failed"
|
|
2006
|
+
]);
|
|
2007
|
+
var ImageCreativeRegenerateRequest = z14.object({
|
|
2008
|
+
variantIndex: z14.number().int().nonnegative(),
|
|
2009
|
+
comment: z14.string().trim().min(1).max(1e3),
|
|
2010
|
+
clientRequestId: z14.string().trim().min(1).max(160).optional()
|
|
2011
|
+
});
|
|
2012
|
+
var ImageCreativeEditStatusResponse = z14.object({
|
|
2013
|
+
ok: z14.literal(true),
|
|
2014
|
+
operationId: z14.string().uuid(),
|
|
2015
|
+
taskId: z14.string().uuid(),
|
|
2016
|
+
variantIndex: z14.number().int().nonnegative(),
|
|
2017
|
+
status: ImageCreativeEditStatus,
|
|
2018
|
+
assetKey: z14.string().optional(),
|
|
2019
|
+
assetUrl: z14.string().url().optional(),
|
|
2020
|
+
degraded: z14.boolean(),
|
|
2021
|
+
error: z14.string().nullable()
|
|
2022
|
+
});
|
|
2001
2023
|
|
|
2002
2024
|
// ../../packages/types/src/product-label.ts
|
|
2003
2025
|
import { z as z15 } from "zod";
|
|
@@ -6471,7 +6493,10 @@ var MVPResult = z35.object({
|
|
|
6471
6493
|
landing: z35.object({
|
|
6472
6494
|
// Allow legacy data (10 sections × 2 variants) and new data (7 sections × 2)
|
|
6473
6495
|
images: z35.array(LandingImageReadable).max(MAX_LANDING_IMAGES),
|
|
6474
|
-
manifestVersion: z35.literal("v1")
|
|
6496
|
+
manifestVersion: z35.literal("v1"),
|
|
6497
|
+
// Landing-scoped on purpose: the regeneration dialog warns that provider
|
|
6498
|
+
// policy can block edits for licensed-character products.
|
|
6499
|
+
licensedCharacter: z35.boolean().optional()
|
|
6475
6500
|
}),
|
|
6476
6501
|
videoGenerators: z35.array(VideoGenerator).min(1).optional(),
|
|
6477
6502
|
videoStructure: VideoStructure.optional(),
|
|
@@ -9644,12 +9669,12 @@ var DEFAULT_PRICING = {
|
|
|
9644
9669
|
ourCostCents: 0.2,
|
|
9645
9670
|
userPriceCents: 0.4
|
|
9646
9671
|
},
|
|
9647
|
-
// Landing image QA (
|
|
9648
|
-
//
|
|
9649
|
-
//
|
|
9672
|
+
// Landing image QA (Qwen-2.5-VL-72B since 2026-10-02, 1-2 images). Anatomy/text/background cutoff.
|
|
9673
|
+
// Measured on owner corpus with Qwen-2.5-VL-72B: ~1,500 prompt tokens + 150 completion ≈ $0.00135 (0.135¢ our cost).
|
|
9674
|
+
// 0.25¢ ourCost keeps ~80% headroom; 2x house markup.
|
|
9650
9675
|
"openrouter:landing-image-qa": {
|
|
9651
|
-
ourCostCents:
|
|
9652
|
-
userPriceCents:
|
|
9676
|
+
ourCostCents: 0.25,
|
|
9677
|
+
userPriceCents: 0.5
|
|
9653
9678
|
},
|
|
9654
9679
|
// Usage decider (role `usage-decider`: Gemini 3.8 Flash effort:'high' since
|
|
9655
9680
|
// 05f543eae, ≤6 images + seller text, temperature 0 json_object, once per
|
|
@@ -9726,9 +9751,10 @@ var DEFAULT_PRICING = {
|
|
|
9726
9751
|
ourCostCents: 0.82,
|
|
9727
9752
|
userPriceCents: 1.64
|
|
9728
9753
|
},
|
|
9754
|
+
// Creative image anatomy QA (Qwen-2.5-VL-72B since 2026-10-02). Sized identically to landing-image-qa.
|
|
9729
9755
|
"openrouter:creative-image-anatomy-qa": {
|
|
9730
|
-
ourCostCents:
|
|
9731
|
-
userPriceCents:
|
|
9756
|
+
ourCostCents: 0.25,
|
|
9757
|
+
userPriceCents: 0.5
|
|
9732
9758
|
},
|
|
9733
9759
|
// Anatomy check (Gemini 3 Flash Preview, 1 image). Standalone anatomy verification.
|
|
9734
9760
|
"openrouter:anatomy-check": {
|
|
@@ -9974,24 +10000,19 @@ var DEFAULT_PRICING = {
|
|
|
9974
10000
|
userPriceCents: 4.5
|
|
9975
10001
|
},
|
|
9976
10002
|
// (d) DENSE anatomy detector (the default anatomy detector since 2026-09-26;
|
|
9977
|
-
// QA_ANATOMY_DETECTOR=frame_judge reverts):
|
|
9978
|
-
//
|
|
10003
|
+
// QA_ANATOMY_DETECTOR=frame_judge reverts): Qwen-2.5-VL-72B judges extracted
|
|
10004
|
+
// frames at 1 fps, 5 frames per call, each call billing its frame count — the rate is
|
|
9979
10005
|
// PER FRAME like (b) and scales with QA_DENSE_DETECTOR_MAX_FRAMES. Measured on the
|
|
9980
10006
|
// owner corpus with the shipped config (reasoning=low, grouped): $1.062 / 296 frames
|
|
9981
|
-
// ≈ 0.36c/frame; 0.5c keeps ~40% headroom.
|
|
9982
|
-
//
|
|
9983
|
-
// QA ~10x its cost. Re-derive from 30d BillingEntry once live.
|
|
10007
|
+
// ≈ 0.36c/frame; 0.5c keeps ~40% headroom. Preserved to protect the 30d video credit gate
|
|
10008
|
+
// ceiling until 30d of live Qwen volume is recorded. Re-derive from 30d BillingEntry once live.
|
|
9984
10009
|
"openrouter:video-qa-anatomy-dense-detector": {
|
|
9985
10010
|
ourCostCents: 0.5,
|
|
9986
10011
|
userPriceCents: 1
|
|
9987
10012
|
},
|
|
9988
|
-
// (e) Dense-mode tracing confirmation:
|
|
9989
|
-
//
|
|
9990
|
-
//
|
|
9991
|
-
// Spike measured $2.22/80 ≈ 2.8c/call; the 2026-09-26 A/B measured 2.6c/flag.
|
|
9992
|
-
// 3.0c keeps it above both. (The former 5.0c/10.0c, times the old 4-confirmation cap,
|
|
9993
|
-
// inflated the credit gate's `max` by up to ~12,600 credits on a 30 s multi-scene.)
|
|
9994
|
-
// Re-derive from 30d BillingEntry once live.
|
|
10013
|
+
// (e) Dense-mode tracing confirmation: Qwen-2.5-VL-72B evaluates 3 frames (t-1, t, t+1)
|
|
10014
|
+
// per flagged finding. Preserved to protect the 30d video credit gate ceiling
|
|
10015
|
+
// until 30d of live Qwen volume is recorded. Re-derive from 30d BillingEntry once live.
|
|
9995
10016
|
"openrouter:video-qa-anatomy-dense-confirm": {
|
|
9996
10017
|
ourCostCents: 3,
|
|
9997
10018
|
userPriceCents: 6
|
|
@@ -11405,6 +11426,13 @@ var RegenerateLandingRoleResponse = z55.object({
|
|
|
11405
11426
|
promptIndex: z55.number().int().nonnegative(),
|
|
11406
11427
|
operationId: z55.string().min(1)
|
|
11407
11428
|
});
|
|
11429
|
+
var LandingRegenerationFailureCode = z55.enum([
|
|
11430
|
+
"licensed_character_blocked",
|
|
11431
|
+
"provider_policy_blocked",
|
|
11432
|
+
"qa_rejected",
|
|
11433
|
+
"superseded",
|
|
11434
|
+
"provider_error"
|
|
11435
|
+
]);
|
|
11408
11436
|
var LandingRegenerationStatusResponse = z55.object({
|
|
11409
11437
|
ok: z55.literal(true),
|
|
11410
11438
|
operationId: z55.string().min(1),
|
|
@@ -11412,6 +11440,7 @@ var LandingRegenerationStatusResponse = z55.object({
|
|
|
11412
11440
|
status: LandingRegenerationStatus,
|
|
11413
11441
|
refunded: z55.boolean(),
|
|
11414
11442
|
failureReason: z55.string().nullable(),
|
|
11443
|
+
failureCode: LandingRegenerationFailureCode.nullable().optional(),
|
|
11415
11444
|
publishedAssetKey: z55.string().nullable(),
|
|
11416
11445
|
updatedAt: z55.string().datetime()
|
|
11417
11446
|
});
|
|
@@ -12369,6 +12398,23 @@ var CAPABILITY_MODEL_GUIDANCE = {
|
|
|
12369
12398
|
"es trabajo pagado y requiere confirmaci\xF3n expl\xEDcita"
|
|
12370
12399
|
]
|
|
12371
12400
|
},
|
|
12401
|
+
get_image_edit_status: {
|
|
12402
|
+
summary: "Consulta s\xF3lo el estado durable de una correcci\xF3n aceptada y su imagen entregada. No genera ni reintenta im\xE1genes; Task.done no significa que esta correcci\xF3n haya terminado.",
|
|
12403
|
+
useWhen: [
|
|
12404
|
+
"una correcci\xF3n de imagen ya devolvi\xF3 su operaci\xF3n aceptada",
|
|
12405
|
+
"la persona consulta el resultado de esa correcci\xF3n"
|
|
12406
|
+
],
|
|
12407
|
+
avoidWhen: [
|
|
12408
|
+
"todav\xEDa no existe una operaci\xF3n aceptada"
|
|
12409
|
+
],
|
|
12410
|
+
defaults: [
|
|
12411
|
+
"consulta la misma operaci\xF3n hasta su publicaci\xF3n o fallo durable",
|
|
12412
|
+
"un fallo al consultar no autoriza otra correcci\xF3n pagada"
|
|
12413
|
+
],
|
|
12414
|
+
disclosures: [
|
|
12415
|
+
"la consulta no consume cr\xE9ditos ni inicia trabajo"
|
|
12416
|
+
]
|
|
12417
|
+
},
|
|
12372
12418
|
edit_task_draft: {
|
|
12373
12419
|
summary: "Edita el draft de un angle de marketing antes de la generaci\xF3n.",
|
|
12374
12420
|
useWhen: [
|
|
@@ -14324,7 +14370,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14324
14370
|
"task",
|
|
14325
14371
|
"video"
|
|
14326
14372
|
]),
|
|
14327
|
-
defineCapability("edit_image_creative", "
|
|
14373
|
+
defineCapability("edit_image_creative", "50eca473829328dfb63b9cbae03a9835b79c510e29528563e09b7eb3e5e9bca4", "credit_consuming", "creative", [
|
|
14328
14374
|
"credit_consuming",
|
|
14329
14375
|
"state_change"
|
|
14330
14376
|
], [
|
|
@@ -14334,12 +14380,27 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14334
14380
|
]),
|
|
14335
14381
|
slot("edit_instruction", true, [
|
|
14336
14382
|
"instruction"
|
|
14337
|
-
])
|
|
14383
|
+
]),
|
|
14384
|
+
slot("client_request", false, [
|
|
14385
|
+
"clientRequestId"
|
|
14386
|
+
], [], "server")
|
|
14338
14387
|
], [
|
|
14339
14388
|
"creative"
|
|
14340
14389
|
], [
|
|
14341
14390
|
"creative"
|
|
14342
14391
|
]),
|
|
14392
|
+
defineCapability("get_image_edit_status", "fe59aefd433afe7e5a2d8b4a81084583750c1447c877b6bce698340326665141", "none", "read_only", [
|
|
14393
|
+
"read"
|
|
14394
|
+
], [
|
|
14395
|
+
slot("creative_operation", true, [
|
|
14396
|
+
"taskId",
|
|
14397
|
+
"operationId"
|
|
14398
|
+
], [], "server")
|
|
14399
|
+
], [
|
|
14400
|
+
"creative_edit_operation"
|
|
14401
|
+
], [
|
|
14402
|
+
"creative_edit_status"
|
|
14403
|
+
], MCP_ONLY_CHANNEL_EXPOSURE),
|
|
14343
14404
|
defineCapability("edit_task_draft", "1c9343bdce51aac36ec6254557c8a904037746523168527f012b4c5b6361e98e", "state_change", "creative", [
|
|
14344
14405
|
"state_change"
|
|
14345
14406
|
], [
|
|
@@ -18684,7 +18745,7 @@ var ApiClient = class {
|
|
|
18684
18745
|
};
|
|
18685
18746
|
|
|
18686
18747
|
// src/index.ts
|
|
18687
|
-
var MCP_VERSION = "8.
|
|
18748
|
+
var MCP_VERSION = "8.8.1";
|
|
18688
18749
|
|
|
18689
18750
|
// src/meta-upload-app.ts
|
|
18690
18751
|
import { readFileSync } from "fs";
|
|
@@ -22316,6 +22377,7 @@ import { z as z83 } from "zod";
|
|
|
22316
22377
|
var generateFreeVideoGuidance = getProductMakerCapabilityModelGuidance("generate_free_video");
|
|
22317
22378
|
var generateVideoCreativeGuidance = getProductMakerCapabilityModelGuidance("generate_video_creative");
|
|
22318
22379
|
var generateImageCreativesGuidance = getProductMakerCapabilityModelGuidance("generate_image_creatives");
|
|
22380
|
+
var imageEditStatusGuidance = getProductMakerCapabilityModelGuidance("get_image_edit_status");
|
|
22319
22381
|
var editImageCreativeGuidance = getProductMakerCapabilityModelGuidance("edit_image_creative");
|
|
22320
22382
|
var generateLandingGuidance = getProductMakerCapabilityModelGuidance("generate_landing");
|
|
22321
22383
|
var CreativeRefs = {
|
|
@@ -22537,6 +22599,7 @@ var ImageInput = z83.object({
|
|
|
22537
22599
|
var EditImageCreativeInput = z83.object({
|
|
22538
22600
|
taskId: z83.string().uuid().describe("ID de la tarea de imagen ya finalizada."),
|
|
22539
22601
|
variantIndex: z83.number().int().min(0).max(10).describe("\xCDndice de la variante a corregir (0 = primera imagen)."),
|
|
22602
|
+
clientRequestId: z83.string().min(1).max(160).optional().describe("Identidad estable de esta correcci\xF3n; reutil\xEDzala al reconciliar una respuesta perdida, no para otra instrucci\xF3n."),
|
|
22540
22603
|
instruction: z83.string().min(1).max(1e3).describe('Qu\xE9 cambiar en esa imagen. Ej. "quita el badge de env\xEDo gratis", "cambia el fondo a blanco".')
|
|
22541
22604
|
});
|
|
22542
22605
|
var LandingInput = z83.object({
|
|
@@ -22811,13 +22874,30 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
22811
22874
|
await requirePaidCreativeConfirmation(server, `Correcci\xF3n pagada de la imagen ${input.variantIndex + 1}.`);
|
|
22812
22875
|
const r = await api.postJson(`/v1/creatives/images/${encodeURIComponent(input.taskId)}/regenerate`, {
|
|
22813
22876
|
comment: input.instruction,
|
|
22814
|
-
variantIndex: input.variantIndex
|
|
22877
|
+
variantIndex: input.variantIndex,
|
|
22878
|
+
...input.clientRequestId ? {
|
|
22879
|
+
clientRequestId: input.clientRequestId
|
|
22880
|
+
} : {}
|
|
22815
22881
|
});
|
|
22816
22882
|
return asText(r);
|
|
22817
22883
|
} catch (e) {
|
|
22818
22884
|
throw translateError(e);
|
|
22819
22885
|
}
|
|
22820
22886
|
});
|
|
22887
|
+
server.registerTool("get_image_edit_status", {
|
|
22888
|
+
description: imageEditStatusGuidance.summary,
|
|
22889
|
+
inputSchema: {
|
|
22890
|
+
taskId: z83.string().uuid(),
|
|
22891
|
+
operationId: z83.string().uuid()
|
|
22892
|
+
},
|
|
22893
|
+
annotations: READS_INTERNAL
|
|
22894
|
+
}, async (input) => {
|
|
22895
|
+
try {
|
|
22896
|
+
return asText(await api.getJson(`/v1/creatives/images/${encodeURIComponent(input.taskId)}/operations/${encodeURIComponent(input.operationId)}`));
|
|
22897
|
+
} catch (error) {
|
|
22898
|
+
throw translateError(error);
|
|
22899
|
+
}
|
|
22900
|
+
});
|
|
22821
22901
|
server.registerTool("generate_landing", {
|
|
22822
22902
|
description: 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.",
|
|
22823
22903
|
inputSchema: LandingInput.shape,
|
package/dist/stdio.js
CHANGED
|
@@ -2020,6 +2020,28 @@ var CreativeGeneratorJob = z14.object({
|
|
|
2020
2020
|
referenceVersionId: z14.string().uuid().optional(),
|
|
2021
2021
|
cleanImagesWaitAttempt: z14.number().int().nonnegative().optional()
|
|
2022
2022
|
});
|
|
2023
|
+
var ImageCreativeEditStatus = z14.enum([
|
|
2024
|
+
"queued",
|
|
2025
|
+
"processing",
|
|
2026
|
+
"published",
|
|
2027
|
+
"failed"
|
|
2028
|
+
]);
|
|
2029
|
+
var ImageCreativeRegenerateRequest = z14.object({
|
|
2030
|
+
variantIndex: z14.number().int().nonnegative(),
|
|
2031
|
+
comment: z14.string().trim().min(1).max(1e3),
|
|
2032
|
+
clientRequestId: z14.string().trim().min(1).max(160).optional()
|
|
2033
|
+
});
|
|
2034
|
+
var ImageCreativeEditStatusResponse = z14.object({
|
|
2035
|
+
ok: z14.literal(true),
|
|
2036
|
+
operationId: z14.string().uuid(),
|
|
2037
|
+
taskId: z14.string().uuid(),
|
|
2038
|
+
variantIndex: z14.number().int().nonnegative(),
|
|
2039
|
+
status: ImageCreativeEditStatus,
|
|
2040
|
+
assetKey: z14.string().optional(),
|
|
2041
|
+
assetUrl: z14.string().url().optional(),
|
|
2042
|
+
degraded: z14.boolean(),
|
|
2043
|
+
error: z14.string().nullable()
|
|
2044
|
+
});
|
|
2023
2045
|
|
|
2024
2046
|
// ../../packages/types/src/product-label.ts
|
|
2025
2047
|
import { z as z15 } from "zod";
|
|
@@ -6493,7 +6515,10 @@ var MVPResult = z35.object({
|
|
|
6493
6515
|
landing: z35.object({
|
|
6494
6516
|
// Allow legacy data (10 sections × 2 variants) and new data (7 sections × 2)
|
|
6495
6517
|
images: z35.array(LandingImageReadable).max(MAX_LANDING_IMAGES),
|
|
6496
|
-
manifestVersion: z35.literal("v1")
|
|
6518
|
+
manifestVersion: z35.literal("v1"),
|
|
6519
|
+
// Landing-scoped on purpose: the regeneration dialog warns that provider
|
|
6520
|
+
// policy can block edits for licensed-character products.
|
|
6521
|
+
licensedCharacter: z35.boolean().optional()
|
|
6497
6522
|
}),
|
|
6498
6523
|
videoGenerators: z35.array(VideoGenerator).min(1).optional(),
|
|
6499
6524
|
videoStructure: VideoStructure.optional(),
|
|
@@ -9666,12 +9691,12 @@ var DEFAULT_PRICING = {
|
|
|
9666
9691
|
ourCostCents: 0.2,
|
|
9667
9692
|
userPriceCents: 0.4
|
|
9668
9693
|
},
|
|
9669
|
-
// Landing image QA (
|
|
9670
|
-
//
|
|
9671
|
-
//
|
|
9694
|
+
// Landing image QA (Qwen-2.5-VL-72B since 2026-10-02, 1-2 images). Anatomy/text/background cutoff.
|
|
9695
|
+
// Measured on owner corpus with Qwen-2.5-VL-72B: ~1,500 prompt tokens + 150 completion ≈ $0.00135 (0.135¢ our cost).
|
|
9696
|
+
// 0.25¢ ourCost keeps ~80% headroom; 2x house markup.
|
|
9672
9697
|
"openrouter:landing-image-qa": {
|
|
9673
|
-
ourCostCents:
|
|
9674
|
-
userPriceCents:
|
|
9698
|
+
ourCostCents: 0.25,
|
|
9699
|
+
userPriceCents: 0.5
|
|
9675
9700
|
},
|
|
9676
9701
|
// Usage decider (role `usage-decider`: Gemini 3.8 Flash effort:'high' since
|
|
9677
9702
|
// 05f543eae, ≤6 images + seller text, temperature 0 json_object, once per
|
|
@@ -9748,9 +9773,10 @@ var DEFAULT_PRICING = {
|
|
|
9748
9773
|
ourCostCents: 0.82,
|
|
9749
9774
|
userPriceCents: 1.64
|
|
9750
9775
|
},
|
|
9776
|
+
// Creative image anatomy QA (Qwen-2.5-VL-72B since 2026-10-02). Sized identically to landing-image-qa.
|
|
9751
9777
|
"openrouter:creative-image-anatomy-qa": {
|
|
9752
|
-
ourCostCents:
|
|
9753
|
-
userPriceCents:
|
|
9778
|
+
ourCostCents: 0.25,
|
|
9779
|
+
userPriceCents: 0.5
|
|
9754
9780
|
},
|
|
9755
9781
|
// Anatomy check (Gemini 3 Flash Preview, 1 image). Standalone anatomy verification.
|
|
9756
9782
|
"openrouter:anatomy-check": {
|
|
@@ -9996,24 +10022,19 @@ var DEFAULT_PRICING = {
|
|
|
9996
10022
|
userPriceCents: 4.5
|
|
9997
10023
|
},
|
|
9998
10024
|
// (d) DENSE anatomy detector (the default anatomy detector since 2026-09-26;
|
|
9999
|
-
// QA_ANATOMY_DETECTOR=frame_judge reverts):
|
|
10000
|
-
//
|
|
10025
|
+
// QA_ANATOMY_DETECTOR=frame_judge reverts): Qwen-2.5-VL-72B judges extracted
|
|
10026
|
+
// frames at 1 fps, 5 frames per call, each call billing its frame count — the rate is
|
|
10001
10027
|
// PER FRAME like (b) and scales with QA_DENSE_DETECTOR_MAX_FRAMES. Measured on the
|
|
10002
10028
|
// owner corpus with the shipped config (reasoning=low, grouped): $1.062 / 296 frames
|
|
10003
|
-
// ≈ 0.36c/frame; 0.5c keeps ~40% headroom.
|
|
10004
|
-
//
|
|
10005
|
-
// QA ~10x its cost. Re-derive from 30d BillingEntry once live.
|
|
10029
|
+
// ≈ 0.36c/frame; 0.5c keeps ~40% headroom. Preserved to protect the 30d video credit gate
|
|
10030
|
+
// ceiling until 30d of live Qwen volume is recorded. Re-derive from 30d BillingEntry once live.
|
|
10006
10031
|
"openrouter:video-qa-anatomy-dense-detector": {
|
|
10007
10032
|
ourCostCents: 0.5,
|
|
10008
10033
|
userPriceCents: 1
|
|
10009
10034
|
},
|
|
10010
|
-
// (e) Dense-mode tracing confirmation:
|
|
10011
|
-
//
|
|
10012
|
-
//
|
|
10013
|
-
// Spike measured $2.22/80 ≈ 2.8c/call; the 2026-09-26 A/B measured 2.6c/flag.
|
|
10014
|
-
// 3.0c keeps it above both. (The former 5.0c/10.0c, times the old 4-confirmation cap,
|
|
10015
|
-
// inflated the credit gate's `max` by up to ~12,600 credits on a 30 s multi-scene.)
|
|
10016
|
-
// Re-derive from 30d BillingEntry once live.
|
|
10035
|
+
// (e) Dense-mode tracing confirmation: Qwen-2.5-VL-72B evaluates 3 frames (t-1, t, t+1)
|
|
10036
|
+
// per flagged finding. Preserved to protect the 30d video credit gate ceiling
|
|
10037
|
+
// until 30d of live Qwen volume is recorded. Re-derive from 30d BillingEntry once live.
|
|
10017
10038
|
"openrouter:video-qa-anatomy-dense-confirm": {
|
|
10018
10039
|
ourCostCents: 3,
|
|
10019
10040
|
userPriceCents: 6
|
|
@@ -11427,6 +11448,13 @@ var RegenerateLandingRoleResponse = z55.object({
|
|
|
11427
11448
|
promptIndex: z55.number().int().nonnegative(),
|
|
11428
11449
|
operationId: z55.string().min(1)
|
|
11429
11450
|
});
|
|
11451
|
+
var LandingRegenerationFailureCode = z55.enum([
|
|
11452
|
+
"licensed_character_blocked",
|
|
11453
|
+
"provider_policy_blocked",
|
|
11454
|
+
"qa_rejected",
|
|
11455
|
+
"superseded",
|
|
11456
|
+
"provider_error"
|
|
11457
|
+
]);
|
|
11430
11458
|
var LandingRegenerationStatusResponse = z55.object({
|
|
11431
11459
|
ok: z55.literal(true),
|
|
11432
11460
|
operationId: z55.string().min(1),
|
|
@@ -11434,6 +11462,7 @@ var LandingRegenerationStatusResponse = z55.object({
|
|
|
11434
11462
|
status: LandingRegenerationStatus,
|
|
11435
11463
|
refunded: z55.boolean(),
|
|
11436
11464
|
failureReason: z55.string().nullable(),
|
|
11465
|
+
failureCode: LandingRegenerationFailureCode.nullable().optional(),
|
|
11437
11466
|
publishedAssetKey: z55.string().nullable(),
|
|
11438
11467
|
updatedAt: z55.string().datetime()
|
|
11439
11468
|
});
|
|
@@ -12391,6 +12420,23 @@ var CAPABILITY_MODEL_GUIDANCE = {
|
|
|
12391
12420
|
"es trabajo pagado y requiere confirmaci\xF3n expl\xEDcita"
|
|
12392
12421
|
]
|
|
12393
12422
|
},
|
|
12423
|
+
get_image_edit_status: {
|
|
12424
|
+
summary: "Consulta s\xF3lo el estado durable de una correcci\xF3n aceptada y su imagen entregada. No genera ni reintenta im\xE1genes; Task.done no significa que esta correcci\xF3n haya terminado.",
|
|
12425
|
+
useWhen: [
|
|
12426
|
+
"una correcci\xF3n de imagen ya devolvi\xF3 su operaci\xF3n aceptada",
|
|
12427
|
+
"la persona consulta el resultado de esa correcci\xF3n"
|
|
12428
|
+
],
|
|
12429
|
+
avoidWhen: [
|
|
12430
|
+
"todav\xEDa no existe una operaci\xF3n aceptada"
|
|
12431
|
+
],
|
|
12432
|
+
defaults: [
|
|
12433
|
+
"consulta la misma operaci\xF3n hasta su publicaci\xF3n o fallo durable",
|
|
12434
|
+
"un fallo al consultar no autoriza otra correcci\xF3n pagada"
|
|
12435
|
+
],
|
|
12436
|
+
disclosures: [
|
|
12437
|
+
"la consulta no consume cr\xE9ditos ni inicia trabajo"
|
|
12438
|
+
]
|
|
12439
|
+
},
|
|
12394
12440
|
edit_task_draft: {
|
|
12395
12441
|
summary: "Edita el draft de un angle de marketing antes de la generaci\xF3n.",
|
|
12396
12442
|
useWhen: [
|
|
@@ -14346,7 +14392,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14346
14392
|
"task",
|
|
14347
14393
|
"video"
|
|
14348
14394
|
]),
|
|
14349
|
-
defineCapability("edit_image_creative", "
|
|
14395
|
+
defineCapability("edit_image_creative", "50eca473829328dfb63b9cbae03a9835b79c510e29528563e09b7eb3e5e9bca4", "credit_consuming", "creative", [
|
|
14350
14396
|
"credit_consuming",
|
|
14351
14397
|
"state_change"
|
|
14352
14398
|
], [
|
|
@@ -14356,12 +14402,27 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14356
14402
|
]),
|
|
14357
14403
|
slot("edit_instruction", true, [
|
|
14358
14404
|
"instruction"
|
|
14359
|
-
])
|
|
14405
|
+
]),
|
|
14406
|
+
slot("client_request", false, [
|
|
14407
|
+
"clientRequestId"
|
|
14408
|
+
], [], "server")
|
|
14360
14409
|
], [
|
|
14361
14410
|
"creative"
|
|
14362
14411
|
], [
|
|
14363
14412
|
"creative"
|
|
14364
14413
|
]),
|
|
14414
|
+
defineCapability("get_image_edit_status", "fe59aefd433afe7e5a2d8b4a81084583750c1447c877b6bce698340326665141", "none", "read_only", [
|
|
14415
|
+
"read"
|
|
14416
|
+
], [
|
|
14417
|
+
slot("creative_operation", true, [
|
|
14418
|
+
"taskId",
|
|
14419
|
+
"operationId"
|
|
14420
|
+
], [], "server")
|
|
14421
|
+
], [
|
|
14422
|
+
"creative_edit_operation"
|
|
14423
|
+
], [
|
|
14424
|
+
"creative_edit_status"
|
|
14425
|
+
], MCP_ONLY_CHANNEL_EXPOSURE),
|
|
14365
14426
|
defineCapability("edit_task_draft", "1c9343bdce51aac36ec6254557c8a904037746523168527f012b4c5b6361e98e", "state_change", "creative", [
|
|
14366
14427
|
"state_change"
|
|
14367
14428
|
], [
|
|
@@ -17016,7 +17077,7 @@ var ApiClient = class {
|
|
|
17016
17077
|
};
|
|
17017
17078
|
|
|
17018
17079
|
// src/index.ts
|
|
17019
|
-
var MCP_VERSION = "8.
|
|
17080
|
+
var MCP_VERSION = "8.8.1";
|
|
17020
17081
|
|
|
17021
17082
|
// src/meta-upload-app.ts
|
|
17022
17083
|
import { readFileSync } from "fs";
|
|
@@ -20701,6 +20762,7 @@ import { z as z82 } from "zod";
|
|
|
20701
20762
|
var generateFreeVideoGuidance = getProductMakerCapabilityModelGuidance("generate_free_video");
|
|
20702
20763
|
var generateVideoCreativeGuidance = getProductMakerCapabilityModelGuidance("generate_video_creative");
|
|
20703
20764
|
var generateImageCreativesGuidance = getProductMakerCapabilityModelGuidance("generate_image_creatives");
|
|
20765
|
+
var imageEditStatusGuidance = getProductMakerCapabilityModelGuidance("get_image_edit_status");
|
|
20704
20766
|
var editImageCreativeGuidance = getProductMakerCapabilityModelGuidance("edit_image_creative");
|
|
20705
20767
|
var generateLandingGuidance = getProductMakerCapabilityModelGuidance("generate_landing");
|
|
20706
20768
|
var CreativeRefs = {
|
|
@@ -20922,6 +20984,7 @@ var ImageInput = z82.object({
|
|
|
20922
20984
|
var EditImageCreativeInput = z82.object({
|
|
20923
20985
|
taskId: z82.string().uuid().describe("ID de la tarea de imagen ya finalizada."),
|
|
20924
20986
|
variantIndex: z82.number().int().min(0).max(10).describe("\xCDndice de la variante a corregir (0 = primera imagen)."),
|
|
20987
|
+
clientRequestId: z82.string().min(1).max(160).optional().describe("Identidad estable de esta correcci\xF3n; reutil\xEDzala al reconciliar una respuesta perdida, no para otra instrucci\xF3n."),
|
|
20925
20988
|
instruction: z82.string().min(1).max(1e3).describe('Qu\xE9 cambiar en esa imagen. Ej. "quita el badge de env\xEDo gratis", "cambia el fondo a blanco".')
|
|
20926
20989
|
});
|
|
20927
20990
|
var LandingInput = z82.object({
|
|
@@ -21196,13 +21259,30 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
21196
21259
|
await requirePaidCreativeConfirmation(server, `Correcci\xF3n pagada de la imagen ${input.variantIndex + 1}.`);
|
|
21197
21260
|
const r = await api.postJson(`/v1/creatives/images/${encodeURIComponent(input.taskId)}/regenerate`, {
|
|
21198
21261
|
comment: input.instruction,
|
|
21199
|
-
variantIndex: input.variantIndex
|
|
21262
|
+
variantIndex: input.variantIndex,
|
|
21263
|
+
...input.clientRequestId ? {
|
|
21264
|
+
clientRequestId: input.clientRequestId
|
|
21265
|
+
} : {}
|
|
21200
21266
|
});
|
|
21201
21267
|
return asText(r);
|
|
21202
21268
|
} catch (e) {
|
|
21203
21269
|
throw translateError(e);
|
|
21204
21270
|
}
|
|
21205
21271
|
});
|
|
21272
|
+
server.registerTool("get_image_edit_status", {
|
|
21273
|
+
description: imageEditStatusGuidance.summary,
|
|
21274
|
+
inputSchema: {
|
|
21275
|
+
taskId: z82.string().uuid(),
|
|
21276
|
+
operationId: z82.string().uuid()
|
|
21277
|
+
},
|
|
21278
|
+
annotations: READS_INTERNAL
|
|
21279
|
+
}, async (input) => {
|
|
21280
|
+
try {
|
|
21281
|
+
return asText(await api.getJson(`/v1/creatives/images/${encodeURIComponent(input.taskId)}/operations/${encodeURIComponent(input.operationId)}`));
|
|
21282
|
+
} catch (error) {
|
|
21283
|
+
throw translateError(error);
|
|
21284
|
+
}
|
|
21285
|
+
});
|
|
21206
21286
|
server.registerTool("generate_landing", {
|
|
21207
21287
|
description: 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.",
|
|
21208
21288
|
inputSchema: LandingInput.shape,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@productmaker/mcp",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.8.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
6
|
"description": "ProductMaker MCP server — cost products, generate landing pages, UGC videos, and ad creatives, and publish to Shopify, Meta Ads, and TikTok Ads.",
|