@yoryoboy/bi-mcp 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/index.js +244 -0
  3. package/dist/index.js.map +2 -2
  4. package/dist/mcp-use.json +2 -2
  5. package/dist/src/config/mercadolibre-profile-store.js +106 -0
  6. package/dist/src/config/mercadolibre-profile-store.js.map +7 -0
  7. package/dist/src/config/mercadolibre.js +153 -0
  8. package/dist/src/config/mercadolibre.js.map +7 -0
  9. package/dist/src/services/mercadolibre/mercadolibre-api.js +204 -0
  10. package/dist/src/services/mercadolibre/mercadolibre-api.js.map +7 -0
  11. package/dist/src/services/mercadolibre/mercadolibre-items.js +156 -0
  12. package/dist/src/services/mercadolibre/mercadolibre-items.js.map +7 -0
  13. package/dist/src/services/mercadolibre/mercadolibre-orders.js +65 -0
  14. package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +7 -0
  15. package/dist/src/services/mercadolibre/mercadolibre-questions.js +28 -0
  16. package/dist/src/services/mercadolibre/mercadolibre-questions.js.map +7 -0
  17. package/dist/src/tools/index.js +1 -0
  18. package/dist/src/tools/index.js.map +2 -2
  19. package/dist/src/tools/mercadolibre/answer-question.js +37 -0
  20. package/dist/src/tools/mercadolibre/answer-question.js.map +7 -0
  21. package/dist/src/tools/mercadolibre/create-item.js +82 -0
  22. package/dist/src/tools/mercadolibre/create-item.js.map +7 -0
  23. package/dist/src/tools/mercadolibre/estimate-listing-fee.js +60 -0
  24. package/dist/src/tools/mercadolibre/estimate-listing-fee.js.map +7 -0
  25. package/dist/src/tools/mercadolibre/get-account-context.js +38 -0
  26. package/dist/src/tools/mercadolibre/get-account-context.js.map +7 -0
  27. package/dist/src/tools/mercadolibre/get-category-requirements.js +57 -0
  28. package/dist/src/tools/mercadolibre/get-category-requirements.js.map +7 -0
  29. package/dist/src/tools/mercadolibre/get-item-details.js +97 -0
  30. package/dist/src/tools/mercadolibre/get-item-details.js.map +7 -0
  31. package/dist/src/tools/mercadolibre/get-item-visits.js +92 -0
  32. package/dist/src/tools/mercadolibre/get-item-visits.js.map +7 -0
  33. package/dist/src/tools/mercadolibre/get-listing-quality.js +48 -0
  34. package/dist/src/tools/mercadolibre/get-listing-quality.js.map +7 -0
  35. package/dist/src/tools/mercadolibre/get-order-details.js +115 -0
  36. package/dist/src/tools/mercadolibre/get-order-details.js.map +7 -0
  37. package/dist/src/tools/mercadolibre/get-orders-summary.js +105 -0
  38. package/dist/src/tools/mercadolibre/get-orders-summary.js.map +7 -0
  39. package/dist/src/tools/mercadolibre/get-sales-by-item.js +97 -0
  40. package/dist/src/tools/mercadolibre/get-sales-by-item.js.map +7 -0
  41. package/dist/src/tools/mercadolibre/get-sales-trend.js +83 -0
  42. package/dist/src/tools/mercadolibre/get-sales-trend.js.map +7 -0
  43. package/dist/src/tools/mercadolibre/get-shipping-summary.js +115 -0
  44. package/dist/src/tools/mercadolibre/get-shipping-summary.js.map +7 -0
  45. package/dist/src/tools/mercadolibre/get-store-performance.js +102 -0
  46. package/dist/src/tools/mercadolibre/get-store-performance.js.map +7 -0
  47. package/dist/src/tools/mercadolibre/helpers.js +43 -0
  48. package/dist/src/tools/mercadolibre/helpers.js.map +7 -0
  49. package/dist/src/tools/mercadolibre/index.js +24 -0
  50. package/dist/src/tools/mercadolibre/index.js.map +7 -0
  51. package/dist/src/tools/mercadolibre/pause-or-reactivate-item.js +44 -0
  52. package/dist/src/tools/mercadolibre/pause-or-reactivate-item.js.map +7 -0
  53. package/dist/src/tools/mercadolibre/predict-category.js +49 -0
  54. package/dist/src/tools/mercadolibre/predict-category.js.map +7 -0
  55. package/dist/src/tools/mercadolibre/profile-resolution.js +56 -0
  56. package/dist/src/tools/mercadolibre/profile-resolution.js.map +7 -0
  57. package/dist/src/tools/mercadolibre/search-items.js +91 -0
  58. package/dist/src/tools/mercadolibre/search-items.js.map +7 -0
  59. package/dist/src/tools/mercadolibre/search-questions.js +71 -0
  60. package/dist/src/tools/mercadolibre/search-questions.js.map +7 -0
  61. package/dist/src/tools/mercadolibre/update-item-basic-fields.js +71 -0
  62. package/dist/src/tools/mercadolibre/update-item-basic-fields.js.map +7 -0
  63. package/dist/src/tools/mercadolibre/update-item-description.js +49 -0
  64. package/dist/src/tools/mercadolibre/update-item-description.js.map +7 -0
  65. package/dist/src/tools/mercadolibre/update-item-pictures.js +58 -0
  66. package/dist/src/tools/mercadolibre/update-item-pictures.js.map +7 -0
  67. package/dist/src/tools/mercadolibre/validate-connection.js +44 -0
  68. package/dist/src/tools/mercadolibre/validate-connection.js.map +7 -0
  69. package/dist/src/tools/mercadolibre/write-helpers.js +46 -0
  70. package/dist/src/tools/mercadolibre/write-helpers.js.map +7 -0
  71. package/package.json +1 -1
@@ -0,0 +1,97 @@
1
+ import { error, object } from "mcp-use/server";
2
+ import { z } from "zod";
3
+ import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
4
+ import { searchMercadoLibreOrders } from "../../services/mercadolibre/mercadolibre-orders.js";
5
+ import { stripNulls } from "../../utils/strip-payload.js";
6
+ import {
7
+ asArray,
8
+ asRecord,
9
+ compactDateTime,
10
+ currencyBucket,
11
+ mercadoLibreDateRegex,
12
+ normalizeString,
13
+ roundMoney,
14
+ toNumber
15
+ } from "./helpers.js";
16
+ import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
17
+ import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
18
+ const meliGetSalesByItemSchema = z.object({
19
+ profileId: mercadolibreProfileIdSchemaField,
20
+ startDate: z.string().regex(mercadoLibreDateRegex).describe("Start date in YYYY-MM-DD format."),
21
+ endDate: z.string().regex(mercadoLibreDateRegex).describe("End date in YYYY-MM-DD format."),
22
+ status: z.string().trim().min(1).optional().describe("Optional order status filter."),
23
+ limit: z.number().int().min(1).max(50).optional().describe("Orders page size to aggregate."),
24
+ offset: z.number().int().min(0).max(5e3).optional().describe("Orders offset to aggregate.")
25
+ });
26
+ async function meliGetSalesByItemHandler(params) {
27
+ try {
28
+ const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
29
+ if (!profileResolution.ok) {
30
+ return profileResolution.response;
31
+ }
32
+ const profileId = profileResolution.value.profileId;
33
+ const response = await searchMercadoLibreOrders(profileId, {
34
+ seller: "",
35
+ from: params.startDate,
36
+ to: params.endDate,
37
+ status: params.status,
38
+ limit: params.limit ?? 50,
39
+ offset: params.offset ?? 0
40
+ });
41
+ const orders = asArray(response.results);
42
+ const salesByCurrency = {};
43
+ for (const order of orders) {
44
+ const currencyId = normalizeString(order.currency_id, "UNKNOWN");
45
+ const orderDate = compactDateTime(order.date_created);
46
+ for (const orderItem of asArray(order.order_items)) {
47
+ const item = asRecord(orderItem.item);
48
+ const itemId = normalizeString(item.id);
49
+ const variationId = normalizeString(item.variation_id);
50
+ const itemKey = `${itemId}::${variationId}`;
51
+ const bucket = currencyBucket(
52
+ salesByCurrency,
53
+ currencyId,
54
+ () => ({})
55
+ );
56
+ bucket[itemKey] = bucket[itemKey] ?? {
57
+ item_id: itemId,
58
+ title: normalizeString(item.title),
59
+ variation_id: variationId,
60
+ orders: 0,
61
+ units: 0,
62
+ revenue: 0,
63
+ last_order_date: orderDate
64
+ };
65
+ bucket[itemKey].orders += 1;
66
+ bucket[itemKey].units += toNumber(orderItem.quantity);
67
+ bucket[itemKey].revenue += toNumber(orderItem.unit_price) * toNumber(orderItem.quantity);
68
+ bucket[itemKey].last_order_date = orderDate ?? bucket[itemKey].last_order_date;
69
+ }
70
+ }
71
+ const result = Object.fromEntries(
72
+ Object.entries(salesByCurrency).map(([currencyId, items]) => [
73
+ currencyId,
74
+ Object.values(items).map((item) => ({ ...item, revenue: roundMoney(item.revenue) })).sort((left, right) => right.revenue - left.revenue)
75
+ ])
76
+ );
77
+ return object(
78
+ stripNulls({
79
+ profile_id: profileId,
80
+ metadata: {
81
+ orders_aggregated: orders.length,
82
+ offset: params.offset ?? 0,
83
+ limit: params.limit ?? 50,
84
+ note: "If metadata.total is higher than orders_aggregated, reenviar la misma tool con un offset mayor para completar el agregado."
85
+ },
86
+ sales_by_currency: result
87
+ })
88
+ );
89
+ } catch (err) {
90
+ return error(formatMercadoLibreError(err, "Failed to aggregate MercadoLibre sales by item"));
91
+ }
92
+ }
93
+ export {
94
+ meliGetSalesByItemHandler,
95
+ meliGetSalesByItemSchema
96
+ };
97
+ //# sourceMappingURL=get-sales-by-item.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/get-sales-by-item.ts"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nexport const meliGetSalesByItemSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Orders page size to aggregate.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to aggregate.\"),\n});\n\nexport async function meliGetSalesByItemHandler(\n params: z.infer<typeof meliGetSalesByItemSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n });\n\n const orders = asArray<Record<string, unknown>>(response.results);\n type SalesByItemRow = {\n item_id: string;\n title: string;\n variation_id: string;\n orders: number;\n units: number;\n revenue: number;\n last_order_date?: string | null;\n };\n const salesByCurrency: Record<string, Record<string, SalesByItemRow>> = {};\n\n for (const order of orders) {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const orderDate = compactDateTime(order.date_created);\n for (const orderItem of asArray<Record<string, unknown>>(order.order_items)) {\n const item = asRecord(orderItem.item);\n const itemId = normalizeString(item.id);\n const variationId = normalizeString(item.variation_id);\n const itemKey = `${itemId}::${variationId}`;\n const bucket = currencyBucket<Record<string, SalesByItemRow>>(\n salesByCurrency,\n currencyId,\n () => ({})\n );\n bucket[itemKey] = bucket[itemKey] ?? {\n item_id: itemId,\n title: normalizeString(item.title),\n variation_id: variationId,\n orders: 0,\n units: 0,\n revenue: 0,\n last_order_date: orderDate,\n };\n bucket[itemKey].orders += 1;\n bucket[itemKey].units += toNumber(orderItem.quantity);\n bucket[itemKey].revenue += toNumber(orderItem.unit_price) * toNumber(orderItem.quantity);\n bucket[itemKey].last_order_date = orderDate ?? bucket[itemKey].last_order_date;\n }\n }\n\n const result = Object.fromEntries(\n Object.entries(salesByCurrency).map(([currencyId, items]) => [\n currencyId,\n Object.values(items)\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\n .sort((left, right) => right.revenue - left.revenue),\n ])\n );\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: {\n orders_aggregated: orders.length,\n offset: params.offset ?? 0,\n limit: params.limit ?? 50,\n note: \"If metadata.total is higher than orders_aggregated, reenviar la misma tool con un offset mayor para completar el agregado.\",\n },\n sales_by_currency: result,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to aggregate MercadoLibre sales by item\"));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,83 @@
1
+ import { error, object } from "mcp-use/server";
2
+ import { z } from "zod";
3
+ import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
4
+ import { searchMercadoLibreOrders } from "../../services/mercadolibre/mercadolibre-orders.js";
5
+ import { stripNulls } from "../../utils/strip-payload.js";
6
+ import { asArray, mercadoLibreDateRegex, normalizeString, roundMoney, toNumber } from "./helpers.js";
7
+ import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
8
+ import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
9
+ function getWeekBucket(dateValue) {
10
+ const date = /* @__PURE__ */ new Date(`${dateValue}T00:00:00.000Z`);
11
+ const day = date.getUTCDay() || 7;
12
+ date.setUTCDate(date.getUTCDate() - day + 1);
13
+ return date.toISOString().slice(0, 10);
14
+ }
15
+ const meliGetSalesTrendSchema = z.object({
16
+ profileId: mercadolibreProfileIdSchemaField,
17
+ startDate: z.string().regex(mercadoLibreDateRegex).describe("Start date in YYYY-MM-DD format."),
18
+ endDate: z.string().regex(mercadoLibreDateRegex).describe("End date in YYYY-MM-DD format."),
19
+ granularity: z.enum(["day", "week"]).optional().describe("Trend granularity. Defaults to day."),
20
+ status: z.string().trim().min(1).optional().describe("Optional order status filter."),
21
+ limit: z.number().int().min(1).max(50).optional().describe("Orders page size to aggregate."),
22
+ offset: z.number().int().min(0).max(5e3).optional().describe("Orders offset to aggregate.")
23
+ });
24
+ async function meliGetSalesTrendHandler(params) {
25
+ try {
26
+ const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
27
+ if (!profileResolution.ok) {
28
+ return profileResolution.response;
29
+ }
30
+ const profileId = profileResolution.value.profileId;
31
+ const granularity = params.granularity ?? "day";
32
+ const response = await searchMercadoLibreOrders(profileId, {
33
+ seller: "",
34
+ from: params.startDate,
35
+ to: params.endDate,
36
+ status: params.status,
37
+ limit: params.limit ?? 50,
38
+ offset: params.offset ?? 0
39
+ });
40
+ const buckets = {};
41
+ for (const order of asArray(response.results)) {
42
+ const createdAt = normalizeString(order.date_created);
43
+ const dateBucket = createdAt.slice(0, 10);
44
+ if (!dateBucket) {
45
+ continue;
46
+ }
47
+ const bucketKey = granularity === "week" ? getWeekBucket(dateBucket) : dateBucket;
48
+ const currencyId = normalizeString(order.currency_id, "UNKNOWN");
49
+ buckets[currencyId] = buckets[currencyId] ?? {};
50
+ buckets[currencyId][bucketKey] = buckets[currencyId][bucketKey] ?? {
51
+ bucket: bucketKey,
52
+ orders: 0,
53
+ revenue: 0
54
+ };
55
+ buckets[currencyId][bucketKey].orders += 1;
56
+ buckets[currencyId][bucketKey].revenue += toNumber(order.total_amount);
57
+ }
58
+ return object(
59
+ stripNulls({
60
+ profile_id: profileId,
61
+ granularity,
62
+ trend_by_currency: Object.fromEntries(
63
+ Object.entries(buckets).map(([currencyId, items]) => [
64
+ currencyId,
65
+ Object.values(items).map((item) => ({ ...item, revenue: roundMoney(item.revenue) })).sort((left, right) => left.bucket.localeCompare(right.bucket))
66
+ ])
67
+ ),
68
+ metadata: {
69
+ orders_aggregated: asArray(response.results).length,
70
+ limit: params.limit ?? 50,
71
+ offset: params.offset ?? 0
72
+ }
73
+ })
74
+ );
75
+ } catch (err) {
76
+ return error(formatMercadoLibreError(err, "Failed to build MercadoLibre sales trend"));
77
+ }
78
+ }
79
+ export {
80
+ meliGetSalesTrendHandler,
81
+ meliGetSalesTrendSchema
82
+ };
83
+ //# sourceMappingURL=get-sales-trend.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/get-sales-trend.ts"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asArray, mercadoLibreDateRegex, normalizeString, roundMoney, toNumber } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nfunction getWeekBucket(dateValue: string): string {\n const date = new Date(`${dateValue}T00:00:00.000Z`);\n const day = date.getUTCDay() || 7;\n date.setUTCDate(date.getUTCDate() - day + 1);\n return date.toISOString().slice(0, 10);\n}\n\nexport const meliGetSalesTrendSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n granularity: z.enum([\"day\", \"week\"]).optional().describe(\"Trend granularity. Defaults to day.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Orders page size to aggregate.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to aggregate.\"),\n});\n\nexport async function meliGetSalesTrendHandler(params: z.infer<typeof meliGetSalesTrendSchema>) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const granularity = params.granularity ?? \"day\";\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n });\n\n const buckets: Record<string, Record<string, { bucket: string; orders: number; revenue: number }>> = {};\n\n for (const order of asArray<Record<string, unknown>>(response.results)) {\n const createdAt = normalizeString(order.date_created);\n const dateBucket = createdAt.slice(0, 10);\n if (!dateBucket) {\n continue;\n }\n\n const bucketKey = granularity === \"week\" ? getWeekBucket(dateBucket) : dateBucket;\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n buckets[currencyId] = buckets[currencyId] ?? {};\n buckets[currencyId][bucketKey] = buckets[currencyId][bucketKey] ?? {\n bucket: bucketKey,\n orders: 0,\n revenue: 0,\n };\n buckets[currencyId][bucketKey].orders += 1;\n buckets[currencyId][bucketKey].revenue += toNumber(order.total_amount);\n }\n\n return object(\n stripNulls({\n profile_id: profileId,\n granularity,\n trend_by_currency: Object.fromEntries(\n Object.entries(buckets).map(([currencyId, items]) => [\n currencyId,\n Object.values(items)\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\n .sort((left, right) => left.bucket.localeCompare(right.bucket)),\n ])\n ),\n metadata: {\n orders_aggregated: asArray(response.results).length,\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n },\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to build MercadoLibre sales trend\"));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,115 @@
1
+ import { error, object } from "mcp-use/server";
2
+ import { z } from "zod";
3
+ import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
4
+ import {
5
+ getMercadoLibreShipment,
6
+ getMercadoLibreShipmentCosts,
7
+ searchMercadoLibreOrders
8
+ } from "../../services/mercadolibre/mercadolibre-orders.js";
9
+ import { stripNulls } from "../../utils/strip-payload.js";
10
+ import {
11
+ asArray,
12
+ asRecord,
13
+ currencyBucket,
14
+ mercadoLibreDateRegex,
15
+ normalizeString,
16
+ roundMoney,
17
+ toNumber
18
+ } from "./helpers.js";
19
+ import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
20
+ import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
21
+ const meliGetShippingSummarySchema = z.object({
22
+ profileId: mercadolibreProfileIdSchemaField,
23
+ startDate: z.string().regex(mercadoLibreDateRegex).describe("Start date in YYYY-MM-DD format."),
24
+ endDate: z.string().regex(mercadoLibreDateRegex).describe("End date in YYYY-MM-DD format."),
25
+ status: z.string().trim().min(1).optional().describe("Optional order status filter."),
26
+ limit: z.number().int().min(1).max(30).optional().describe("Orders page size to inspect for shipping data."),
27
+ offset: z.number().int().min(0).max(5e3).optional().describe("Orders offset to inspect.")
28
+ });
29
+ async function meliGetShippingSummaryHandler(params) {
30
+ try {
31
+ const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
32
+ if (!profileResolution.ok) {
33
+ return profileResolution.response;
34
+ }
35
+ const profileId = profileResolution.value.profileId;
36
+ const ordersResponse = await searchMercadoLibreOrders(profileId, {
37
+ seller: "",
38
+ from: params.startDate,
39
+ to: params.endDate,
40
+ status: params.status,
41
+ limit: params.limit ?? 20,
42
+ offset: params.offset ?? 0
43
+ });
44
+ const statusCounts = {};
45
+ const substatusCounts = {};
46
+ const costsByCurrency = {};
47
+ const partialFailures = [];
48
+ const shipmentRows = [];
49
+ for (const order of asArray(ordersResponse.results)) {
50
+ const shipping = asRecord(order.shipping);
51
+ const shipmentId = normalizeString(shipping.id);
52
+ if (!shipmentId) {
53
+ continue;
54
+ }
55
+ try {
56
+ const [shipment, costs] = await Promise.all([
57
+ getMercadoLibreShipment(profileId, shipmentId),
58
+ getMercadoLibreShipmentCosts(profileId, shipmentId)
59
+ ]);
60
+ const shipmentStatus = normalizeString(shipment.status, "unknown");
61
+ const shipmentSubstatus = normalizeString(shipment.substatus, "unknown");
62
+ statusCounts[shipmentStatus] = (statusCounts[shipmentStatus] ?? 0) + 1;
63
+ substatusCounts[shipmentSubstatus] = (substatusCounts[shipmentSubstatus] ?? 0) + 1;
64
+ const currencyId = normalizeString(order.currency_id, "UNKNOWN");
65
+ const bucket = currencyBucket(costsByCurrency, currencyId, () => ({ shipments: 0, total_cost: 0 }));
66
+ bucket.shipments += 1;
67
+ bucket.total_cost += toNumber(asRecord(costs.senders).cost) || toNumber(asRecord(costs.receiver).cost) || toNumber(costs.gross_amount) || toNumber(costs.cost);
68
+ shipmentRows.push(
69
+ stripNulls({
70
+ order_id: normalizeString(order.id),
71
+ shipment_id: shipmentId,
72
+ status: shipmentStatus,
73
+ substatus: shipmentSubstatus,
74
+ logistic_type: normalizeString(shipment.logistic_type),
75
+ mode: normalizeString(shipment.mode),
76
+ currency_id: currencyId,
77
+ cost: roundMoney(bucket.total_cost)
78
+ })
79
+ );
80
+ } catch (shipmentError) {
81
+ partialFailures.push({
82
+ order_id: normalizeString(order.id),
83
+ shipment_id: shipmentId,
84
+ message: formatMercadoLibreError(shipmentError, `Failed to inspect shipment ${shipmentId}`)
85
+ });
86
+ }
87
+ }
88
+ for (const metrics of Object.values(costsByCurrency)) {
89
+ metrics.total_cost = roundMoney(metrics.total_cost);
90
+ }
91
+ return object(
92
+ stripNulls({
93
+ profile_id: profileId,
94
+ metadata: {
95
+ orders_inspected: asArray(ordersResponse.results).length,
96
+ shipments_inspected: shipmentRows.length,
97
+ partial_failures: partialFailures.length,
98
+ has_partial_failures: partialFailures.length > 0
99
+ },
100
+ status_counts: statusCounts,
101
+ substatus_counts: substatusCounts,
102
+ costs_by_currency: costsByCurrency,
103
+ shipments: shipmentRows,
104
+ failures: partialFailures
105
+ })
106
+ );
107
+ } catch (err) {
108
+ return error(formatMercadoLibreError(err, "Failed to summarize MercadoLibre shipping"));
109
+ }
110
+ }
111
+ export {
112
+ meliGetShippingSummaryHandler,
113
+ meliGetShippingSummarySchema
114
+ };
115
+ //# sourceMappingURL=get-shipping-summary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/get-shipping-summary.ts"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreShipment,\n getMercadoLibreShipmentCosts,\n searchMercadoLibreOrders,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nexport const meliGetShippingSummarySchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\n limit: z.number().int().min(1).max(30).optional().describe(\"Orders page size to inspect for shipping data.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to inspect.\"),\n});\n\nexport async function meliGetShippingSummaryHandler(\n params: z.infer<typeof meliGetShippingSummarySchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const ordersResponse = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: params.limit ?? 20,\n offset: params.offset ?? 0,\n });\n\n const statusCounts: Record<string, number> = {};\n const substatusCounts: Record<string, number> = {};\n const costsByCurrency: Record<string, { shipments: number; total_cost: number }> = {};\n const partialFailures: Array<{ order_id?: string; shipment_id?: string; message: string }> = [];\n const shipmentRows: Array<Record<string, unknown>> = [];\n\n for (const order of asArray<Record<string, unknown>>(ordersResponse.results)) {\n const shipping = asRecord(order.shipping);\n const shipmentId = normalizeString(shipping.id);\n if (!shipmentId) {\n continue;\n }\n\n try {\n const [shipment, costs] = await Promise.all([\n getMercadoLibreShipment(profileId, shipmentId),\n getMercadoLibreShipmentCosts(profileId, shipmentId),\n ]);\n const shipmentStatus = normalizeString(shipment.status, \"unknown\");\n const shipmentSubstatus = normalizeString(shipment.substatus, \"unknown\");\n statusCounts[shipmentStatus] = (statusCounts[shipmentStatus] ?? 0) + 1;\n substatusCounts[shipmentSubstatus] = (substatusCounts[shipmentSubstatus] ?? 0) + 1;\n\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const bucket = currencyBucket(costsByCurrency, currencyId, () => ({ shipments: 0, total_cost: 0 }));\n bucket.shipments += 1;\n bucket.total_cost +=\n toNumber(asRecord(costs.senders).cost) ||\n toNumber(asRecord(costs.receiver).cost) ||\n toNumber(costs.gross_amount) ||\n toNumber(costs.cost);\n\n shipmentRows.push(\n stripNulls({\n order_id: normalizeString(order.id),\n shipment_id: shipmentId,\n status: shipmentStatus,\n substatus: shipmentSubstatus,\n logistic_type: normalizeString(shipment.logistic_type),\n mode: normalizeString(shipment.mode),\n currency_id: currencyId,\n cost: roundMoney(bucket.total_cost),\n })\n );\n } catch (shipmentError) {\n partialFailures.push({\n order_id: normalizeString(order.id),\n shipment_id: shipmentId,\n message: formatMercadoLibreError(shipmentError, `Failed to inspect shipment ${shipmentId}`),\n });\n }\n }\n\n for (const metrics of Object.values(costsByCurrency)) {\n metrics.total_cost = roundMoney(metrics.total_cost);\n }\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: {\n orders_inspected: asArray(ordersResponse.results).length,\n shipments_inspected: shipmentRows.length,\n partial_failures: partialFailures.length,\n has_partial_failures: partialFailures.length > 0,\n },\n status_counts: statusCounts,\n substatus_counts: substatusCounts,\n costs_by_currency: costsByCurrency,\n shipments: shipmentRows,\n failures: partialFailures,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to summarize MercadoLibre shipping\"));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,102 @@
1
+ import { error, object } from "mcp-use/server";
2
+ import { z } from "zod";
3
+ import { getMercadoLibreAccessForProfile } from "../../config/mercadolibre.js";
4
+ import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
5
+ import { searchMercadoLibreItems, getMercadoLibreUserItemsVisits } from "../../services/mercadolibre/mercadolibre-items.js";
6
+ import { searchMercadoLibreOrders } from "../../services/mercadolibre/mercadolibre-orders.js";
7
+ import { stripNulls } from "../../utils/strip-payload.js";
8
+ import {
9
+ asArray,
10
+ asRecord,
11
+ currencyBucket,
12
+ mercadoLibreDateRegex,
13
+ normalizeString,
14
+ roundMoney,
15
+ toNumber
16
+ } from "./helpers.js";
17
+ import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
18
+ import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
19
+ const meliGetStorePerformanceSchema = z.object({
20
+ profileId: mercadolibreProfileIdSchemaField,
21
+ startDate: z.string().regex(mercadoLibreDateRegex).describe("Start date in YYYY-MM-DD format."),
22
+ endDate: z.string().regex(mercadoLibreDateRegex).describe("End date in YYYY-MM-DD format."),
23
+ ordersLimit: z.number().int().min(1).max(50).optional().describe("Orders sample size to analyze. Defaults to 30."),
24
+ itemsLimit: z.number().int().min(1).max(50).optional().describe("Items sample size to analyze. Defaults to 20.")
25
+ });
26
+ async function meliGetStorePerformanceHandler(params) {
27
+ try {
28
+ const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
29
+ if (!profileResolution.ok) {
30
+ return profileResolution.response;
31
+ }
32
+ const profileId = profileResolution.value.profileId;
33
+ const access = await getMercadoLibreAccessForProfile(profileId);
34
+ const [ordersResponse, itemsResponse, visitsResponse] = await Promise.all([
35
+ searchMercadoLibreOrders(profileId, {
36
+ seller: access.sellerId,
37
+ from: params.startDate,
38
+ to: params.endDate,
39
+ limit: params.ordersLimit ?? 30,
40
+ offset: 0
41
+ }),
42
+ searchMercadoLibreItems(profileId, {
43
+ sellerId: access.sellerId,
44
+ limit: params.itemsLimit ?? 20,
45
+ offset: 0
46
+ }),
47
+ getMercadoLibreUserItemsVisits(profileId, access.sellerId, params.startDate, params.endDate)
48
+ ]);
49
+ const orders = asArray(ordersResponse.results);
50
+ const items = asArray(itemsResponse.results);
51
+ const visitsRows = asArray(visitsResponse.results ?? visitsResponse.items ?? visitsResponse.visits);
52
+ const revenueByCurrency = {};
53
+ const topItems = /* @__PURE__ */ new Map();
54
+ for (const order of orders) {
55
+ const currencyId = normalizeString(order.currency_id, "UNKNOWN");
56
+ const bucket = currencyBucket(revenueByCurrency, currencyId, () => ({ orders: 0, revenue: 0 }));
57
+ bucket.orders += 1;
58
+ bucket.revenue += toNumber(order.total_amount);
59
+ for (const orderItem of asArray(order.order_items)) {
60
+ const item = asRecord(orderItem.item);
61
+ const key = normalizeString(item.id);
62
+ topItems.set(key, {
63
+ item_id: key,
64
+ title: normalizeString(item.title),
65
+ units: (topItems.get(key)?.units ?? 0) + toNumber(orderItem.quantity),
66
+ revenue: (topItems.get(key)?.revenue ?? 0) + toNumber(orderItem.unit_price) * toNumber(orderItem.quantity)
67
+ });
68
+ }
69
+ }
70
+ for (const metrics of Object.values(revenueByCurrency)) {
71
+ metrics.revenue = roundMoney(metrics.revenue);
72
+ }
73
+ const warnings = [];
74
+ if (orders.length >= (params.ordersLimit ?? 30)) {
75
+ warnings.push("La muestra de \xF3rdenes puede ser parcial. Si necesit\xE1s totales completos, reenviar con mayor rango paginado.");
76
+ }
77
+ if (visitsRows.length === 0) {
78
+ warnings.push("MercadoLibre no devolvi\xF3 filas de visitas para el rango indicado.");
79
+ }
80
+ return object(
81
+ stripNulls({
82
+ profile_id: profileId,
83
+ seller_id: access.sellerId,
84
+ executive_summary: {
85
+ orders_sampled: orders.length,
86
+ active_items_sampled: items.length,
87
+ total_visits: toNumber(visitsResponse.total_visits) || visitsRows.reduce((sum, row) => sum + toNumber(row.total_visits ?? row.visits), 0),
88
+ revenue_by_currency: revenueByCurrency
89
+ },
90
+ top_items: Array.from(topItems.values()).map((item) => ({ ...item, revenue: roundMoney(item.revenue) })).sort((left, right) => right.revenue - left.revenue).slice(0, 10),
91
+ warnings
92
+ })
93
+ );
94
+ } catch (err) {
95
+ return error(formatMercadoLibreError(err, "Failed to build MercadoLibre store performance summary"));
96
+ }
97
+ }
98
+ export {
99
+ meliGetStorePerformanceHandler,
100
+ meliGetStorePerformanceSchema
101
+ };
102
+ //# sourceMappingURL=get-store-performance.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/get-store-performance.ts"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreItems, getMercadoLibreUserItemsVisits } from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nexport const meliGetStorePerformanceSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n ordersLimit: z.number().int().min(1).max(50).optional().describe(\"Orders sample size to analyze. Defaults to 30.\"),\n itemsLimit: z.number().int().min(1).max(50).optional().describe(\"Items sample size to analyze. Defaults to 20.\"),\n});\n\nexport async function meliGetStorePerformanceHandler(\n params: z.infer<typeof meliGetStorePerformanceSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const access = await getMercadoLibreAccessForProfile(profileId);\n const [ordersResponse, itemsResponse, visitsResponse] = await Promise.all([\n searchMercadoLibreOrders(profileId, {\n seller: access.sellerId,\n from: params.startDate,\n to: params.endDate,\n limit: params.ordersLimit ?? 30,\n offset: 0,\n }),\n searchMercadoLibreItems(profileId, {\n sellerId: access.sellerId,\n limit: params.itemsLimit ?? 20,\n offset: 0,\n }),\n getMercadoLibreUserItemsVisits(profileId, access.sellerId, params.startDate, params.endDate),\n ]);\n\n const orders = asArray<Record<string, unknown>>(ordersResponse.results);\n const items = asArray<string | Record<string, unknown>>(itemsResponse.results);\n const visitsRows = asArray<Record<string, unknown>>(visitsResponse.results ?? visitsResponse.items ?? visitsResponse.visits);\n\n const revenueByCurrency: Record<string, { orders: number; revenue: number }> = {};\n const topItems = new Map<string, { item_id: string; title: string; units: number; revenue: number }>();\n for (const order of orders) {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const bucket = currencyBucket(revenueByCurrency, currencyId, () => ({ orders: 0, revenue: 0 }));\n bucket.orders += 1;\n bucket.revenue += toNumber(order.total_amount);\n for (const orderItem of asArray<Record<string, unknown>>(order.order_items)) {\n const item = asRecord(orderItem.item);\n const key = normalizeString(item.id);\n topItems.set(key, {\n item_id: key,\n title: normalizeString(item.title),\n units: (topItems.get(key)?.units ?? 0) + toNumber(orderItem.quantity),\n revenue: (topItems.get(key)?.revenue ?? 0) + toNumber(orderItem.unit_price) * toNumber(orderItem.quantity),\n });\n }\n }\n\n for (const metrics of Object.values(revenueByCurrency)) {\n metrics.revenue = roundMoney(metrics.revenue);\n }\n\n const warnings: string[] = [];\n if (orders.length >= (params.ordersLimit ?? 30)) {\n warnings.push(\"La muestra de \u00F3rdenes puede ser parcial. Si necesit\u00E1s totales completos, reenviar con mayor rango paginado.\");\n }\n if (visitsRows.length === 0) {\n warnings.push(\"MercadoLibre no devolvi\u00F3 filas de visitas para el rango indicado.\");\n }\n\n return object(\n stripNulls({\n profile_id: profileId,\n seller_id: access.sellerId,\n executive_summary: {\n orders_sampled: orders.length,\n active_items_sampled: items.length,\n total_visits: toNumber(visitsResponse.total_visits) || visitsRows.reduce((sum, row) => sum + toNumber(row.total_visits ?? row.visits), 0),\n revenue_by_currency: revenueByCurrency,\n },\n top_items: Array.from(topItems.values())\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\n .sort((left, right) => right.revenue - left.revenue)\n .slice(0, 10),\n warnings,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to build MercadoLibre store performance summary\"));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,43 @@
1
+ const mercadoLibreDateRegex = /^\d{4}-\d{2}-\d{2}$/;
2
+ function toNumber(value) {
3
+ const numericValue = typeof value === "number" ? value : Number(value ?? 0);
4
+ return Number.isFinite(numericValue) ? numericValue : 0;
5
+ }
6
+ function compactDateTime(value) {
7
+ if (typeof value !== "string" || !value) {
8
+ return null;
9
+ }
10
+ const match = value.match(/^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2})/);
11
+ if (!match) {
12
+ return value;
13
+ }
14
+ return `${match[1]} ${match[2]}`;
15
+ }
16
+ function asArray(value) {
17
+ return Array.isArray(value) ? value : [];
18
+ }
19
+ function asRecord(value) {
20
+ return value && typeof value === "object" ? value : {};
21
+ }
22
+ function currencyBucket(store, currencyId, initial) {
23
+ const key = currencyId.trim() || "UNKNOWN";
24
+ store[key] = store[key] ?? initial();
25
+ return store[key];
26
+ }
27
+ function roundMoney(value) {
28
+ return Number(value.toFixed(2));
29
+ }
30
+ function normalizeString(value, fallback = "") {
31
+ return typeof value === "string" ? value : fallback;
32
+ }
33
+ export {
34
+ asArray,
35
+ asRecord,
36
+ compactDateTime,
37
+ currencyBucket,
38
+ mercadoLibreDateRegex,
39
+ normalizeString,
40
+ roundMoney,
41
+ toNumber
42
+ };
43
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/helpers.ts"],
4
+ "sourcesContent": ["export const mercadoLibreDateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function toNumber(value: unknown): number {\n const numericValue = typeof value === \"number\" ? value : Number(value ?? 0);\n return Number.isFinite(numericValue) ? numericValue : 0;\n}\n\nexport function compactDateTime(value: unknown): string | null {\n if (typeof value !== \"string\" || !value) {\n return null;\n }\n\n const match = value.match(/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2})/);\n if (!match) {\n return value;\n }\n\n return `${match[1]} ${match[2]}`;\n}\n\nexport function asArray<T = Record<string, unknown>>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n\nexport function currencyBucket<T>(store: Record<string, T>, currencyId: string, initial: () => T): T {\n const key = currencyId.trim() || \"UNKNOWN\";\n store[key] = store[key] ?? initial();\n return store[key];\n}\n\nexport function roundMoney(value: number): number {\n return Number(value.toFixed(2));\n}\n\nexport function normalizeString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n"],
5
+ "mappings": "AAAO,MAAM,wBAAwB;AAE9B,SAAS,SAAS,OAAwB;AAC/C,QAAM,eAAe,OAAO,UAAU,WAAW,QAAQ,OAAO,SAAS,CAAC;AAC1E,SAAO,OAAO,SAAS,YAAY,IAAI,eAAe;AACxD;AAEO,SAAS,gBAAgB,OAA+B;AAC7D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,uCAAuC;AACjE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAChC;AAEO,SAAS,QAAqC,OAAqB;AACxE,SAAO,MAAM,QAAQ,KAAK,IAAK,QAAgB,CAAC;AAClD;AAEO,SAAS,SAAS,OAAyC;AAChE,SAAO,SAAS,OAAO,UAAU,WAAY,QAAoC,CAAC;AACpF;AAEO,SAAS,eAAkB,OAA0B,YAAoB,SAAqB;AACnG,QAAM,MAAM,WAAW,KAAK,KAAK;AACjC,QAAM,GAAG,IAAI,MAAM,GAAG,KAAK,QAAQ;AACnC,SAAO,MAAM,GAAG;AAClB;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEO,SAAS,gBAAgB,OAAgB,WAAW,IAAY;AACrE,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ export * from "./get-account-context.js";
2
+ export * from "./validate-connection.js";
3
+ export * from "./get-orders-summary.js";
4
+ export * from "./get-order-details.js";
5
+ export * from "./get-sales-by-item.js";
6
+ export * from "./get-sales-trend.js";
7
+ export * from "./get-shipping-summary.js";
8
+ export * from "./get-item-visits.js";
9
+ export * from "./get-store-performance.js";
10
+ export * from "./search-items.js";
11
+ export * from "./get-item-details.js";
12
+ export * from "./get-listing-quality.js";
13
+ export * from "./predict-category.js";
14
+ export * from "./get-category-requirements.js";
15
+ export * from "./estimate-listing-fee.js";
16
+ export * from "./create-item.js";
17
+ export * from "./update-item-basic-fields.js";
18
+ export * from "./update-item-description.js";
19
+ export * from "./update-item-pictures.js";
20
+ export * from "./pause-or-reactivate-item.js";
21
+ export * from "./search-questions.js";
22
+ export * from "./answer-question.js";
23
+ export * from "./profile-resolution.js";
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/index.ts"],
4
+ "sourcesContent": ["export * from \"./get-account-context.js\";\nexport * from \"./validate-connection.js\";\nexport * from \"./get-orders-summary.js\";\nexport * from \"./get-order-details.js\";\nexport * from \"./get-sales-by-item.js\";\nexport * from \"./get-sales-trend.js\";\nexport * from \"./get-shipping-summary.js\";\nexport * from \"./get-item-visits.js\";\nexport * from \"./get-store-performance.js\";\nexport * from \"./search-items.js\";\nexport * from \"./get-item-details.js\";\nexport * from \"./get-listing-quality.js\";\nexport * from \"./predict-category.js\";\nexport * from \"./get-category-requirements.js\";\nexport * from \"./estimate-listing-fee.js\";\nexport * from \"./create-item.js\";\nexport * from \"./update-item-basic-fields.js\";\nexport * from \"./update-item-description.js\";\nexport * from \"./update-item-pictures.js\";\nexport * from \"./pause-or-reactivate-item.js\";\nexport * from \"./search-questions.js\";\nexport * from \"./answer-question.js\";\nexport * from \"./profile-resolution.js\";\n"],
5
+ "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ import {
3
+ getMercadoLibreItem,
4
+ updateMercadoLibreItem
5
+ } from "../../services/mercadolibre/mercadolibre-items.js";
6
+ import {
7
+ buildMercadoLibreWriteSuccessResponse,
8
+ handleMercadoLibreWriteError,
9
+ mercadolibreProfileIdSchemaField,
10
+ resolveMercadoLibreWriteProfile
11
+ } from "./write-helpers.js";
12
+ const meliPauseOrReactivateItemSchema = z.object({
13
+ profileId: mercadolibreProfileIdSchemaField,
14
+ itemId: z.string().trim().min(1).describe("MercadoLibre item id."),
15
+ status: z.enum(["active", "paused"]).describe("Target status for the item.")
16
+ });
17
+ async function meliPauseOrReactivateItemHandler(params) {
18
+ try {
19
+ const profileResolution = await resolveMercadoLibreWriteProfile(params.profileId);
20
+ if (!profileResolution.ok) {
21
+ return profileResolution.response;
22
+ }
23
+ const profileId = profileResolution.value.profileId;
24
+ const before = await getMercadoLibreItem(profileId, params.itemId);
25
+ const after = await updateMercadoLibreItem(profileId, params.itemId, {
26
+ status: params.status
27
+ });
28
+ return buildMercadoLibreWriteSuccessResponse({
29
+ profileId,
30
+ operation: "pause_or_reactivate_item",
31
+ resourceId: params.itemId,
32
+ message: `MercadoLibre item status changed to ${params.status}.`,
33
+ before,
34
+ after
35
+ });
36
+ } catch (err) {
37
+ return handleMercadoLibreWriteError(err, `Failed to change status for ${params.itemId}`);
38
+ }
39
+ }
40
+ export {
41
+ meliPauseOrReactivateItemHandler,
42
+ meliPauseOrReactivateItemSchema
43
+ };
44
+ //# sourceMappingURL=pause-or-reactivate-item.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/pause-or-reactivate-item.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport {\n getMercadoLibreItem,\n updateMercadoLibreItem,\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport {\n buildMercadoLibreWriteSuccessResponse,\n handleMercadoLibreWriteError,\n mercadolibreProfileIdSchemaField,\n resolveMercadoLibreWriteProfile,\n} from \"./write-helpers.js\";\n\nexport const meliPauseOrReactivateItemSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n itemId: z.string().trim().min(1).describe(\"MercadoLibre item id.\"),\n status: z.enum([\"active\", \"paused\"]).describe(\"Target status for the item.\"),\n});\n\nexport async function meliPauseOrReactivateItemHandler(\n params: z.infer<typeof meliPauseOrReactivateItemSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const before = await getMercadoLibreItem(profileId, params.itemId);\n const after = await updateMercadoLibreItem(profileId, params.itemId, {\n status: params.status,\n });\n\n return buildMercadoLibreWriteSuccessResponse({\n profileId,\n operation: \"pause_or_reactivate_item\",\n resourceId: params.itemId,\n message: `MercadoLibre item status changed to ${params.status}.`,\n before,\n after,\n });\n } catch (err) {\n return handleMercadoLibreWriteError(err, `Failed to change status for ${params.itemId}`);\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,WAAW;AAAA,EACX,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,uBAAuB;AAAA,EACjE,QAAQ,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAS,6BAA6B;AAC7E,CAAC;AAED,eAAsB,iCACpB,QACA;AACA,MAAI;AACF,UAAM,oBAAoB,MAAM,gCAAgC,OAAO,SAAS;AAChF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAM,SAAS,MAAM,oBAAoB,WAAW,OAAO,MAAM;AACjE,UAAM,QAAQ,MAAM,uBAAuB,WAAW,OAAO,QAAQ;AAAA,MACnE,QAAQ,OAAO;AAAA,IACjB,CAAC;AAED,WAAO,sCAAsC;AAAA,MAC3C;AAAA,MACA,WAAW;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,SAAS,uCAAuC,OAAO,MAAM;AAAA,MAC7D;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,6BAA6B,KAAK,+BAA+B,OAAO,MAAM,EAAE;AAAA,EACzF;AACF;",
6
+ "names": []
7
+ }