@productmaker/mcp 9.0.0 → 9.0.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.
Files changed (3) hide show
  1. package/dist/http.js +88 -18
  2. package/dist/stdio.js +88 -18
  3. package/package.json +1 -1
package/dist/http.js CHANGED
@@ -13912,7 +13912,7 @@ var CAPABILITY_MODEL_GUIDANCE = {
13912
13912
  "mes en curso"
13913
13913
  ],
13914
13914
  disclosures: [
13915
- "sin publicidad leida la utilidad esta INCOMPLETA: dilo"
13915
+ "ventas, costos o publicidad desconocidos: utilidad INCOMPLETA"
13916
13916
  ]
13917
13917
  },
13918
13918
  sync_shopify_orders: {
@@ -13988,7 +13988,7 @@ var CAPABILITY_MODEL_GUIDANCE = {
13988
13988
  "es gasto de anuncios: usa set_ad_spend"
13989
13989
  ],
13990
13990
  defaults: [
13991
- "mes en curso; la misma etiqueta REEMPLAZA, no suma"
13991
+ "mes de la operaci\xF3n; misma etiqueta REEMPLAZA el total compartido y conserva el reparto"
13992
13992
  ],
13993
13993
  disclosures: [
13994
13994
  "requiere confirmaci\xF3n; sin gastos escritos la utilidad sale mas alta"
@@ -14318,6 +14318,73 @@ var LinkableCampaignsResponseSchema = z66.object({
14318
14318
 
14319
14319
  // ../../packages/types/src/finance-operation.ts
14320
14320
  import { z as z67 } from "zod";
14321
+
14322
+ // ../../packages/types/src/dropi-countries.ts
14323
+ var DROPI_COUNTRY_CODES = [
14324
+ "CO",
14325
+ "EC",
14326
+ "VE",
14327
+ "MX",
14328
+ "PE",
14329
+ "PA",
14330
+ "PY",
14331
+ "GT",
14332
+ "CL",
14333
+ "AR",
14334
+ "CR"
14335
+ ];
14336
+
14337
+ // ../../packages/types/src/finance-country-timezones.ts
14338
+ var FINANCE_COUNTRY_TIME_ZONES = Object.freeze({
14339
+ US: "America/New_York",
14340
+ CA: "America/Toronto",
14341
+ BZ: "America/Belize",
14342
+ SV: "America/El_Salvador",
14343
+ HN: "America/Tegucigalpa",
14344
+ NI: "America/Managua",
14345
+ CU: "America/Havana",
14346
+ DO: "America/Santo_Domingo",
14347
+ HT: "America/Port-au-Prince",
14348
+ JM: "America/Jamaica",
14349
+ PR: "America/Puerto_Rico",
14350
+ TT: "America/Port_of_Spain",
14351
+ BO: "America/La_Paz",
14352
+ BR: "America/Sao_Paulo",
14353
+ UY: "America/Montevideo",
14354
+ ES: "Europe/Madrid",
14355
+ FR: "Europe/Paris",
14356
+ DE: "Europe/Berlin",
14357
+ IT: "Europe/Rome",
14358
+ PT: "Europe/Lisbon",
14359
+ NL: "Europe/Amsterdam",
14360
+ BE: "Europe/Brussels",
14361
+ AT: "Europe/Vienna",
14362
+ IE: "Europe/Dublin",
14363
+ LU: "Europe/Luxembourg",
14364
+ GB: "Europe/London",
14365
+ CH: "Europe/Zurich",
14366
+ SE: "Europe/Stockholm",
14367
+ NO: "Europe/Oslo",
14368
+ DK: "Europe/Copenhagen",
14369
+ FI: "Europe/Helsinki",
14370
+ IS: "Atlantic/Reykjavik",
14371
+ PL: "Europe/Warsaw",
14372
+ CZ: "Europe/Prague",
14373
+ HU: "Europe/Budapest",
14374
+ RO: "Europe/Bucharest",
14375
+ BG: "Europe/Sofia",
14376
+ HR: "Europe/Zagreb",
14377
+ SI: "Europe/Ljubljana",
14378
+ SK: "Europe/Bratislava",
14379
+ GR: "Europe/Athens",
14380
+ MT: "Europe/Malta",
14381
+ CY: "Asia/Nicosia",
14382
+ EE: "Europe/Tallinn",
14383
+ LV: "Europe/Riga",
14384
+ LT: "Europe/Vilnius"
14385
+ });
14386
+
14387
+ // ../../packages/types/src/finance-operation.ts
14321
14388
  var CreateFinanceOperationSchema = z67.object({
14322
14389
  countryCode: z67.string().length(2).toUpperCase(),
14323
14390
  /** Cómo la llama ella. Vacío ⇒ se usa el nombre del país. */
@@ -14342,6 +14409,7 @@ var MonthlyPLQuerySchema = z67.object({
14342
14409
  var RESERVED_EXPENSE_LABEL_PREFIX = "__ad_spend__";
14343
14410
  var isReservedExpenseLabel = /* @__PURE__ */ __name((label) => label.trim().startsWith(RESERVED_EXPENSE_LABEL_PREFIX), "isReservedExpenseLabel");
14344
14411
  var SaveMonthlyExpenseSchema = z67.object({
14412
+ operationId: z67.string().uuid().optional(),
14345
14413
  month: z67.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/).optional(),
14346
14414
  label: z67.string().trim().min(1).max(80).refine((label) => !isReservedExpenseLabel(label), {
14347
14415
  message: "reserved_expense_label"
@@ -14351,13 +14419,14 @@ var SaveMonthlyExpenseSchema = z67.object({
14351
14419
  allocations: z67.array(z67.object({
14352
14420
  operationId: z67.string().uuid(),
14353
14421
  sharePct: z67.number().int().min(1).max(100)
14354
- })).min(1).refine((allocations) => allocations.reduce((sum, one) => sum + one.sharePct, 0) === 100, {
14422
+ })).min(1).refine((allocations) => allocations.reduce((sum, one) => sum + one.sharePct, 0) <= 100, {
14355
14423
  message: "allocations_must_sum_to_100"
14356
14424
  }).refine((allocations) => new Set(allocations.map((one) => one.operationId)).size === allocations.length, {
14357
14425
  message: "duplicate_operation_in_allocations"
14358
14426
  }).optional()
14359
14427
  }).strict();
14360
14428
  var DeleteMonthlyExpenseSchema = z67.object({
14429
+ operationId: z67.string().uuid().optional(),
14361
14430
  month: z67.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/),
14362
14431
  label: z67.string().trim().min(1).max(80).refine((label) => !isReservedExpenseLabel(label), {
14363
14432
  message: "reserved_expense_label"
@@ -14369,6 +14438,7 @@ var SetAdSpendSchema = z67.object({
14369
14438
  amount: z67.number().finite().min(0).nullable()
14370
14439
  }).strict();
14371
14440
  var MonthlyExpensesQuerySchema = z67.object({
14441
+ operationId: z67.string().uuid().optional(),
14372
14442
  month: z67.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/).optional()
14373
14443
  }).strict();
14374
14444
 
@@ -18080,10 +18150,16 @@ var RegenerateVideoScriptCapabilityRequest = z80.object({
18080
18150
 
18081
18151
  // ../../packages/types/src/dropi-financial.ts
18082
18152
  import { z as z81 } from "zod";
18153
+ var DropiCountrySchema = z81.enum(DROPI_COUNTRY_CODES);
18154
+ var DropiCountryQuerySchema = z81.object({
18155
+ countryCode: DropiCountrySchema.default("CO")
18156
+ }).strict();
18083
18157
  var ConnectDropiFinancialSchema = z81.object({
18158
+ countryCode: DropiCountrySchema.default("CO"),
18084
18159
  integrationKey: z81.string().trim().min(1).max(4096).regex(/^[\x21-\x7e]+$/)
18085
18160
  }).strict();
18086
18161
  var SyncDropiFinancialSchema = z81.object({
18162
+ countryCode: DropiCountrySchema.optional(),
18087
18163
  operationId: z81.string().uuid().optional(),
18088
18164
  since: z81.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
18089
18165
  until: z81.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional()
@@ -18091,7 +18167,8 @@ var SyncDropiFinancialSchema = z81.object({
18091
18167
  var DropiFinancialStatusSchema = z81.object({
18092
18168
  enabled: z81.boolean(),
18093
18169
  connected: z81.boolean(),
18094
- countryCode: z81.literal("CO"),
18170
+ countryCode: DropiCountrySchema,
18171
+ enabledCountries: z81.array(DropiCountrySchema).optional(),
18095
18172
  environment: z81.enum([
18096
18173
  "sandbox",
18097
18174
  "production"
@@ -19803,7 +19880,7 @@ var ApiClient = class {
19803
19880
  };
19804
19881
 
19805
19882
  // src/index.ts
19806
- var MCP_VERSION = "9.0.0";
19883
+ var MCP_VERSION = "9.0.1";
19807
19884
 
19808
19885
  // src/meta-upload-app.ts
19809
19886
  import { readFileSync } from "fs";
@@ -27458,7 +27535,7 @@ function registerProductControlTools(server, api, { transport = "http" } = {}) {
27458
27535
  }
27459
27536
  });
27460
27537
  server.registerTool("get_finances", {
27461
- description: getFinancesGuidance.summary + ' Contesta la pregunta que de verdad importa --- \xABeste negocio gana plata?\xBB --- con el mes armado: ventas totales y entregadas, fletes, costo de los productos, utilidad bruta, publicidad, gastos fijos y utilidad NETA. Esa utilidad es ANTES de impuestos y hay que decirlo asi: el contador es un gasto mas, no un calculo nuestro. Trae tambien los porcentajes contra sus metas. Si `costsKnown` viene en `false`, esos pedidos llegaron de una fuente que NO sabe cuanto costaron \u2014la tienda, o la API del proveedor\u2014 y la utilidad BRUTA esta incompleta: no es que el producto salga gratis. Si `adSpendKnown` viene en `false`, la publicidad NO se pudo leer y la utilidad esta INCOMPLETA: dilo antes de que alguien celebre un mes que perdio plata. `adSpendSource: "user"` significa que ella corrigio la cifra a mano, y eso se revisa distinto de una leida. Si `unconfirmedExpenses` es mayor que cero, ese monto viene heredado del mes pasado y ella no lo ha revisado. Es READ-ONLY: nunca pausa ni modifica una campana.',
27538
+ description: getFinancesGuidance.summary + ' Contesta la pregunta que de verdad importa --- \xABeste negocio gana plata?\xBB --- con el mes armado: ventas totales y entregadas, fletes, costo de los productos, utilidad bruta, publicidad, gastos fijos y utilidad NETA. Esa utilidad es ANTES de impuestos y hay que decirlo asi: el contador es un gasto mas, no un calculo nuestro. Trae tambien los porcentajes contra sus metas. Si `deliveredSalesKnown` no es true, faltan importes de ventas entregadas: la utilidad y los m\xE1rgenes no est\xE1n completos. `grossSalesKnown` distinto de true indica ventas totales parciales. Si `costsKnown` viene en `false`, esos pedidos llegaron de una fuente que NO sabe cuanto costaron \u2014la tienda, o la API del proveedor\u2014 y la utilidad BRUTA esta incompleta: no es que el producto salga gratis. Si `adSpendKnown` viene en `false`, la publicidad NO se pudo leer y la utilidad esta INCOMPLETA: dilo antes de que alguien celebre un mes que perdio plata. `adSpendSource: "user"` significa que ella corrigio la cifra a mano, y eso se revisa distinto de una leida. Si `unconfirmedExpenses` es mayor que cero, ese monto viene heredado del mes pasado y ella no lo ha revisado. Es READ-ONLY: nunca pausa ni modifica una campana.',
27462
27539
  inputSchema: GetFinancesInput.shape,
27463
27540
  annotations: READS_INTERNAL
27464
27541
  }, async (input) => {
@@ -27545,23 +27622,16 @@ function registerProductControlTools(server, api, { transport = "http" } = {}) {
27545
27622
  }
27546
27623
  });
27547
27624
  server.registerTool("set_monthly_expense", {
27548
- description: setMonthlyExpenseGuidance.summary + " Es un gasto FIJO: arriendo, sueldos, contador, plataformas \u2014 lo que se paga venda o no. Escribir la misma etiqueta otra vez REEMPLAZA el monto, no suma otro gasto. Sin gastos fijos escritos, la utilidad del mes sale siempre M\xC1S ALTA de lo que es, y ese es el error que nadie reclama. No lo uses para el gasto en anuncios: eso es set_ad_spend.",
27625
+ description: setMonthlyExpenseGuidance.summary + " El importe indicado es el TOTAL del gasto compartido existente; la parte de la operaci\xF3n se calcula conservando el reparto. Es un gasto FIJO: arriendo, sueldos, contador, plataformas \u2014 lo que se paga venda o no. Escribir la misma etiqueta otra vez REEMPLAZA el monto, no suma otro gasto. Sin gastos fijos escritos, la utilidad del mes sale siempre M\xC1S ALTA de lo que es, y ese es el error que nadie reclama. No lo uses para el gasto en anuncios: eso es set_ad_spend.",
27549
27626
  inputSchema: SetMonthlyExpenseInput.shape,
27550
27627
  annotations: OVERWRITES_INTERNAL
27551
27628
  }, async (input) => {
27552
27629
  try {
27553
- const month = input.month ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 7);
27554
- const operationId = input.operationId ?? (await api.getJson("/v1/product-control/operations"))[0]?.id;
27555
27630
  return asText(await api.putJson("/v1/product-control/expenses", {
27556
- month,
27631
+ month: input.month,
27632
+ operationId: input.operationId,
27557
27633
  label: input.label,
27558
- amount: input.amount,
27559
- allocations: operationId ? [
27560
- {
27561
- operationId,
27562
- sharePct: 100
27563
- }
27564
- ] : void 0
27634
+ amount: input.amount
27565
27635
  }));
27566
27636
  } catch (error) {
27567
27637
  throw translateError(error);
@@ -27574,7 +27644,7 @@ function registerProductControlTools(server, api, { transport = "http" } = {}) {
27574
27644
  }, async (input) => {
27575
27645
  try {
27576
27646
  return asText(await api.putJson("/v1/product-control/ad-spend", {
27577
- month: input.month ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 7),
27647
+ month: input.month,
27578
27648
  operationId: input.operationId,
27579
27649
  amount: input.amount
27580
27650
  }));
package/dist/stdio.js CHANGED
@@ -13934,7 +13934,7 @@ var CAPABILITY_MODEL_GUIDANCE = {
13934
13934
  "mes en curso"
13935
13935
  ],
13936
13936
  disclosures: [
13937
- "sin publicidad leida la utilidad esta INCOMPLETA: dilo"
13937
+ "ventas, costos o publicidad desconocidos: utilidad INCOMPLETA"
13938
13938
  ]
13939
13939
  },
13940
13940
  sync_shopify_orders: {
@@ -14010,7 +14010,7 @@ var CAPABILITY_MODEL_GUIDANCE = {
14010
14010
  "es gasto de anuncios: usa set_ad_spend"
14011
14011
  ],
14012
14012
  defaults: [
14013
- "mes en curso; la misma etiqueta REEMPLAZA, no suma"
14013
+ "mes de la operaci\xF3n; misma etiqueta REEMPLAZA el total compartido y conserva el reparto"
14014
14014
  ],
14015
14015
  disclosures: [
14016
14016
  "requiere confirmaci\xF3n; sin gastos escritos la utilidad sale mas alta"
@@ -14340,6 +14340,73 @@ var LinkableCampaignsResponseSchema = z66.object({
14340
14340
 
14341
14341
  // ../../packages/types/src/finance-operation.ts
14342
14342
  import { z as z67 } from "zod";
14343
+
14344
+ // ../../packages/types/src/dropi-countries.ts
14345
+ var DROPI_COUNTRY_CODES = [
14346
+ "CO",
14347
+ "EC",
14348
+ "VE",
14349
+ "MX",
14350
+ "PE",
14351
+ "PA",
14352
+ "PY",
14353
+ "GT",
14354
+ "CL",
14355
+ "AR",
14356
+ "CR"
14357
+ ];
14358
+
14359
+ // ../../packages/types/src/finance-country-timezones.ts
14360
+ var FINANCE_COUNTRY_TIME_ZONES = Object.freeze({
14361
+ US: "America/New_York",
14362
+ CA: "America/Toronto",
14363
+ BZ: "America/Belize",
14364
+ SV: "America/El_Salvador",
14365
+ HN: "America/Tegucigalpa",
14366
+ NI: "America/Managua",
14367
+ CU: "America/Havana",
14368
+ DO: "America/Santo_Domingo",
14369
+ HT: "America/Port-au-Prince",
14370
+ JM: "America/Jamaica",
14371
+ PR: "America/Puerto_Rico",
14372
+ TT: "America/Port_of_Spain",
14373
+ BO: "America/La_Paz",
14374
+ BR: "America/Sao_Paulo",
14375
+ UY: "America/Montevideo",
14376
+ ES: "Europe/Madrid",
14377
+ FR: "Europe/Paris",
14378
+ DE: "Europe/Berlin",
14379
+ IT: "Europe/Rome",
14380
+ PT: "Europe/Lisbon",
14381
+ NL: "Europe/Amsterdam",
14382
+ BE: "Europe/Brussels",
14383
+ AT: "Europe/Vienna",
14384
+ IE: "Europe/Dublin",
14385
+ LU: "Europe/Luxembourg",
14386
+ GB: "Europe/London",
14387
+ CH: "Europe/Zurich",
14388
+ SE: "Europe/Stockholm",
14389
+ NO: "Europe/Oslo",
14390
+ DK: "Europe/Copenhagen",
14391
+ FI: "Europe/Helsinki",
14392
+ IS: "Atlantic/Reykjavik",
14393
+ PL: "Europe/Warsaw",
14394
+ CZ: "Europe/Prague",
14395
+ HU: "Europe/Budapest",
14396
+ RO: "Europe/Bucharest",
14397
+ BG: "Europe/Sofia",
14398
+ HR: "Europe/Zagreb",
14399
+ SI: "Europe/Ljubljana",
14400
+ SK: "Europe/Bratislava",
14401
+ GR: "Europe/Athens",
14402
+ MT: "Europe/Malta",
14403
+ CY: "Asia/Nicosia",
14404
+ EE: "Europe/Tallinn",
14405
+ LV: "Europe/Riga",
14406
+ LT: "Europe/Vilnius"
14407
+ });
14408
+
14409
+ // ../../packages/types/src/finance-operation.ts
14343
14410
  var CreateFinanceOperationSchema = z67.object({
14344
14411
  countryCode: z67.string().length(2).toUpperCase(),
14345
14412
  /** Cómo la llama ella. Vacío ⇒ se usa el nombre del país. */
@@ -14364,6 +14431,7 @@ var MonthlyPLQuerySchema = z67.object({
14364
14431
  var RESERVED_EXPENSE_LABEL_PREFIX = "__ad_spend__";
14365
14432
  var isReservedExpenseLabel = /* @__PURE__ */ __name((label) => label.trim().startsWith(RESERVED_EXPENSE_LABEL_PREFIX), "isReservedExpenseLabel");
14366
14433
  var SaveMonthlyExpenseSchema = z67.object({
14434
+ operationId: z67.string().uuid().optional(),
14367
14435
  month: z67.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/).optional(),
14368
14436
  label: z67.string().trim().min(1).max(80).refine((label) => !isReservedExpenseLabel(label), {
14369
14437
  message: "reserved_expense_label"
@@ -14373,13 +14441,14 @@ var SaveMonthlyExpenseSchema = z67.object({
14373
14441
  allocations: z67.array(z67.object({
14374
14442
  operationId: z67.string().uuid(),
14375
14443
  sharePct: z67.number().int().min(1).max(100)
14376
- })).min(1).refine((allocations) => allocations.reduce((sum, one) => sum + one.sharePct, 0) === 100, {
14444
+ })).min(1).refine((allocations) => allocations.reduce((sum, one) => sum + one.sharePct, 0) <= 100, {
14377
14445
  message: "allocations_must_sum_to_100"
14378
14446
  }).refine((allocations) => new Set(allocations.map((one) => one.operationId)).size === allocations.length, {
14379
14447
  message: "duplicate_operation_in_allocations"
14380
14448
  }).optional()
14381
14449
  }).strict();
14382
14450
  var DeleteMonthlyExpenseSchema = z67.object({
14451
+ operationId: z67.string().uuid().optional(),
14383
14452
  month: z67.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/),
14384
14453
  label: z67.string().trim().min(1).max(80).refine((label) => !isReservedExpenseLabel(label), {
14385
14454
  message: "reserved_expense_label"
@@ -14391,6 +14460,7 @@ var SetAdSpendSchema = z67.object({
14391
14460
  amount: z67.number().finite().min(0).nullable()
14392
14461
  }).strict();
14393
14462
  var MonthlyExpensesQuerySchema = z67.object({
14463
+ operationId: z67.string().uuid().optional(),
14394
14464
  month: z67.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/).optional()
14395
14465
  }).strict();
14396
14466
 
@@ -17848,10 +17918,16 @@ var RegenerateVideoScriptCapabilityRequest = z80.object({
17848
17918
 
17849
17919
  // ../../packages/types/src/dropi-financial.ts
17850
17920
  import { z as z81 } from "zod";
17921
+ var DropiCountrySchema = z81.enum(DROPI_COUNTRY_CODES);
17922
+ var DropiCountryQuerySchema = z81.object({
17923
+ countryCode: DropiCountrySchema.default("CO")
17924
+ }).strict();
17851
17925
  var ConnectDropiFinancialSchema = z81.object({
17926
+ countryCode: DropiCountrySchema.default("CO"),
17852
17927
  integrationKey: z81.string().trim().min(1).max(4096).regex(/^[\x21-\x7e]+$/)
17853
17928
  }).strict();
17854
17929
  var SyncDropiFinancialSchema = z81.object({
17930
+ countryCode: DropiCountrySchema.optional(),
17855
17931
  operationId: z81.string().uuid().optional(),
17856
17932
  since: z81.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
17857
17933
  until: z81.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional()
@@ -17859,7 +17935,8 @@ var SyncDropiFinancialSchema = z81.object({
17859
17935
  var DropiFinancialStatusSchema = z81.object({
17860
17936
  enabled: z81.boolean(),
17861
17937
  connected: z81.boolean(),
17862
- countryCode: z81.literal("CO"),
17938
+ countryCode: DropiCountrySchema,
17939
+ enabledCountries: z81.array(DropiCountrySchema).optional(),
17863
17940
  environment: z81.enum([
17864
17941
  "sandbox",
17865
17942
  "production"
@@ -18135,7 +18212,7 @@ var ApiClient = class {
18135
18212
  };
18136
18213
 
18137
18214
  // src/index.ts
18138
- var MCP_VERSION = "9.0.0";
18215
+ var MCP_VERSION = "9.0.1";
18139
18216
 
18140
18217
  // src/meta-upload-app.ts
18141
18218
  import { readFileSync } from "fs";
@@ -25843,7 +25920,7 @@ function registerProductControlTools(server, api, { transport = "http" } = {}) {
25843
25920
  }
25844
25921
  });
25845
25922
  server.registerTool("get_finances", {
25846
- description: getFinancesGuidance.summary + ' Contesta la pregunta que de verdad importa --- \xABeste negocio gana plata?\xBB --- con el mes armado: ventas totales y entregadas, fletes, costo de los productos, utilidad bruta, publicidad, gastos fijos y utilidad NETA. Esa utilidad es ANTES de impuestos y hay que decirlo asi: el contador es un gasto mas, no un calculo nuestro. Trae tambien los porcentajes contra sus metas. Si `costsKnown` viene en `false`, esos pedidos llegaron de una fuente que NO sabe cuanto costaron \u2014la tienda, o la API del proveedor\u2014 y la utilidad BRUTA esta incompleta: no es que el producto salga gratis. Si `adSpendKnown` viene en `false`, la publicidad NO se pudo leer y la utilidad esta INCOMPLETA: dilo antes de que alguien celebre un mes que perdio plata. `adSpendSource: "user"` significa que ella corrigio la cifra a mano, y eso se revisa distinto de una leida. Si `unconfirmedExpenses` es mayor que cero, ese monto viene heredado del mes pasado y ella no lo ha revisado. Es READ-ONLY: nunca pausa ni modifica una campana.',
25923
+ description: getFinancesGuidance.summary + ' Contesta la pregunta que de verdad importa --- \xABeste negocio gana plata?\xBB --- con el mes armado: ventas totales y entregadas, fletes, costo de los productos, utilidad bruta, publicidad, gastos fijos y utilidad NETA. Esa utilidad es ANTES de impuestos y hay que decirlo asi: el contador es un gasto mas, no un calculo nuestro. Trae tambien los porcentajes contra sus metas. Si `deliveredSalesKnown` no es true, faltan importes de ventas entregadas: la utilidad y los m\xE1rgenes no est\xE1n completos. `grossSalesKnown` distinto de true indica ventas totales parciales. Si `costsKnown` viene en `false`, esos pedidos llegaron de una fuente que NO sabe cuanto costaron \u2014la tienda, o la API del proveedor\u2014 y la utilidad BRUTA esta incompleta: no es que el producto salga gratis. Si `adSpendKnown` viene en `false`, la publicidad NO se pudo leer y la utilidad esta INCOMPLETA: dilo antes de que alguien celebre un mes que perdio plata. `adSpendSource: "user"` significa que ella corrigio la cifra a mano, y eso se revisa distinto de una leida. Si `unconfirmedExpenses` es mayor que cero, ese monto viene heredado del mes pasado y ella no lo ha revisado. Es READ-ONLY: nunca pausa ni modifica una campana.',
25847
25924
  inputSchema: GetFinancesInput.shape,
25848
25925
  annotations: READS_INTERNAL
25849
25926
  }, async (input) => {
@@ -25930,23 +26007,16 @@ function registerProductControlTools(server, api, { transport = "http" } = {}) {
25930
26007
  }
25931
26008
  });
25932
26009
  server.registerTool("set_monthly_expense", {
25933
- description: setMonthlyExpenseGuidance.summary + " Es un gasto FIJO: arriendo, sueldos, contador, plataformas \u2014 lo que se paga venda o no. Escribir la misma etiqueta otra vez REEMPLAZA el monto, no suma otro gasto. Sin gastos fijos escritos, la utilidad del mes sale siempre M\xC1S ALTA de lo que es, y ese es el error que nadie reclama. No lo uses para el gasto en anuncios: eso es set_ad_spend.",
26010
+ description: setMonthlyExpenseGuidance.summary + " El importe indicado es el TOTAL del gasto compartido existente; la parte de la operaci\xF3n se calcula conservando el reparto. Es un gasto FIJO: arriendo, sueldos, contador, plataformas \u2014 lo que se paga venda o no. Escribir la misma etiqueta otra vez REEMPLAZA el monto, no suma otro gasto. Sin gastos fijos escritos, la utilidad del mes sale siempre M\xC1S ALTA de lo que es, y ese es el error que nadie reclama. No lo uses para el gasto en anuncios: eso es set_ad_spend.",
25934
26011
  inputSchema: SetMonthlyExpenseInput.shape,
25935
26012
  annotations: OVERWRITES_INTERNAL
25936
26013
  }, async (input) => {
25937
26014
  try {
25938
- const month = input.month ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 7);
25939
- const operationId = input.operationId ?? (await api.getJson("/v1/product-control/operations"))[0]?.id;
25940
26015
  return asText(await api.putJson("/v1/product-control/expenses", {
25941
- month,
26016
+ month: input.month,
26017
+ operationId: input.operationId,
25942
26018
  label: input.label,
25943
- amount: input.amount,
25944
- allocations: operationId ? [
25945
- {
25946
- operationId,
25947
- sharePct: 100
25948
- }
25949
- ] : void 0
26019
+ amount: input.amount
25950
26020
  }));
25951
26021
  } catch (error) {
25952
26022
  throw translateError(error);
@@ -25959,7 +26029,7 @@ function registerProductControlTools(server, api, { transport = "http" } = {}) {
25959
26029
  }, async (input) => {
25960
26030
  try {
25961
26031
  return asText(await api.putJson("/v1/product-control/ad-spend", {
25962
- month: input.month ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 7),
26032
+ month: input.month,
25963
26033
  operationId: input.operationId,
25964
26034
  amount: input.amount
25965
26035
  }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "9.0.0",
3
+ "version": "9.0.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.",