@yoryoboy/bi-mcp 1.14.2 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/mcp-use.json +2 -2
- package/dist/src/services/vtex/__tests__/vtex-catalog.test.js +2 -5
- package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +2 -2
- package/dist/src/services/vtex/vtex-catalog.js +1 -1
- package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-order-details.js +18 -4
- package/dist/src/tools/mercadolibre/get-order-details.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-orders-summary.js +6 -2
- package/dist/src/tools/mercadolibre/get-orders-summary.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-shipping-summary.js +50 -14
- package/dist/src/tools/mercadolibre/get-shipping-summary.js.map +2 -2
- package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js +21 -2
- package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js.map +2 -2
- package/dist/src/tools/vtex/catalog-navigation-reads.js +1 -1
- package/dist/src/tools/vtex/catalog-navigation-reads.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js +16 -4
- package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js +25 -3
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js +141 -5
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js +3 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js.map +2 -2
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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 {\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreShipmentBatch,\n getMercadoLibreShipmentCostsBatch,\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeScalarString,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst PAGE_FETCH_CONCURRENCY = 15;\nconst PAGE_FETCH_MAX_RETRIES = 2;\nconst SHIPPING_DETAIL_MAX_PAGES_PER_CALL = 15;\nconst DEFAULT_CALCULATIONS_PAGE_LIMIT = 50;\nconst DEFAULT_SHIPPING_DETAIL_PAGE_LIMIT = 50;\nconst BUSINESS_TIME_ZONE = \"America/Argentina/Buenos_Aires\";\nconst TOP_LIMIT = 10;\nconst shipmentsSchema = [\n \"order_id\",\n \"shipment_id\",\n \"status\",\n \"substatus\",\n \"logistic_type\",\n \"mode\",\n \"currency_id\",\n \"cost\",\n] as const;\n\ntype FailedPage = {\n offset: number;\n limit: number;\n page_number: number;\n message: string;\n status_code?: number;\n attempts: number;\n retryable: boolean;\n};\n\ntype ShipmentFailure = {\n order_id?: string;\n shipment_id?: string;\n stage: \"shipment\" | \"costs\";\n message: string;\n status_code?: number;\n attempts?: number;\n retryable?: boolean;\n};\n\ntype BreakdownEntry = {\n key: string;\n orders: number;\n rate: number;\n};\n\ntype BreakdownResult = {\n entries: BreakdownEntry[];\n other_orders?: number;\n other_rate?: number;\n};\n\ntype ShippingMode = \"calculations\" | \"shipments_chunk\";\n\ntype ShippingMetadata = ReturnType<typeof buildShippingSummaryMetadata>;\n\ntype ShippingCostBucket = {\n shipments: number;\n shipments_with_cost: number;\n zero_cost_shipments: number;\n total_cost: number;\n};\n\ntype DailyShippingMetric = {\n date: string;\n shipments: number;\n delivered_shipments: number;\n cancelled_shipments: number;\n not_delivered_shipments: number;\n shipping_cost_by_currency: Record<string, number>;\n};\n\nfunction safeRate(numerator: number, denominator: number): number {\n if (!Number.isFinite(denominator) || denominator <= 0) {\n return 0;\n }\n\n return Number((numerator / denominator).toFixed(4));\n}\n\nfunction topBreakdownFromMap(\n counts: Map<string, number>,\n total: number,\n limit = TOP_LIMIT\n): BreakdownResult {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, total),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, total) : undefined,\n }) as BreakdownResult;\n}\n\nfunction incrementCount(map: Map<string, number>, key: string) {\n if (!key) {\n return;\n }\n\n map.set(key, (map.get(key) ?? 0) + 1);\n}\n\nfunction topSingleValue(counts: Map<string, number>): string {\n return Array.from(counts.entries())\n .filter(([key]) => key)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))[0]?.[0] ?? \"\";\n}\n\nfunction incrementCurrency(map: Record<string, number>, currencyId: string, amount: number) {\n map[currencyId] = roundMoney((map[currencyId] ?? 0) + amount);\n}\n\nfunction sortedCurrencyTotals(input: Record<string, number>) {\n return Object.fromEntries(\n Object.entries(input)\n .filter(([, amount]) => amount !== 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, amount]) => [currencyId, roundMoney(amount)])\n );\n}\n\nfunction formatDateInTimeZone(dateValue: Date, timeZone: string): string {\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n });\n\n const parts = formatter.formatToParts(dateValue);\n const year = parts.find((part) => part.type === \"year\")?.value;\n const month = parts.find((part) => part.type === \"month\")?.value;\n const day = parts.find((part) => part.type === \"day\")?.value;\n\n if (!year || !month || !day) {\n return \"\";\n }\n\n return `${year}-${month}-${day}`;\n}\n\nfunction getLocalDateBucket(createdAt: string, timeZone: string): string {\n if (!createdAt) {\n return \"\";\n }\n\n const date = new Date(createdAt);\n if (Number.isNaN(date.getTime())) {\n return \"\";\n }\n\n return formatDateInTimeZone(date, timeZone);\n}\n\nfunction buildShippingSummaryMetadata(params: {\n total: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n responseMode: ShippingMode;\n pagesRequested: number;\n pagesSucceeded: number;\n pagesFailed: number;\n failedOffsets: number[];\n shipmentFailures: number;\n}) {\n const requestedWindowEndOffset = params.effectiveOffset + params.effectiveLimit * params.pagesRequested;\n const nextOffset =\n params.responseMode === \"shipments_chunk\"\n ? requestedWindowEndOffset\n : params.effectiveOffset + params.returned;\n const hasMoreOrders = nextOffset < params.total;\n const hasFailures = params.pagesFailed > 0 || params.shipmentFailures > 0;\n const universeFullyFetched =\n params.responseMode === \"calculations\" && !hasFailures && params.returned >= params.total;\n\n let continuation = \"No more pages for this query.\";\n if (params.pagesFailed > 0) {\n const offsets = params.failedOffsets.slice(0, 5).join(\", \");\n const moreOffsets =\n params.failedOffsets.length > 5\n ? ` y ${params.failedOffsets.length - 5} offsets adicionales`\n : \"\";\n continuation =\n params.responseMode === \"shipments_chunk\"\n ? `Se recuperaron paginas parciales. Reintentar primero la misma tool con responseMode=\"shipments_chunk\", offset=${params.failedOffsets[0]} y limit=${params.effectiveLimit}. Offsets fallidos: ${offsets}${moreOffsets}. Luego continuar con offset=${nextOffset} si hace falta.`\n : `Calculos parciales por paginas fallidas. Reintentar la misma tool con responseMode=\"calculations\". Offsets fallidos: ${offsets}${moreOffsets}.`;\n } else if (params.shipmentFailures > 0) {\n continuation =\n params.responseMode === \"shipments_chunk\"\n ? `Se recuperaron shipments parciales. Reintentar la misma tool con responseMode=\"shipments_chunk\", offset=${params.effectiveOffset} y limit=${params.effectiveLimit}${hasMoreOrders ? `. Luego continuar con offset=${nextOffset} si hace falta.` : \".\"}`\n : 'Calculos parciales por fallas al consultar shipments o costos. Reintentar la misma tool con responseMode=\"calculations\".';\n } else if (params.responseMode === \"shipments_chunk\" && hasMoreOrders) {\n continuation = `Para continuar trayendo shipments, volver a invocar meli_get_shipping_summary con los mismos filtros, responseMode=\"shipments_chunk\", offset=${nextOffset} y limit=${params.effectiveLimit}. Repetir hasta has_more=false.`;\n } else if (params.responseMode === \"calculations\") {\n continuation = 'Calculos completos. Si el usuario pide detalle de shipments, invocar la misma tool con responseMode=\"shipments_chunk\", offset=0 y limit=50.';\n }\n\n return stripNulls({\n total: params.total,\n limit: params.effectiveLimit,\n offset: params.effectiveOffset,\n returned: params.returned,\n has_more: params.responseMode === \"shipments_chunk\" ? hasMoreOrders || hasFailures : hasFailures,\n next_offset: params.responseMode === \"shipments_chunk\" && hasMoreOrders ? nextOffset : undefined,\n continuation,\n fetch_mode: params.responseMode === \"shipments_chunk\" ? \"shipments_chunk\" : \"full_calculations\",\n pages_per_call_limit:\n params.responseMode === \"shipments_chunk\" ? SHIPPING_DETAIL_MAX_PAGES_PER_CALL : undefined,\n pages_requested: params.pagesRequested,\n pages_succeeded: params.pagesSucceeded,\n pages_failed: params.pagesFailed,\n shipment_failures: params.shipmentFailures,\n universe_fully_fetched: universeFullyFetched,\n });\n}\n\nfunction extractShipmentCost(costs: Record<string, unknown>) {\n return (\n toNumber(asRecord(costs.senders).cost) ||\n toNumber(asRecord(costs.receiver).cost) ||\n toNumber(costs.gross_amount) ||\n toNumber(costs.cost)\n );\n}\n\nfunction formatCompactShipmentRow(params: {\n orderId: string;\n shipmentId: string;\n status: string;\n substatus: string;\n logisticType: string;\n mode: string;\n currencyId: string;\n cost: number;\n}) {\n return [\n params.orderId,\n params.shipmentId,\n params.status,\n params.substatus,\n params.logisticType,\n params.mode,\n params.currencyId,\n params.cost,\n ];\n}\n\nfunction buildShippingCalculations(params: {\n ordersTotal: number;\n ordersWithShipping: number;\n shipmentsRequested: number;\n shipmentsInspected: number;\n deliveredShipments: number;\n cancelledShipments: number;\n notDeliveredShipments: number;\n statusCounts: Map<string, number>;\n substatusCounts: Map<string, number>;\n logisticTypeCounts: Map<string, number>;\n modeCounts: Map<string, number>;\n costsByCurrency: Record<string, ShippingCostBucket>;\n dailyMetrics: Map<string, DailyShippingMetric>;\n metadata: ShippingMetadata;\n failedPages: FailedPage[];\n shipmentFailures: ShipmentFailure[];\n}) {\n const costsByCurrency = Object.fromEntries(\n Object.entries(params.costsByCurrency)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, bucket]) => [\n currencyId,\n {\n total_shipping_cost: roundMoney(bucket.total_cost),\n shipments: bucket.shipments,\n shipments_with_cost: bucket.shipments_with_cost,\n zero_cost_shipments: bucket.zero_cost_shipments,\n avg_cost_per_shipment: roundMoney(bucket.total_cost / Math.max(1, bucket.shipments)),\n avg_cost_per_shipment_with_cost: roundMoney(\n bucket.total_cost / Math.max(1, bucket.shipments_with_cost)\n ),\n shipping_cost_rate_by_shipment: safeRate(bucket.shipments_with_cost, bucket.shipments),\n },\n ])\n );\n\n const dailyTrend = Array.from(params.dailyMetrics.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, metric]) =>\n stripNulls({\n date: metric.date,\n shipments: metric.shipments,\n delivered_shipments: metric.delivered_shipments,\n cancelled_shipments: metric.cancelled_shipments,\n not_delivered_shipments: metric.not_delivered_shipments,\n shipping_cost_by_currency: sortedCurrencyTotals(metric.shipping_cost_by_currency),\n })\n );\n\n return {\n overview: {\n orders_total: params.ordersTotal,\n orders_with_shipping: params.ordersWithShipping,\n shipments_total: params.shipmentsInspected,\n shipments_requested: params.shipmentsRequested,\n shipping_attachment_rate: safeRate(params.ordersWithShipping, params.ordersTotal),\n delivered_shipments: params.deliveredShipments,\n cancelled_shipments: params.cancelledShipments,\n not_delivered_shipments: params.notDeliveredShipments,\n },\n delivery_health: {\n status_breakdown: topBreakdownFromMap(params.statusCounts, Math.max(1, params.shipmentsInspected)),\n substatus_breakdown: topBreakdownFromMap(params.substatusCounts, Math.max(1, params.shipmentsInspected)),\n delivered_rate: safeRate(params.deliveredShipments, params.shipmentsInspected),\n cancelled_rate: safeRate(params.cancelledShipments, params.shipmentsInspected),\n not_delivered_rate: safeRate(params.notDeliveredShipments, params.shipmentsInspected),\n },\n costs_by_currency: costsByCurrency,\n logistics_mix: {\n logistic_type_breakdown: topBreakdownFromMap(\n params.logisticTypeCounts,\n Math.max(1, params.shipmentsInspected)\n ),\n mode_breakdown: topBreakdownFromMap(params.modeCounts, Math.max(1, params.shipmentsInspected)),\n top_logistic_type_by_shipments: topSingleValue(params.logisticTypeCounts),\n top_mode_by_shipments: topSingleValue(params.modeCounts),\n },\n daily_trend: dailyTrend,\n coverage: {\n fetch_mode: params.metadata.fetch_mode,\n universe_fully_fetched: params.metadata.universe_fully_fetched,\n orders_returned: params.metadata.returned,\n shipments_requested: params.shipmentsRequested,\n shipments_inspected: params.shipmentsInspected,\n pages_requested: params.metadata.pages_requested,\n pages_succeeded: params.metadata.pages_succeeded,\n pages_failed: params.metadata.pages_failed,\n failed_pages_count: params.failedPages.length,\n shipment_failures_count: params.shipmentFailures.length,\n failed_pages: params.failedPages,\n },\n };\n}\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 responseMode: z\n .enum([\"calculations\", \"shipments_chunk\"])\n .optional()\n .default(\"calculations\")\n .describe(\n 'Response mode. calculations (default) fetches all matching orders internally and returns only aggregate shipping KPIs. shipments_chunk returns compact shipment rows for up to 15 MercadoLibre pages and includes continuation metadata.'\n ),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\n 'MercadoLibre page size for responseMode=\"shipments_chunk\" (1-50). Defaults to 50.'\n ),\n offset: z\n .number()\n .int()\n .min(0)\n .max(5000)\n .optional()\n .describe(\n 'Starting offset for responseMode=\"shipments_chunk\". Use metadata.next_offset to continue.'\n ),\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 responseMode = params.responseMode ?? \"calculations\";\n const requestedLimit =\n responseMode === \"shipments_chunk\"\n ? params.limit ?? DEFAULT_SHIPPING_DETAIL_PAGE_LIMIT\n : DEFAULT_CALCULATIONS_PAGE_LIMIT;\n const requestedOffset = responseMode === \"shipments_chunk\" ? params.offset ?? 0 : 0;\n const maxPagesForResponse =\n responseMode === \"shipments_chunk\" ? SHIPPING_DETAIL_MAX_PAGES_PER_CALL : Infinity;\n\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: requestedLimit,\n offset: requestedOffset,\n });\n\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const baseOrders = asArray<Record<string, unknown>>(response.results);\n const effectiveLimit = paging.limit || requestedLimit || baseOrders.length;\n const effectiveOffset = paging.offset || requestedOffset || 0;\n const allOrders = [...baseOrders];\n const failedPages: FailedPage[] = [];\n let pagesRequested = 1;\n let pagesSucceeded = 1;\n\n if (effectiveLimit > 0 && paging.total > baseOrders.length) {\n const nextOffsets: number[] = [];\n const maxPagesRemaining = Math.max(0, maxPagesForResponse - 1);\n let pagesAdded = 0;\n\n for (let nextOffset = effectiveOffset + effectiveLimit; nextOffset < paging.total; nextOffset += effectiveLimit) {\n if (responseMode === \"shipments_chunk\" && pagesAdded >= maxPagesRemaining) {\n break;\n }\n\n nextOffsets.push(nextOffset);\n pagesAdded += 1;\n }\n\n pagesRequested += nextOffsets.length;\n\n if (nextOffsets.length > 0) {\n const batch = await searchMercadoLibreOrdersBatch(\n profileId,\n {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: effectiveLimit,\n },\n nextOffsets,\n {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }\n );\n\n pagesSucceeded += batch.successful.length;\n batch.successful.forEach((entry) => {\n allOrders.push(...asArray<Record<string, unknown>>(entry.document.results));\n });\n batch.failed.forEach((failure) => {\n const failedOffset = Number(failure.id);\n failedPages.push({\n offset: failedOffset,\n limit: effectiveLimit,\n page_number: Math.floor(failedOffset / effectiveLimit) + 1,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n }\n }\n\n const ordersWithShipping = allOrders.reduce((count, order) => {\n return normalizeScalarString(asRecord(order.shipping).id) ? count + 1 : count;\n }, 0);\n\n const orderByShipmentId = new Map<string, Record<string, unknown>>();\n for (const order of allOrders) {\n const shipmentId = normalizeScalarString(asRecord(order.shipping).id);\n if (shipmentId && !orderByShipmentId.has(shipmentId)) {\n orderByShipmentId.set(shipmentId, order);\n }\n }\n\n const shipmentIds = [...orderByShipmentId.keys()];\n const statusCounts = new Map<string, number>();\n const substatusCounts = new Map<string, number>();\n const logisticTypeCounts = new Map<string, number>();\n const modeCounts = new Map<string, number>();\n const costsByCurrency: Record<string, ShippingCostBucket> = {};\n const dailyMetrics = new Map<string, DailyShippingMetric>();\n const failures: ShipmentFailure[] = [];\n const shipmentRows: Array<(string | number)[]> = [];\n let shipmentsInspected = 0;\n let deliveredShipments = 0;\n let cancelledShipments = 0;\n let notDeliveredShipments = 0;\n\n if (shipmentIds.length > 0) {\n const [shipmentsBatch, costsBatch] = await Promise.all([\n getMercadoLibreShipmentBatch(profileId, shipmentIds, {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }),\n getMercadoLibreShipmentCostsBatch(profileId, shipmentIds, {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }),\n ]);\n\n const shipmentById = new Map(\n shipmentsBatch.successful.map((entry) => [entry.id, entry.document] as const)\n );\n const costsByShipmentId = new Map(\n costsBatch.successful.map((entry) => [entry.id, entry.document] as const)\n );\n\n shipmentsBatch.failed.forEach((failure) => {\n failures.push({\n order_id: normalizeScalarString(orderByShipmentId.get(failure.id)?.id),\n shipment_id: failure.id,\n stage: \"shipment\",\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n\n costsBatch.failed.forEach((failure) => {\n failures.push({\n order_id: normalizeScalarString(orderByShipmentId.get(failure.id)?.id),\n shipment_id: failure.id,\n stage: \"costs\",\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n\n for (const shipmentId of shipmentIds) {\n const shipment = shipmentById.get(shipmentId);\n const costs = costsByShipmentId.get(shipmentId);\n if (!shipment || !costs) {\n continue;\n }\n\n const order = orderByShipmentId.get(shipmentId);\n const shipmentStatus = normalizeString(shipment.status, \"unknown\");\n const shipmentSubstatus = normalizeString(shipment.substatus, \"unknown\");\n const logisticType = normalizeString(shipment.logistic_type);\n const mode = normalizeString(shipment.mode);\n const currencyId = normalizeString(order?.currency_id, \"UNKNOWN\");\n const shipmentCost = roundMoney(extractShipmentCost(costs));\n const dayBucket = getLocalDateBucket(normalizeString(order?.date_created), BUSINESS_TIME_ZONE);\n\n shipmentsInspected += 1;\n incrementCount(statusCounts, shipmentStatus);\n incrementCount(substatusCounts, shipmentSubstatus);\n incrementCount(logisticTypeCounts, logisticType || \"unknown\");\n incrementCount(modeCounts, mode || \"unknown\");\n\n if (shipmentStatus === \"delivered\") {\n deliveredShipments += 1;\n }\n if (shipmentStatus === \"cancelled\") {\n cancelledShipments += 1;\n }\n if (shipmentStatus === \"not_delivered\") {\n notDeliveredShipments += 1;\n }\n\n const bucket = currencyBucket(costsByCurrency, currencyId, () => ({\n shipments: 0,\n shipments_with_cost: 0,\n zero_cost_shipments: 0,\n total_cost: 0,\n }));\n bucket.shipments += 1;\n bucket.total_cost += shipmentCost;\n if (shipmentCost > 0) {\n bucket.shipments_with_cost += 1;\n } else {\n bucket.zero_cost_shipments += 1;\n }\n\n if (dayBucket) {\n const dayMetric = dailyMetrics.get(dayBucket) ?? {\n date: dayBucket,\n shipments: 0,\n delivered_shipments: 0,\n cancelled_shipments: 0,\n not_delivered_shipments: 0,\n shipping_cost_by_currency: {},\n };\n dayMetric.shipments += 1;\n if (shipmentStatus === \"delivered\") {\n dayMetric.delivered_shipments += 1;\n }\n if (shipmentStatus === \"cancelled\") {\n dayMetric.cancelled_shipments += 1;\n }\n if (shipmentStatus === \"not_delivered\") {\n dayMetric.not_delivered_shipments += 1;\n }\n incrementCurrency(dayMetric.shipping_cost_by_currency, currencyId, shipmentCost);\n dailyMetrics.set(dayBucket, dayMetric);\n }\n\n if (responseMode === \"shipments_chunk\") {\n shipmentRows.push(\n formatCompactShipmentRow({\n orderId: normalizeScalarString(order?.id),\n shipmentId,\n status: shipmentStatus,\n substatus: shipmentSubstatus,\n logisticType,\n mode,\n currencyId,\n cost: shipmentCost,\n })\n );\n }\n }\n }\n\n for (const metrics of Object.values(costsByCurrency)) {\n metrics.total_cost = roundMoney(metrics.total_cost);\n }\n\n const metadata = buildShippingSummaryMetadata({\n total: paging.total,\n effectiveLimit,\n effectiveOffset,\n returned: allOrders.length,\n responseMode,\n pagesRequested,\n pagesSucceeded,\n pagesFailed: failedPages.length,\n failedOffsets: failedPages.map((failure) => failure.offset),\n shipmentFailures: failures.length,\n });\n\n const calculations =\n responseMode === \"calculations\"\n ? buildShippingCalculations({\n ordersTotal: allOrders.length,\n ordersWithShipping,\n shipmentsRequested: shipmentIds.length,\n shipmentsInspected,\n deliveredShipments,\n cancelledShipments,\n notDeliveredShipments,\n statusCounts,\n substatusCounts,\n logisticTypeCounts,\n modeCounts,\n costsByCurrency,\n dailyMetrics,\n metadata,\n failedPages,\n shipmentFailures: failures,\n })\n : undefined;\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata,\n shipments_schema: responseMode === \"shipments_chunk\" ? shipmentsSchema : undefined,\n shipments: responseMode === \"shipments_chunk\" ? shipmentRows : undefined,\n calculations,\n failures: failures.length > 0 ? failures : undefined,\n failed_pages: failedPages.length > 0 ? failedPages : undefined,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to summarize MercadoLibre shipping\"));\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreShipmentBatch,\n getMercadoLibreShipmentCostsBatch,\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeScalarString,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst PAGE_FETCH_CONCURRENCY = 15;\nconst PAGE_FETCH_MAX_RETRIES = 2;\nconst SHIPPING_DETAIL_MAX_PAGES_PER_CALL = 15;\nconst DEFAULT_CALCULATIONS_PAGE_LIMIT = 50;\nconst DEFAULT_SHIPPING_DETAIL_PAGE_LIMIT = 50;\nconst BUSINESS_TIME_ZONE = \"America/Argentina/Buenos_Aires\";\nconst TOP_LIMIT = 10;\nconst shipmentsSchema = [\n \"order_id\",\n \"shipment_id\",\n \"status\",\n \"substatus\",\n \"logistic_type\",\n \"mode\",\n \"currency_id\",\n \"cost\",\n \"buyer_shipping_paid\",\n] as const;\n\ntype FailedPage = {\n offset: number;\n limit: number;\n page_number: number;\n message: string;\n status_code?: number;\n attempts: number;\n retryable: boolean;\n};\n\ntype ShipmentFailure = {\n order_id?: string;\n shipment_id?: string;\n stage: \"shipment\" | \"costs\";\n message: string;\n status_code?: number;\n attempts?: number;\n retryable?: boolean;\n};\n\ntype BreakdownEntry = {\n key: string;\n orders: number;\n rate: number;\n};\n\ntype BreakdownResult = {\n entries: BreakdownEntry[];\n other_orders?: number;\n other_rate?: number;\n};\n\ntype ShippingMode = \"calculations\" | \"shipments_chunk\";\n\ntype ShippingMetadata = ReturnType<typeof buildShippingSummaryMetadata>;\n\ntype ShippingCostBucket = {\n shipments: number;\n shipments_with_cost: number;\n zero_cost_shipments: number;\n total_cost: number;\n total_buyer_shipping_paid: number;\n orders_with_buyer_shipping_paid: number;\n};\n\nfunction getFirstPayment(order: Record<string, unknown>) {\n return asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n}\n\ntype DailyShippingMetric = {\n date: string;\n shipments: number;\n delivered_shipments: number;\n cancelled_shipments: number;\n not_delivered_shipments: number;\n shipping_cost_by_currency: Record<string, number>;\n};\n\nfunction safeRate(numerator: number, denominator: number): number {\n if (!Number.isFinite(denominator) || denominator <= 0) {\n return 0;\n }\n\n return Number((numerator / denominator).toFixed(4));\n}\n\nfunction topBreakdownFromMap(\n counts: Map<string, number>,\n total: number,\n limit = TOP_LIMIT\n): BreakdownResult {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, total),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, total) : undefined,\n }) as BreakdownResult;\n}\n\nfunction incrementCount(map: Map<string, number>, key: string) {\n if (!key) {\n return;\n }\n\n map.set(key, (map.get(key) ?? 0) + 1);\n}\n\nfunction topSingleValue(counts: Map<string, number>): string {\n return Array.from(counts.entries())\n .filter(([key]) => key)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))[0]?.[0] ?? \"\";\n}\n\nfunction incrementCurrency(map: Record<string, number>, currencyId: string, amount: number) {\n map[currencyId] = roundMoney((map[currencyId] ?? 0) + amount);\n}\n\nfunction sortedCurrencyTotals(input: Record<string, number>) {\n return Object.fromEntries(\n Object.entries(input)\n .filter(([, amount]) => amount !== 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, amount]) => [currencyId, roundMoney(amount)])\n );\n}\n\nfunction formatDateInTimeZone(dateValue: Date, timeZone: string): string {\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n });\n\n const parts = formatter.formatToParts(dateValue);\n const year = parts.find((part) => part.type === \"year\")?.value;\n const month = parts.find((part) => part.type === \"month\")?.value;\n const day = parts.find((part) => part.type === \"day\")?.value;\n\n if (!year || !month || !day) {\n return \"\";\n }\n\n return `${year}-${month}-${day}`;\n}\n\nfunction getLocalDateBucket(createdAt: string, timeZone: string): string {\n if (!createdAt) {\n return \"\";\n }\n\n const date = new Date(createdAt);\n if (Number.isNaN(date.getTime())) {\n return \"\";\n }\n\n return formatDateInTimeZone(date, timeZone);\n}\n\nfunction buildShippingSummaryMetadata(params: {\n total: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n responseMode: ShippingMode;\n pagesRequested: number;\n pagesSucceeded: number;\n pagesFailed: number;\n failedOffsets: number[];\n shipmentFailures: number;\n}) {\n const requestedWindowEndOffset = params.effectiveOffset + params.effectiveLimit * params.pagesRequested;\n const nextOffset =\n params.responseMode === \"shipments_chunk\"\n ? requestedWindowEndOffset\n : params.effectiveOffset + params.returned;\n const hasMoreOrders = nextOffset < params.total;\n const hasFailures = params.pagesFailed > 0 || params.shipmentFailures > 0;\n const universeFullyFetched =\n params.responseMode === \"calculations\" && !hasFailures && params.returned >= params.total;\n\n let continuation = \"No more pages for this query.\";\n if (params.pagesFailed > 0) {\n const offsets = params.failedOffsets.slice(0, 5).join(\", \");\n const moreOffsets =\n params.failedOffsets.length > 5\n ? ` y ${params.failedOffsets.length - 5} offsets adicionales`\n : \"\";\n continuation =\n params.responseMode === \"shipments_chunk\"\n ? `Se recuperaron paginas parciales. Reintentar primero la misma tool con responseMode=\"shipments_chunk\", offset=${params.failedOffsets[0]} y limit=${params.effectiveLimit}. Offsets fallidos: ${offsets}${moreOffsets}. Luego continuar con offset=${nextOffset} si hace falta.`\n : `Calculos parciales por paginas fallidas. Reintentar la misma tool con responseMode=\"calculations\". Offsets fallidos: ${offsets}${moreOffsets}.`;\n } else if (params.shipmentFailures > 0) {\n continuation =\n params.responseMode === \"shipments_chunk\"\n ? `Se recuperaron shipments parciales. Reintentar la misma tool con responseMode=\"shipments_chunk\", offset=${params.effectiveOffset} y limit=${params.effectiveLimit}${hasMoreOrders ? `. Luego continuar con offset=${nextOffset} si hace falta.` : \".\"}`\n : 'Calculos parciales por fallas al consultar shipments o costos. Reintentar la misma tool con responseMode=\"calculations\".';\n } else if (params.responseMode === \"shipments_chunk\" && hasMoreOrders) {\n continuation = `Para continuar trayendo shipments, volver a invocar meli_get_shipping_summary con los mismos filtros, responseMode=\"shipments_chunk\", offset=${nextOffset} y limit=${params.effectiveLimit}. Repetir hasta has_more=false.`;\n } else if (params.responseMode === \"calculations\") {\n continuation = 'Calculos completos. Si el usuario pide detalle de shipments, invocar la misma tool con responseMode=\"shipments_chunk\", offset=0 y limit=50.';\n }\n\n return stripNulls({\n total: params.total,\n limit: params.effectiveLimit,\n offset: params.effectiveOffset,\n returned: params.returned,\n has_more: params.responseMode === \"shipments_chunk\" ? hasMoreOrders || hasFailures : hasFailures,\n next_offset: params.responseMode === \"shipments_chunk\" && hasMoreOrders ? nextOffset : undefined,\n continuation,\n fetch_mode: params.responseMode === \"shipments_chunk\" ? \"shipments_chunk\" : \"full_calculations\",\n pages_per_call_limit:\n params.responseMode === \"shipments_chunk\" ? SHIPPING_DETAIL_MAX_PAGES_PER_CALL : undefined,\n pages_requested: params.pagesRequested,\n pages_succeeded: params.pagesSucceeded,\n pages_failed: params.pagesFailed,\n shipment_failures: params.shipmentFailures,\n universe_fully_fetched: universeFullyFetched,\n });\n}\n\nfunction extractShipmentCost(costs: Record<string, unknown>) {\n return (\n toNumber(asRecord(costs.senders).cost) ||\n toNumber(asRecord(costs.receiver).cost) ||\n toNumber(costs.gross_amount) ||\n toNumber(costs.cost)\n );\n}\n\nfunction formatCompactShipmentRow(params: {\n orderId: string;\n shipmentId: string;\n status: string;\n substatus: string;\n logisticType: string;\n mode: string;\n currencyId: string;\n cost: number;\n buyerShippingPaid: number;\n}) {\n return [\n params.orderId,\n params.shipmentId,\n params.status,\n params.substatus,\n params.logisticType,\n params.mode,\n params.currencyId,\n params.cost,\n params.buyerShippingPaid,\n ];\n}\n\nfunction buildShippingCalculations(params: {\n ordersTotal: number;\n ordersWithShipping: number;\n shipmentsRequested: number;\n shipmentsInspected: number;\n deliveredShipments: number;\n cancelledShipments: number;\n notDeliveredShipments: number;\n statusCounts: Map<string, number>;\n substatusCounts: Map<string, number>;\n logisticTypeCounts: Map<string, number>;\n modeCounts: Map<string, number>;\n costsByCurrency: Record<string, ShippingCostBucket>;\n dailyMetrics: Map<string, DailyShippingMetric>;\n metadata: ShippingMetadata;\n failedPages: FailedPage[];\n shipmentFailures: ShipmentFailure[];\n}) {\n const costsByCurrency = Object.fromEntries(\n Object.entries(params.costsByCurrency)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, bucket]) => [\n currencyId,\n {\n total_shipping_cost: roundMoney(bucket.total_cost),\n shipments: bucket.shipments,\n shipments_with_cost: bucket.shipments_with_cost,\n zero_cost_shipments: bucket.zero_cost_shipments,\n buyer_shipping_paid_total: roundMoney(bucket.total_buyer_shipping_paid),\n orders_with_buyer_shipping_paid: bucket.orders_with_buyer_shipping_paid,\n avg_buyer_shipping_paid_per_order_with_payment: roundMoney(\n bucket.total_buyer_shipping_paid / Math.max(1, bucket.orders_with_buyer_shipping_paid)\n ),\n avg_cost_per_shipment: roundMoney(bucket.total_cost / Math.max(1, bucket.shipments)),\n avg_cost_per_shipment_with_cost: roundMoney(\n bucket.total_cost / Math.max(1, bucket.shipments_with_cost)\n ),\n shipping_cost_rate_by_shipment: safeRate(bucket.shipments_with_cost, bucket.shipments),\n },\n ])\n );\n\n const dailyTrend = Array.from(params.dailyMetrics.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, metric]) =>\n stripNulls({\n date: metric.date,\n shipments: metric.shipments,\n delivered_shipments: metric.delivered_shipments,\n cancelled_shipments: metric.cancelled_shipments,\n not_delivered_shipments: metric.not_delivered_shipments,\n shipping_cost_by_currency: sortedCurrencyTotals(metric.shipping_cost_by_currency),\n })\n );\n\n return {\n overview: {\n orders_total: params.ordersTotal,\n orders_with_shipping: params.ordersWithShipping,\n shipments_total: params.shipmentsInspected,\n shipments_requested: params.shipmentsRequested,\n shipping_attachment_rate: safeRate(params.ordersWithShipping, params.ordersTotal),\n delivered_shipments: params.deliveredShipments,\n cancelled_shipments: params.cancelledShipments,\n not_delivered_shipments: params.notDeliveredShipments,\n },\n delivery_health: {\n status_breakdown: topBreakdownFromMap(params.statusCounts, Math.max(1, params.shipmentsInspected)),\n substatus_breakdown: topBreakdownFromMap(params.substatusCounts, Math.max(1, params.shipmentsInspected)),\n delivered_rate: safeRate(params.deliveredShipments, params.shipmentsInspected),\n cancelled_rate: safeRate(params.cancelledShipments, params.shipmentsInspected),\n not_delivered_rate: safeRate(params.notDeliveredShipments, params.shipmentsInspected),\n },\n costs_by_currency: costsByCurrency,\n logistics_mix: {\n logistic_type_breakdown: topBreakdownFromMap(\n params.logisticTypeCounts,\n Math.max(1, params.shipmentsInspected)\n ),\n mode_breakdown: topBreakdownFromMap(params.modeCounts, Math.max(1, params.shipmentsInspected)),\n top_logistic_type_by_shipments: topSingleValue(params.logisticTypeCounts),\n top_mode_by_shipments: topSingleValue(params.modeCounts),\n },\n daily_trend: dailyTrend,\n coverage: {\n fetch_mode: params.metadata.fetch_mode,\n universe_fully_fetched: params.metadata.universe_fully_fetched,\n orders_returned: params.metadata.returned,\n shipments_requested: params.shipmentsRequested,\n shipments_inspected: params.shipmentsInspected,\n pages_requested: params.metadata.pages_requested,\n pages_succeeded: params.metadata.pages_succeeded,\n pages_failed: params.metadata.pages_failed,\n failed_pages_count: params.failedPages.length,\n shipment_failures_count: params.shipmentFailures.length,\n failed_pages: params.failedPages,\n },\n };\n}\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 responseMode: z\n .enum([\"calculations\", \"shipments_chunk\"])\n .optional()\n .default(\"calculations\")\n .describe(\n 'Response mode. calculations (default) fetches all matching orders internally and returns only aggregate shipping KPIs. shipments_chunk returns compact shipment rows for up to 15 MercadoLibre pages and includes continuation metadata.'\n ),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\n 'MercadoLibre page size for responseMode=\"shipments_chunk\" (1-50). Defaults to 50.'\n ),\n offset: z\n .number()\n .int()\n .min(0)\n .max(5000)\n .optional()\n .describe(\n 'Starting offset for responseMode=\"shipments_chunk\". Use metadata.next_offset to continue.'\n ),\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 responseMode = params.responseMode ?? \"calculations\";\n const requestedLimit =\n responseMode === \"shipments_chunk\"\n ? params.limit ?? DEFAULT_SHIPPING_DETAIL_PAGE_LIMIT\n : DEFAULT_CALCULATIONS_PAGE_LIMIT;\n const requestedOffset = responseMode === \"shipments_chunk\" ? params.offset ?? 0 : 0;\n const maxPagesForResponse =\n responseMode === \"shipments_chunk\" ? SHIPPING_DETAIL_MAX_PAGES_PER_CALL : Infinity;\n\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: requestedLimit,\n offset: requestedOffset,\n });\n\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const baseOrders = asArray<Record<string, unknown>>(response.results);\n const effectiveLimit = paging.limit || requestedLimit || baseOrders.length;\n const effectiveOffset = paging.offset || requestedOffset || 0;\n const allOrders = [...baseOrders];\n const failedPages: FailedPage[] = [];\n let pagesRequested = 1;\n let pagesSucceeded = 1;\n\n if (effectiveLimit > 0 && paging.total > baseOrders.length) {\n const nextOffsets: number[] = [];\n const maxPagesRemaining = Math.max(0, maxPagesForResponse - 1);\n let pagesAdded = 0;\n\n for (let nextOffset = effectiveOffset + effectiveLimit; nextOffset < paging.total; nextOffset += effectiveLimit) {\n if (responseMode === \"shipments_chunk\" && pagesAdded >= maxPagesRemaining) {\n break;\n }\n\n nextOffsets.push(nextOffset);\n pagesAdded += 1;\n }\n\n pagesRequested += nextOffsets.length;\n\n if (nextOffsets.length > 0) {\n const batch = await searchMercadoLibreOrdersBatch(\n profileId,\n {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: effectiveLimit,\n },\n nextOffsets,\n {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }\n );\n\n pagesSucceeded += batch.successful.length;\n batch.successful.forEach((entry) => {\n allOrders.push(...asArray<Record<string, unknown>>(entry.document.results));\n });\n batch.failed.forEach((failure) => {\n const failedOffset = Number(failure.id);\n failedPages.push({\n offset: failedOffset,\n limit: effectiveLimit,\n page_number: Math.floor(failedOffset / effectiveLimit) + 1,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n }\n }\n\n const ordersWithShipping = allOrders.reduce((count, order) => {\n return normalizeScalarString(asRecord(order.shipping).id) ? count + 1 : count;\n }, 0);\n\n const ordersByShipmentId = new Map<string, Record<string, unknown>[]>();\n const primaryOrderByShipmentId = new Map<string, Record<string, unknown>>();\n for (const order of allOrders) {\n const shipmentId = normalizeScalarString(asRecord(order.shipping).id);\n if (!shipmentId) {\n continue;\n }\n\n const shipmentOrders = ordersByShipmentId.get(shipmentId);\n if (shipmentOrders) {\n shipmentOrders.push(order);\n } else {\n ordersByShipmentId.set(shipmentId, [order]);\n primaryOrderByShipmentId.set(shipmentId, order);\n }\n }\n\n const shipmentIds = [...ordersByShipmentId.keys()];\n const statusCounts = new Map<string, number>();\n const substatusCounts = new Map<string, number>();\n const logisticTypeCounts = new Map<string, number>();\n const modeCounts = new Map<string, number>();\n const costsByCurrency: Record<string, ShippingCostBucket> = {};\n const dailyMetrics = new Map<string, DailyShippingMetric>();\n const failures: ShipmentFailure[] = [];\n const shipmentRows: Array<(string | number)[]> = [];\n let shipmentsInspected = 0;\n let deliveredShipments = 0;\n let cancelledShipments = 0;\n let notDeliveredShipments = 0;\n\n if (shipmentIds.length > 0) {\n const [shipmentsBatch, costsBatch] = await Promise.all([\n getMercadoLibreShipmentBatch(profileId, shipmentIds, {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }),\n getMercadoLibreShipmentCostsBatch(profileId, shipmentIds, {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }),\n ]);\n\n const shipmentById = new Map(\n shipmentsBatch.successful.map((entry) => [entry.id, entry.document] as const)\n );\n const costsByShipmentId = new Map(\n costsBatch.successful.map((entry) => [entry.id, entry.document] as const)\n );\n\n shipmentsBatch.failed.forEach((failure) => {\n failures.push({\n order_id: normalizeScalarString(primaryOrderByShipmentId.get(failure.id)?.id),\n shipment_id: failure.id,\n stage: \"shipment\",\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n\n costsBatch.failed.forEach((failure) => {\n failures.push({\n order_id: normalizeScalarString(primaryOrderByShipmentId.get(failure.id)?.id),\n shipment_id: failure.id,\n stage: \"costs\",\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n\n for (const shipmentId of shipmentIds) {\n const shipment = shipmentById.get(shipmentId);\n const costs = costsByShipmentId.get(shipmentId);\n if (!shipment || !costs) {\n continue;\n }\n\n const shipmentOrders = ordersByShipmentId.get(shipmentId) ?? [];\n const primaryOrder = primaryOrderByShipmentId.get(shipmentId);\n const shipmentStatus = normalizeString(shipment.status, \"unknown\");\n const shipmentSubstatus = normalizeString(shipment.substatus, \"unknown\");\n const logisticType = normalizeString(shipment.logistic_type);\n const mode = normalizeString(shipment.mode);\n const currencyId = normalizeString(primaryOrder?.currency_id, \"UNKNOWN\");\n const shipmentCost = roundMoney(extractShipmentCost(costs));\n const buyerShippingPaid = roundMoney(\n shipmentOrders.reduce((sum, shipmentOrder) => {\n return sum + roundMoney(toNumber(getFirstPayment(shipmentOrder).shipping_cost));\n }, 0)\n );\n const ordersWithBuyerShippingPaid = shipmentOrders.reduce((count, shipmentOrder) => {\n return roundMoney(toNumber(getFirstPayment(shipmentOrder).shipping_cost)) > 0 ? count + 1 : count;\n }, 0);\n const dayBucket = getLocalDateBucket(\n normalizeString(primaryOrder?.date_created),\n BUSINESS_TIME_ZONE\n );\n\n shipmentsInspected += 1;\n incrementCount(statusCounts, shipmentStatus);\n incrementCount(substatusCounts, shipmentSubstatus);\n incrementCount(logisticTypeCounts, logisticType || \"unknown\");\n incrementCount(modeCounts, mode || \"unknown\");\n\n if (shipmentStatus === \"delivered\") {\n deliveredShipments += 1;\n }\n if (shipmentStatus === \"cancelled\") {\n cancelledShipments += 1;\n }\n if (shipmentStatus === \"not_delivered\") {\n notDeliveredShipments += 1;\n }\n\n const bucket = currencyBucket(costsByCurrency, currencyId, () => ({\n shipments: 0,\n shipments_with_cost: 0,\n zero_cost_shipments: 0,\n total_cost: 0,\n total_buyer_shipping_paid: 0,\n orders_with_buyer_shipping_paid: 0,\n }));\n bucket.shipments += 1;\n bucket.total_cost += shipmentCost;\n bucket.total_buyer_shipping_paid += buyerShippingPaid;\n if (shipmentCost > 0) {\n bucket.shipments_with_cost += 1;\n } else {\n bucket.zero_cost_shipments += 1;\n }\n bucket.orders_with_buyer_shipping_paid += ordersWithBuyerShippingPaid;\n\n if (dayBucket) {\n const dayMetric = dailyMetrics.get(dayBucket) ?? {\n date: dayBucket,\n shipments: 0,\n delivered_shipments: 0,\n cancelled_shipments: 0,\n not_delivered_shipments: 0,\n shipping_cost_by_currency: {},\n };\n dayMetric.shipments += 1;\n if (shipmentStatus === \"delivered\") {\n dayMetric.delivered_shipments += 1;\n }\n if (shipmentStatus === \"cancelled\") {\n dayMetric.cancelled_shipments += 1;\n }\n if (shipmentStatus === \"not_delivered\") {\n dayMetric.not_delivered_shipments += 1;\n }\n incrementCurrency(dayMetric.shipping_cost_by_currency, currencyId, shipmentCost);\n dailyMetrics.set(dayBucket, dayMetric);\n }\n\n if (responseMode === \"shipments_chunk\") {\n shipmentRows.push(\n formatCompactShipmentRow({\n orderId: normalizeScalarString(primaryOrder?.id),\n shipmentId,\n status: shipmentStatus,\n substatus: shipmentSubstatus,\n logisticType,\n mode,\n currencyId,\n cost: shipmentCost,\n buyerShippingPaid,\n })\n );\n }\n }\n }\n\n for (const metrics of Object.values(costsByCurrency)) {\n metrics.total_cost = roundMoney(metrics.total_cost);\n metrics.total_buyer_shipping_paid = roundMoney(metrics.total_buyer_shipping_paid);\n }\n\n const metadata = buildShippingSummaryMetadata({\n total: paging.total,\n effectiveLimit,\n effectiveOffset,\n returned: allOrders.length,\n responseMode,\n pagesRequested,\n pagesSucceeded,\n pagesFailed: failedPages.length,\n failedOffsets: failedPages.map((failure) => failure.offset),\n shipmentFailures: failures.length,\n });\n\n const calculations =\n responseMode === \"calculations\"\n ? buildShippingCalculations({\n ordersTotal: allOrders.length,\n ordersWithShipping,\n shipmentsRequested: shipmentIds.length,\n shipmentsInspected,\n deliveredShipments,\n cancelledShipments,\n notDeliveredShipments,\n statusCounts,\n substatusCounts,\n logisticTypeCounts,\n modeCounts,\n costsByCurrency,\n dailyMetrics,\n metadata,\n failedPages,\n shipmentFailures: failures,\n })\n : undefined;\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata,\n shipments_schema: responseMode === \"shipments_chunk\" ? shipmentsSchema : undefined,\n shipments: responseMode === \"shipments_chunk\" ? shipmentRows : undefined,\n calculations,\n failures: failures.length > 0 ? failures : undefined,\n failed_pages: failedPages.length > 0 ? failedPages : undefined,\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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -293,6 +293,21 @@ describe("catalog navigation read wrappers", () => {
|
|
|
293
293
|
brandId: 7,
|
|
294
294
|
categoryId: "23",
|
|
295
295
|
productReference: "RUN-001"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
productId: "102",
|
|
299
|
+
productName: "Trail",
|
|
300
|
+
brand: "Acme",
|
|
301
|
+
brandId: 7,
|
|
302
|
+
categoryId: "999",
|
|
303
|
+
productReference: "TRL-002"
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
productId: "103",
|
|
307
|
+
productName: "No Category",
|
|
308
|
+
brand: "Acme",
|
|
309
|
+
brandId: 7,
|
|
310
|
+
productReference: "NC-003"
|
|
296
311
|
}
|
|
297
312
|
],
|
|
298
313
|
total: 12
|
|
@@ -338,7 +353,7 @@ describe("catalog navigation read wrappers", () => {
|
|
|
338
353
|
total: 12,
|
|
339
354
|
page: 2,
|
|
340
355
|
pageSize: 25,
|
|
341
|
-
returned:
|
|
356
|
+
returned: 3,
|
|
342
357
|
has_more: false
|
|
343
358
|
},
|
|
344
359
|
profile_id: "profile-1",
|
|
@@ -351,7 +366,11 @@ describe("catalog navigation read wrappers", () => {
|
|
|
351
366
|
"category_id",
|
|
352
367
|
"product_reference"
|
|
353
368
|
],
|
|
354
|
-
rows: [
|
|
369
|
+
rows: [
|
|
370
|
+
["101", "Runner", "Acme", 7, "23", "RUN-001"],
|
|
371
|
+
["102", "Trail", "Acme", 7, "999", "TRL-002"],
|
|
372
|
+
["103", "No Category", "Acme", 7, null, "NC-003"]
|
|
373
|
+
]
|
|
355
374
|
}
|
|
356
375
|
});
|
|
357
376
|
expect(skus).toEqual({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/tools/vtex/__tests__/catalog-navigation-reads.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst getCategoryTreeMock = vi.fn();\nconst listCategoriesMock = vi.fn();\nconst listBrandsMock = vi.fn();\nconst listSpecificationGroupsByCategoryMock = vi.fn();\nconst listProductsMock = vi.fn();\nconst listProductsByCategoryMock = vi.fn();\nconst listSkusByProductMock = vi.fn();\nconst getBrandMock = vi.fn();\nconst getCategoryMock = vi.fn();\nconst getProductMock = vi.fn();\nconst getProductSpecificationsMock = vi.fn();\nconst getSkuMock = vi.fn();\nconst resolveVtexProfileOrSelectionMock = vi.fn();\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-catalog.js\", () => ({\n getCategoryTree: getCategoryTreeMock,\n listCategories: listCategoriesMock,\n listBrands: listBrandsMock,\n listSpecificationGroupsByCategory: listSpecificationGroupsByCategoryMock,\n listProducts: listProductsMock,\n listProductsByCategory: listProductsByCategoryMock,\n listSkusByProduct: listSkusByProductMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-catalog-write.js\", () => ({\n getBrand: getBrandMock,\n getCategory: getCategoryMock,\n getProduct: getProductMock,\n getProductSpecifications: getProductSpecificationsMock,\n getSku: getSkuMock,\n}));\n\nvi.mock(\"../profile-resolution.js\", () => ({\n resolveVtexProfileOrSelection: resolveVtexProfileOrSelectionMock,\n}));\n\nconst sharedModule = await import(\"../catalog-navigation-reads.js\");\nconst getCategoryTreeModule = await import(\"../get-category-tree.js\");\nconst listCategoriesModule = await import(\"../list-categories.js\");\nconst getCategoryModule = await import(\"../get-category.js\");\nconst getBrandModule = await import(\"../get-brand.js\");\nconst listBrandsModule = await import(\"../list-brands.js\");\nconst listSpecificationGroupsModule = await import(\"../list-specification-groups.js\");\nconst getProductModule = await import(\"../get-product.js\");\nconst getProductSpecificationsModule = await import(\"../get-product-specifications.js\");\nconst listProductsModule = await import(\"../list-products.js\");\nconst listProductsByCategoryModule = await import(\"../list-products-by-category.js\");\nconst getSkuModule = await import(\"../get-sku.js\");\nconst listSkusByProductModule = await import(\"../list-skus-by-product.js\");\n\ndescribe(\"catalog navigation read wrappers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexProfileOrSelectionMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n });\n\n it(\"keeps stable public exports delegated to the shared module\", () => {\n expect(getCategoryTreeModule.getCategoryTreeSchema).toBe(sharedModule.getCategoryTreeSchema);\n expect(getCategoryTreeModule.getCategoryTreeHandler).toBe(sharedModule.getCategoryTreeHandler);\n expect(listCategoriesModule.listCategoriesSchema).toBe(sharedModule.listCategoriesSchema);\n expect(listCategoriesModule.listCategoriesHandler).toBe(sharedModule.listCategoriesHandler);\n expect(getCategoryModule.getCategorySchema).toBe(sharedModule.getCategorySchema);\n expect(getCategoryModule.getCategoryHandler).toBe(sharedModule.getCategoryHandler);\n expect(getBrandModule.getBrandSchema).toBe(sharedModule.getBrandSchema);\n expect(getBrandModule.getBrandHandler).toBe(sharedModule.getBrandHandler);\n expect(listBrandsModule.listBrandsSchema).toBe(sharedModule.listBrandsSchema);\n expect(listBrandsModule.listBrandsHandler).toBe(sharedModule.listBrandsHandler);\n expect(listSpecificationGroupsModule.listSpecificationGroupsSchema).toBe(\n sharedModule.listSpecificationGroupsSchema\n );\n expect(listSpecificationGroupsModule.listSpecificationGroupsHandler).toBe(\n sharedModule.listSpecificationGroupsHandler\n );\n expect(getProductModule.getProductSchema).toBe(sharedModule.getProductSchema);\n expect(getProductModule.getProductHandler).toBe(sharedModule.getProductHandler);\n expect(getProductSpecificationsModule.getProductSpecificationsSchema).toBe(\n sharedModule.getProductSpecificationsSchema\n );\n expect(getProductSpecificationsModule.getProductSpecificationsHandler).toBe(\n sharedModule.getProductSpecificationsHandler\n );\n expect(listProductsModule.listProductsSchema).toBe(sharedModule.listProductsSchema);\n expect(listProductsModule.listProductsHandler).toBe(sharedModule.listProductsHandler);\n expect(listProductsByCategoryModule.listProductsByCategorySchema).toBe(\n sharedModule.listProductsByCategorySchema\n );\n expect(listProductsByCategoryModule.listProductsByCategoryHandler).toBe(\n sharedModule.listProductsByCategoryHandler\n );\n expect(getSkuModule.getSkuSchema).toBe(sharedModule.getSkuSchema);\n expect(getSkuModule.getSkuHandler).toBe(sharedModule.getSkuHandler);\n expect(listSkusByProductModule.listSkusByProductSchema).toBe(sharedModule.listSkusByProductSchema);\n expect(listSkusByProductModule.listSkusByProductHandler).toBe(sharedModule.listSkusByProductHandler);\n });\n\n it(\"validates profile and catalog identifiers\", () => {\n expect(() => sharedModule.getCategorySchema.parse({ profileId: \" \", categoryId: \"10\" })).toThrow();\n expect(() => sharedModule.getBrandSchema.parse({ profileId: \"profile-1\", brandId: \"\" })).toThrow();\n expect(() => sharedModule.listSpecificationGroupsSchema.parse({ categoryId: \"\" })).toThrow();\n expect(() => sharedModule.getProductSchema.parse({ profileId: \"profile-1\", productId: \"\" })).toThrow();\n expect(() =>\n sharedModule.listProductsByCategorySchema.parse({ profileId: \"profile-1\", categoryId: \"\" })\n ).toThrow();\n expect(() =>\n sharedModule.getProductSpecificationsSchema.parse({ profileId: \"profile-1\", productId: \"\" })\n ).toThrow();\n expect(() => sharedModule.getSkuSchema.parse({ profileId: \"profile-1\", skuId: \"\" })).toThrow();\n expect(() =>\n sharedModule.listSkusByProductSchema.parse({ profileId: \"profile-1\", productId: \"\" })\n ).toThrow();\n });\n\n it(\"enforces the real VTEX category product page size cap\", () => {\n expect(\n sharedModule.listProductsByCategorySchema.parse({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 50,\n })\n ).toEqual({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 50,\n });\n\n expect(() =>\n sharedModule.listProductsByCategorySchema.parse({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 51,\n })\n ).toThrow();\n });\n\n it(\"delegates category tree reads with the default VTEX depth\", async () => {\n getCategoryTreeMock.mockResolvedValue([{ id: 1, name: \"Root\", children: [{ id: 2, name: \"Child\" }] }]);\n\n const result = await sharedModule.getCategoryTreeHandler({ profileId: \"profile-1\" });\n\n expect(resolveVtexProfileOrSelectionMock).toHaveBeenCalledWith(\"profile-1\");\n expect(getCategoryTreeMock).toHaveBeenCalledWith(\"profile-1\", 5);\n expect(result).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n depth: 5,\n categories: [{ id: 1, name: \"Root\", children: [{ id: 2, name: \"Child\" }] }],\n },\n });\n });\n\n it(\"returns the profile-selection response instead of silently defaulting when profileId is omitted\", async () => {\n resolveVtexProfileOrSelectionMock.mockResolvedValueOnce({\n ok: false,\n response: { selection_required: true, profiles: [{ id: \"profile-1\" }] },\n });\n\n const result = await sharedModule.getCategoryTreeHandler({});\n\n expect(resolveVtexProfileOrSelectionMock).toHaveBeenCalledWith(undefined);\n expect(getCategoryTreeMock).not.toHaveBeenCalled();\n expect(result).toEqual({ selection_required: true, profiles: [{ id: \"profile-1\" }] });\n });\n\n it(\"delegates shallow category tree reads with depth=1\", async () => {\n getCategoryTreeMock.mockResolvedValue([{ id: 1, name: \"Root\" }]);\n\n const result = await sharedModule.getCategoryTreeHandler({ profileId: \"profile-1\", depth: 1 });\n\n expect(getCategoryTreeMock).toHaveBeenCalledWith(\"profile-1\", 1);\n expect(result).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n depth: 1,\n categories: [{ id: 1, name: \"Root\" }],\n },\n });\n });\n\n it(\"formats category and brand lists as compact rows with continuation metadata\", async () => {\n listCategoriesMock.mockResolvedValue({\n items: [\n { Id: 10, Name: \"Shoes\", FatherCategoryId: null, IsActive: true, ShowInStoreFront: true },\n { Id: 11, Name: \"Boots\", FatherCategoryId: 10, IsActive: false, ShowInStoreFront: false },\n ],\n total: 5,\n });\n listBrandsMock.mockResolvedValue({\n items: [{ Id: 7, Name: \"Acme\", Active: true, MenuHome: false }],\n total: 1,\n });\n\n const categories = await sharedModule.listCategoriesHandler({\n profileId: \"profile-1\",\n page: 1,\n pageSize: 2,\n });\n const brands = await sharedModule.listBrandsHandler({ profileId: \"profile-1\", page: 1, pageSize: 25 });\n\n expect(listCategoriesMock).toHaveBeenCalledWith(\"profile-1\", 1, 2);\n expect(categories).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 5,\n page: 1,\n pageSize: 2,\n returned: 2,\n has_more: true,\n next_page: 2,\n continuation: \"Call vtex_list_categories again with page=2 and pageSize=2 to continue.\",\n },\n profile_id: \"profile-1\",\n rows_schema: [\"id\", \"name\", \"parent_id\", \"is_active\", \"show_in_storefront\"],\n rows: [\n [10, \"Shoes\", null, true, true],\n [11, \"Boots\", 10, false, false],\n ],\n },\n });\n expect(brands).toEqual({\n kind: \"object\",\n value: {\n metadata: { total: 1, page: 1, pageSize: 25, returned: 1, has_more: false },\n profile_id: \"profile-1\",\n rows_schema: [\"id\", \"name\", \"is_active\", \"menu_home\"],\n rows: [[7, \"Acme\", true, false]],\n },\n });\n });\n\n it(\"lists specification groups for a category with optional name filtering\", async () => {\n listSpecificationGroupsByCategoryMock.mockResolvedValue([\n { Id: 70, Name: \"General\", CategoryId: 292 },\n { Id: 71, Name: \"Material\", CategoryId: 292 },\n ]);\n\n const result = await sharedModule.listSpecificationGroupsHandler({\n profileId: \"profile-1\",\n categoryId: \"292\",\n nameContains: \"mater\",\n });\n\n expect(listSpecificationGroupsByCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"292\");\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 2,\n returned: 1,\n has_more: false,\n name_contains: \"mater\",\n },\n profile_id: \"profile-1\",\n category_id: \"292\",\n rows_schema: [\"id\", \"name\", \"category_id\"],\n rows: [[71, \"Material\", 292]],\n },\n });\n });\n\n it(\"delegates detail reads and strips nulls from normalized payloads\", async () => {\n getCategoryMock.mockResolvedValue({ Id: 10, Name: \"Shoes\", Empty: null });\n getBrandMock.mockResolvedValue({ Id: 7, Name: \"Acme\", Text: null });\n getProductMock.mockResolvedValue({ Id: 200, Name: \"Runner\", Description: null });\n getProductSpecificationsMock.mockResolvedValue([\n { Id: 90, Name: \"Material\", Value: \"Leather\", Empty: null },\n ]);\n getSkuMock.mockResolvedValue({ Id: 300, Name: \"Runner 42\", Ean: null });\n\n const category = await sharedModule.getCategoryHandler({ profileId: \"profile-1\", categoryId: \"10\" });\n const brand = await sharedModule.getBrandHandler({ profileId: \"profile-1\", brandId: \"7\" });\n const product = await sharedModule.getProductHandler({ profileId: \"profile-1\", productId: \"200\" });\n const specifications = await sharedModule.getProductSpecificationsHandler({\n profileId: \"profile-1\",\n productId: \"200\",\n });\n const sku = await sharedModule.getSkuHandler({ profileId: \"profile-1\", skuId: \"300\" });\n\n expect(getCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"10\");\n expect(getBrandMock).toHaveBeenCalledWith(\"profile-1\", \"7\");\n expect(getProductMock).toHaveBeenCalledWith(\"profile-1\", \"200\");\n expect(getProductSpecificationsMock).toHaveBeenCalledWith(\"profile-1\", \"200\");\n expect(getSkuMock).toHaveBeenCalledWith(\"profile-1\", \"300\");\n expect(category).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", category_id: \"10\", category: { id: 10, name: \"Shoes\" } } });\n expect(brand).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", brand_id: \"7\", brand: { id: 7, name: \"Acme\" } } });\n expect(product).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", product_id: \"200\", product: { id: 200, name: \"Runner\" } } });\n expect(specifications).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n product_id: \"200\",\n specifications: [{ id: 90, name: \"Material\", value: \"Leather\" }],\n },\n });\n expect(sku).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", sku_id: \"300\", sku: { id: 300, name: \"Runner 42\" } } });\n });\n\n it(\"formats product lists and SKU lists with compact token-efficient rows\", async () => {\n listProductsMock.mockResolvedValue({ productIds: [101, 102], total: 3 });\n listProductsByCategoryMock.mockResolvedValue({\n items: [\n {\n productId: \"101\",\n productName: \"Runner\",\n brand: \"Acme\",\n brandId: 7,\n categoryId: \"23\",\n productReference: \"RUN-001\",\n },\n ],\n total: 12,\n });\n listSkusByProductMock.mockResolvedValue([\n { Id: 501, Name: \"Runner 40\", IsActive: true, RefId: \"RUN-40\" },\n { Id: 502, Name: \"Runner 41\", IsActive: false, RefId: \"RUN-41\" },\n ]);\n\n const products = await sharedModule.listProductsHandler({\n profileId: \"profile-1\",\n page: 2,\n pageSize: 2,\n keyword: \"runner\",\n });\n const categoryProducts = await sharedModule.listProductsByCategoryHandler({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 2,\n pageSize: 25,\n });\n const skus = await sharedModule.listSkusByProductHandler({ profileId: \"profile-1\", productId: \"101\" });\n\n expect(listProductsMock).toHaveBeenCalledWith(\"profile-1\", 3, 4, \"runner\");\n expect(listProductsByCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"23\", 25, 49);\n expect(products).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 3,\n page: 2,\n pageSize: 2,\n returned: 2,\n has_more: false,\n },\n profile_id: \"profile-1\",\n rows_schema: [\"product_id\"],\n rows: [[101], [102]],\n },\n });\n expect(categoryProducts).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 12,\n page: 2,\n pageSize: 25,\n returned: 1,\n has_more: false,\n },\n profile_id: \"profile-1\",\n category_id: \"23\",\n rows_schema: [\n \"product_id\",\n \"product_name\",\n \"brand\",\n \"brand_id\",\n \"category_id\",\n \"product_reference\",\n ],\n rows: [[\"101\", \"Runner\", \"Acme\", 7, \"23\", \"RUN-001\"]],\n },\n });\n expect(skus).toEqual({\n kind: \"object\",\n value: {\n metadata: { total: 2, returned: 2, has_more: false },\n profile_id: \"profile-1\",\n product_id: \"101\",\n rows_schema: [\"id\", \"name\", \"is_active\", \"ref_id\"],\n rows: [\n [501, \"Runner 40\", true, \"RUN-40\"],\n [502, \"Runner 41\", false, \"RUN-41\"],\n ],\n },\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst getCategoryTreeMock = vi.fn();\nconst listCategoriesMock = vi.fn();\nconst listBrandsMock = vi.fn();\nconst listSpecificationGroupsByCategoryMock = vi.fn();\nconst listProductsMock = vi.fn();\nconst listProductsByCategoryMock = vi.fn();\nconst listSkusByProductMock = vi.fn();\nconst getBrandMock = vi.fn();\nconst getCategoryMock = vi.fn();\nconst getProductMock = vi.fn();\nconst getProductSpecificationsMock = vi.fn();\nconst getSkuMock = vi.fn();\nconst resolveVtexProfileOrSelectionMock = vi.fn();\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-catalog.js\", () => ({\n getCategoryTree: getCategoryTreeMock,\n listCategories: listCategoriesMock,\n listBrands: listBrandsMock,\n listSpecificationGroupsByCategory: listSpecificationGroupsByCategoryMock,\n listProducts: listProductsMock,\n listProductsByCategory: listProductsByCategoryMock,\n listSkusByProduct: listSkusByProductMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-catalog-write.js\", () => ({\n getBrand: getBrandMock,\n getCategory: getCategoryMock,\n getProduct: getProductMock,\n getProductSpecifications: getProductSpecificationsMock,\n getSku: getSkuMock,\n}));\n\nvi.mock(\"../profile-resolution.js\", () => ({\n resolveVtexProfileOrSelection: resolveVtexProfileOrSelectionMock,\n}));\n\nconst sharedModule = await import(\"../catalog-navigation-reads.js\");\nconst getCategoryTreeModule = await import(\"../get-category-tree.js\");\nconst listCategoriesModule = await import(\"../list-categories.js\");\nconst getCategoryModule = await import(\"../get-category.js\");\nconst getBrandModule = await import(\"../get-brand.js\");\nconst listBrandsModule = await import(\"../list-brands.js\");\nconst listSpecificationGroupsModule = await import(\"../list-specification-groups.js\");\nconst getProductModule = await import(\"../get-product.js\");\nconst getProductSpecificationsModule = await import(\"../get-product-specifications.js\");\nconst listProductsModule = await import(\"../list-products.js\");\nconst listProductsByCategoryModule = await import(\"../list-products-by-category.js\");\nconst getSkuModule = await import(\"../get-sku.js\");\nconst listSkusByProductModule = await import(\"../list-skus-by-product.js\");\n\ndescribe(\"catalog navigation read wrappers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexProfileOrSelectionMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n });\n\n it(\"keeps stable public exports delegated to the shared module\", () => {\n expect(getCategoryTreeModule.getCategoryTreeSchema).toBe(sharedModule.getCategoryTreeSchema);\n expect(getCategoryTreeModule.getCategoryTreeHandler).toBe(sharedModule.getCategoryTreeHandler);\n expect(listCategoriesModule.listCategoriesSchema).toBe(sharedModule.listCategoriesSchema);\n expect(listCategoriesModule.listCategoriesHandler).toBe(sharedModule.listCategoriesHandler);\n expect(getCategoryModule.getCategorySchema).toBe(sharedModule.getCategorySchema);\n expect(getCategoryModule.getCategoryHandler).toBe(sharedModule.getCategoryHandler);\n expect(getBrandModule.getBrandSchema).toBe(sharedModule.getBrandSchema);\n expect(getBrandModule.getBrandHandler).toBe(sharedModule.getBrandHandler);\n expect(listBrandsModule.listBrandsSchema).toBe(sharedModule.listBrandsSchema);\n expect(listBrandsModule.listBrandsHandler).toBe(sharedModule.listBrandsHandler);\n expect(listSpecificationGroupsModule.listSpecificationGroupsSchema).toBe(\n sharedModule.listSpecificationGroupsSchema\n );\n expect(listSpecificationGroupsModule.listSpecificationGroupsHandler).toBe(\n sharedModule.listSpecificationGroupsHandler\n );\n expect(getProductModule.getProductSchema).toBe(sharedModule.getProductSchema);\n expect(getProductModule.getProductHandler).toBe(sharedModule.getProductHandler);\n expect(getProductSpecificationsModule.getProductSpecificationsSchema).toBe(\n sharedModule.getProductSpecificationsSchema\n );\n expect(getProductSpecificationsModule.getProductSpecificationsHandler).toBe(\n sharedModule.getProductSpecificationsHandler\n );\n expect(listProductsModule.listProductsSchema).toBe(sharedModule.listProductsSchema);\n expect(listProductsModule.listProductsHandler).toBe(sharedModule.listProductsHandler);\n expect(listProductsByCategoryModule.listProductsByCategorySchema).toBe(\n sharedModule.listProductsByCategorySchema\n );\n expect(listProductsByCategoryModule.listProductsByCategoryHandler).toBe(\n sharedModule.listProductsByCategoryHandler\n );\n expect(getSkuModule.getSkuSchema).toBe(sharedModule.getSkuSchema);\n expect(getSkuModule.getSkuHandler).toBe(sharedModule.getSkuHandler);\n expect(listSkusByProductModule.listSkusByProductSchema).toBe(sharedModule.listSkusByProductSchema);\n expect(listSkusByProductModule.listSkusByProductHandler).toBe(sharedModule.listSkusByProductHandler);\n });\n\n it(\"validates profile and catalog identifiers\", () => {\n expect(() => sharedModule.getCategorySchema.parse({ profileId: \" \", categoryId: \"10\" })).toThrow();\n expect(() => sharedModule.getBrandSchema.parse({ profileId: \"profile-1\", brandId: \"\" })).toThrow();\n expect(() => sharedModule.listSpecificationGroupsSchema.parse({ categoryId: \"\" })).toThrow();\n expect(() => sharedModule.getProductSchema.parse({ profileId: \"profile-1\", productId: \"\" })).toThrow();\n expect(() =>\n sharedModule.listProductsByCategorySchema.parse({ profileId: \"profile-1\", categoryId: \"\" })\n ).toThrow();\n expect(() =>\n sharedModule.getProductSpecificationsSchema.parse({ profileId: \"profile-1\", productId: \"\" })\n ).toThrow();\n expect(() => sharedModule.getSkuSchema.parse({ profileId: \"profile-1\", skuId: \"\" })).toThrow();\n expect(() =>\n sharedModule.listSkusByProductSchema.parse({ profileId: \"profile-1\", productId: \"\" })\n ).toThrow();\n });\n\n it(\"enforces the real VTEX category product page size cap\", () => {\n expect(\n sharedModule.listProductsByCategorySchema.parse({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 50,\n })\n ).toEqual({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 50,\n });\n\n expect(() =>\n sharedModule.listProductsByCategorySchema.parse({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 51,\n })\n ).toThrow();\n });\n\n it(\"delegates category tree reads with the default VTEX depth\", async () => {\n getCategoryTreeMock.mockResolvedValue([{ id: 1, name: \"Root\", children: [{ id: 2, name: \"Child\" }] }]);\n\n const result = await sharedModule.getCategoryTreeHandler({ profileId: \"profile-1\" });\n\n expect(resolveVtexProfileOrSelectionMock).toHaveBeenCalledWith(\"profile-1\");\n expect(getCategoryTreeMock).toHaveBeenCalledWith(\"profile-1\", 5);\n expect(result).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n depth: 5,\n categories: [{ id: 1, name: \"Root\", children: [{ id: 2, name: \"Child\" }] }],\n },\n });\n });\n\n it(\"returns the profile-selection response instead of silently defaulting when profileId is omitted\", async () => {\n resolveVtexProfileOrSelectionMock.mockResolvedValueOnce({\n ok: false,\n response: { selection_required: true, profiles: [{ id: \"profile-1\" }] },\n });\n\n const result = await sharedModule.getCategoryTreeHandler({});\n\n expect(resolveVtexProfileOrSelectionMock).toHaveBeenCalledWith(undefined);\n expect(getCategoryTreeMock).not.toHaveBeenCalled();\n expect(result).toEqual({ selection_required: true, profiles: [{ id: \"profile-1\" }] });\n });\n\n it(\"delegates shallow category tree reads with depth=1\", async () => {\n getCategoryTreeMock.mockResolvedValue([{ id: 1, name: \"Root\" }]);\n\n const result = await sharedModule.getCategoryTreeHandler({ profileId: \"profile-1\", depth: 1 });\n\n expect(getCategoryTreeMock).toHaveBeenCalledWith(\"profile-1\", 1);\n expect(result).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n depth: 1,\n categories: [{ id: 1, name: \"Root\" }],\n },\n });\n });\n\n it(\"formats category and brand lists as compact rows with continuation metadata\", async () => {\n listCategoriesMock.mockResolvedValue({\n items: [\n { Id: 10, Name: \"Shoes\", FatherCategoryId: null, IsActive: true, ShowInStoreFront: true },\n { Id: 11, Name: \"Boots\", FatherCategoryId: 10, IsActive: false, ShowInStoreFront: false },\n ],\n total: 5,\n });\n listBrandsMock.mockResolvedValue({\n items: [{ Id: 7, Name: \"Acme\", Active: true, MenuHome: false }],\n total: 1,\n });\n\n const categories = await sharedModule.listCategoriesHandler({\n profileId: \"profile-1\",\n page: 1,\n pageSize: 2,\n });\n const brands = await sharedModule.listBrandsHandler({ profileId: \"profile-1\", page: 1, pageSize: 25 });\n\n expect(listCategoriesMock).toHaveBeenCalledWith(\"profile-1\", 1, 2);\n expect(categories).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 5,\n page: 1,\n pageSize: 2,\n returned: 2,\n has_more: true,\n next_page: 2,\n continuation: \"Call vtex_list_categories again with page=2 and pageSize=2 to continue.\",\n },\n profile_id: \"profile-1\",\n rows_schema: [\"id\", \"name\", \"parent_id\", \"is_active\", \"show_in_storefront\"],\n rows: [\n [10, \"Shoes\", null, true, true],\n [11, \"Boots\", 10, false, false],\n ],\n },\n });\n expect(brands).toEqual({\n kind: \"object\",\n value: {\n metadata: { total: 1, page: 1, pageSize: 25, returned: 1, has_more: false },\n profile_id: \"profile-1\",\n rows_schema: [\"id\", \"name\", \"is_active\", \"menu_home\"],\n rows: [[7, \"Acme\", true, false]],\n },\n });\n });\n\n it(\"lists specification groups for a category with optional name filtering\", async () => {\n listSpecificationGroupsByCategoryMock.mockResolvedValue([\n { Id: 70, Name: \"General\", CategoryId: 292 },\n { Id: 71, Name: \"Material\", CategoryId: 292 },\n ]);\n\n const result = await sharedModule.listSpecificationGroupsHandler({\n profileId: \"profile-1\",\n categoryId: \"292\",\n nameContains: \"mater\",\n });\n\n expect(listSpecificationGroupsByCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"292\");\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 2,\n returned: 1,\n has_more: false,\n name_contains: \"mater\",\n },\n profile_id: \"profile-1\",\n category_id: \"292\",\n rows_schema: [\"id\", \"name\", \"category_id\"],\n rows: [[71, \"Material\", 292]],\n },\n });\n });\n\n it(\"delegates detail reads and strips nulls from normalized payloads\", async () => {\n getCategoryMock.mockResolvedValue({ Id: 10, Name: \"Shoes\", Empty: null });\n getBrandMock.mockResolvedValue({ Id: 7, Name: \"Acme\", Text: null });\n getProductMock.mockResolvedValue({ Id: 200, Name: \"Runner\", Description: null });\n getProductSpecificationsMock.mockResolvedValue([\n { Id: 90, Name: \"Material\", Value: \"Leather\", Empty: null },\n ]);\n getSkuMock.mockResolvedValue({ Id: 300, Name: \"Runner 42\", Ean: null });\n\n const category = await sharedModule.getCategoryHandler({ profileId: \"profile-1\", categoryId: \"10\" });\n const brand = await sharedModule.getBrandHandler({ profileId: \"profile-1\", brandId: \"7\" });\n const product = await sharedModule.getProductHandler({ profileId: \"profile-1\", productId: \"200\" });\n const specifications = await sharedModule.getProductSpecificationsHandler({\n profileId: \"profile-1\",\n productId: \"200\",\n });\n const sku = await sharedModule.getSkuHandler({ profileId: \"profile-1\", skuId: \"300\" });\n\n expect(getCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"10\");\n expect(getBrandMock).toHaveBeenCalledWith(\"profile-1\", \"7\");\n expect(getProductMock).toHaveBeenCalledWith(\"profile-1\", \"200\");\n expect(getProductSpecificationsMock).toHaveBeenCalledWith(\"profile-1\", \"200\");\n expect(getSkuMock).toHaveBeenCalledWith(\"profile-1\", \"300\");\n expect(category).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", category_id: \"10\", category: { id: 10, name: \"Shoes\" } } });\n expect(brand).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", brand_id: \"7\", brand: { id: 7, name: \"Acme\" } } });\n expect(product).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", product_id: \"200\", product: { id: 200, name: \"Runner\" } } });\n expect(specifications).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n product_id: \"200\",\n specifications: [{ id: 90, name: \"Material\", value: \"Leather\" }],\n },\n });\n expect(sku).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", sku_id: \"300\", sku: { id: 300, name: \"Runner 42\" } } });\n });\n\n it(\"formats product lists and SKU lists with compact token-efficient rows\", async () => {\n listProductsMock.mockResolvedValue({ productIds: [101, 102], total: 3 });\n listProductsByCategoryMock.mockResolvedValue({\n items: [\n {\n productId: \"101\",\n productName: \"Runner\",\n brand: \"Acme\",\n brandId: 7,\n categoryId: \"23\",\n productReference: \"RUN-001\",\n },\n {\n productId: \"102\",\n productName: \"Trail\",\n brand: \"Acme\",\n brandId: 7,\n categoryId: \"999\",\n productReference: \"TRL-002\",\n },\n {\n productId: \"103\",\n productName: \"No Category\",\n brand: \"Acme\",\n brandId: 7,\n productReference: \"NC-003\",\n },\n ],\n total: 12,\n });\n listSkusByProductMock.mockResolvedValue([\n { Id: 501, Name: \"Runner 40\", IsActive: true, RefId: \"RUN-40\" },\n { Id: 502, Name: \"Runner 41\", IsActive: false, RefId: \"RUN-41\" },\n ]);\n\n const products = await sharedModule.listProductsHandler({\n profileId: \"profile-1\",\n page: 2,\n pageSize: 2,\n keyword: \"runner\",\n });\n const categoryProducts = await sharedModule.listProductsByCategoryHandler({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 2,\n pageSize: 25,\n });\n const skus = await sharedModule.listSkusByProductHandler({ profileId: \"profile-1\", productId: \"101\" });\n\n expect(listProductsMock).toHaveBeenCalledWith(\"profile-1\", 3, 4, \"runner\");\n expect(listProductsByCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"23\", 25, 49);\n expect(products).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 3,\n page: 2,\n pageSize: 2,\n returned: 2,\n has_more: false,\n },\n profile_id: \"profile-1\",\n rows_schema: [\"product_id\"],\n rows: [[101], [102]],\n },\n });\n expect(categoryProducts).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 12,\n page: 2,\n pageSize: 25,\n returned: 3,\n has_more: false,\n },\n profile_id: \"profile-1\",\n category_id: \"23\",\n rows_schema: [\n \"product_id\",\n \"product_name\",\n \"brand\",\n \"brand_id\",\n \"category_id\",\n \"product_reference\",\n ],\n rows: [\n [\"101\", \"Runner\", \"Acme\", 7, \"23\", \"RUN-001\"],\n [\"102\", \"Trail\", \"Acme\", 7, \"999\", \"TRL-002\"],\n [\"103\", \"No Category\", \"Acme\", 7, null, \"NC-003\"],\n ],\n },\n });\n expect(skus).toEqual({\n kind: \"object\",\n value: {\n metadata: { total: 2, returned: 2, has_more: false },\n profile_id: \"profile-1\",\n product_id: \"101\",\n rows_schema: [\"id\", \"name\", \"is_active\", \"ref_id\"],\n rows: [\n [501, \"Runner 40\", true, \"RUN-40\"],\n [502, \"Runner 41\", false, \"RUN-41\"],\n ],\n },\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -339,7 +339,7 @@ async function listProductsByCategoryHandler(params) {
|
|
|
339
339
|
readValue(item, "productName", "product_name", "name", "Name"),
|
|
340
340
|
readValue(item, "brand", "Brand"),
|
|
341
341
|
readValue(item, "brandId", "brand_id", "BrandId"),
|
|
342
|
-
readValue(item, "categoryId", "category_id", "CategoryId") ??
|
|
342
|
+
readValue(item, "categoryId", "category_id", "CategoryId") ?? null,
|
|
343
343
|
readValue(
|
|
344
344
|
item,
|
|
345
345
|
"productReference",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/vtex/catalog-navigation-reads.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport {\n getCategoryTree,\n listBrands,\n listCategories,\n listProducts,\n listProductsByCategory,\n listSpecificationGroupsByCategory,\n listSkusByProduct,\n type VtexCatalogRecord,\n} from \"../../services/vtex/vtex-catalog.js\";\nimport {\n getBrand,\n getCategory,\n getProduct,\n getProductSpecifications,\n getSku,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport { toSnakeCaseKeys } from \"../../utils/case-conversion.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { resolveVtexProfileOrSelection } from \"./profile-resolution.js\";\n\nconst vtexProfileIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"Explicit VTEX profile id to use. If omitted, the tool returns a guided selection payload with available active profiles.\"\n );\n\nconst pageSchemaField = z.number().int().min(1).optional().describe(\"Page number, starting at 1.\");\nconst pageSizeSchemaField = z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Items per page, from 1 to 100.\");\n\nconst categoryProductPageSizeSchemaField = z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\n \"Items per page, from 1 to 50. VTEX public product search rejects larger page sizes for category product listing.\"\n );\n\nasync function resolveReadProfile(profileId?: string) {\n return resolveVtexProfileOrSelection(profileId);\n}\n\nfunction readValue(record: VtexCatalogRecord, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nfunction buildPaginationMetadata(input: {\n toolName: string;\n total: number;\n page: number;\n pageSize: number;\n returned: number;\n}) {\n const hasMore = input.page * input.pageSize < input.total;\n const nextPage = hasMore ? input.page + 1 : undefined;\n\n return {\n total: input.total,\n page: input.page,\n pageSize: input.pageSize,\n returned: input.returned,\n has_more: hasMore,\n next_page: nextPage,\n continuation: nextPage\n ? `Call ${input.toolName} again with page=${nextPage} and pageSize=${input.pageSize} to continue.`\n : undefined,\n };\n}\n\nexport const getCategoryTreeSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n depth: z.number().int().min(1).max(5).optional().describe(\"Tree depth from 1 to 5. Defaults to 5.\"),\n});\n\nexport async function getCategoryTreeHandler(params: z.infer<typeof getCategoryTreeSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const depth = params.depth ?? 5;\n const categories = await getCategoryTree(resolved.value.profileId, depth);\n\n return object({\n profile_id: resolved.value.profileId,\n depth,\n categories: toSnakeCaseKeys(categories),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to fetch VTEX category tree\"));\n }\n}\n\nexport const listCategoriesSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n});\n\nconst categoryRowsSchema = [\"id\", \"name\", \"parent_id\", \"is_active\", \"show_in_storefront\"] as const;\n\nexport async function listCategoriesHandler(params: z.infer<typeof listCategoriesSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const result = await listCategories(resolved.value.profileId, page, pageSize);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_categories\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: categoryRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"FatherCategoryId\", \"fatherCategoryId\", \"parentId\"),\n readValue(item, \"IsActive\", \"isActive\"),\n readValue(item, \"ShowInStoreFront\", \"showInStoreFront\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX categories\"));\n }\n}\n\nexport const getCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID.\"),\n});\n\nexport async function getCategoryHandler(params: z.infer<typeof getCategorySchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const category = await getCategory(resolved.value.profileId, params.categoryId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n category: toSnakeCaseKeys(category),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX category ${params.categoryId}`));\n }\n}\n\nexport const listBrandsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n});\n\nconst brandRowsSchema = [\"id\", \"name\", \"is_active\", \"menu_home\"] as const;\n\nexport async function listBrandsHandler(params: z.infer<typeof listBrandsSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const result = await listBrands(resolved.value.profileId, page, pageSize);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_brands\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: brandRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"Active\", \"active\"),\n readValue(item, \"MenuHome\", \"menuHome\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX brands\"));\n }\n}\n\nexport const getBrandSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n brandId: z.string().trim().min(1).describe(\"VTEX brand ID.\"),\n});\n\nexport async function getBrandHandler(params: z.infer<typeof getBrandSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const brand = await getBrand(resolved.value.profileId, params.brandId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n brand_id: params.brandId,\n brand: toSnakeCaseKeys(brand),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX brand ${params.brandId}`));\n }\n}\n\nexport const listSpecificationGroupsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID used to discover specification groups.\"),\n nameContains: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\"Optional case-insensitive substring filter applied to specification group names.\"),\n});\n\nconst specificationGroupRowsSchema = [\"id\", \"name\", \"category_id\"] as const;\n\nexport async function listSpecificationGroupsHandler(\n params: z.infer<typeof listSpecificationGroupsSchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const groups = await listSpecificationGroupsByCategory(resolved.value.profileId, params.categoryId);\n const normalizedFilter = params.nameContains?.toLocaleLowerCase();\n const filteredGroups = normalizedFilter\n ? groups.filter((group) => {\n const name = readValue(group, \"Name\", \"name\");\n return typeof name === \"string\" && name.toLocaleLowerCase().includes(normalizedFilter);\n })\n : groups;\n\n return object({\n metadata: stripNulls({\n total: groups.length,\n returned: filteredGroups.length,\n has_more: false,\n name_contains: params.nameContains,\n }),\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n rows_schema: specificationGroupRowsSchema,\n rows: filteredGroups.map((group) => [\n readValue(group, \"Id\", \"id\", \"FieldGroupId\", \"fieldGroupId\"),\n readValue(group, \"Name\", \"name\"),\n readValue(group, \"CategoryId\", \"categoryId\") ?? params.categoryId,\n ]),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to list VTEX specification groups for category ${params.categoryId}`)\n );\n }\n}\n\nexport const getProductSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nexport async function getProductHandler(params: z.infer<typeof getProductSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const product = await getProduct(resolved.value.profileId, params.productId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n product: toSnakeCaseKeys(product),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX product ${params.productId}`));\n }\n}\n\nexport const getProductSpecificationsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nexport async function getProductSpecificationsHandler(\n params: z.infer<typeof getProductSpecificationsSchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const specifications = await getProductSpecifications(resolved.value.profileId, params.productId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n specifications: toSnakeCaseKeys(specifications),\n })\n );\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to fetch VTEX product specifications for product ${params.productId}`)\n );\n }\n}\n\nexport const listProductsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n keyword: z.string().trim().min(1).optional().describe(\"Optional VTEX catalog keyword filter.\"),\n});\n\nconst productRowsSchema = [\"product_id\"] as const;\n\nexport async function listProductsHandler(params: z.infer<typeof listProductsSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 100;\n const from = (page - 1) * pageSize + 1;\n const to = from + pageSize - 1;\n const result = await listProducts(resolved.value.profileId, from, to, params.keyword);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_products\",\n total: result.total,\n page,\n pageSize,\n returned: result.productIds.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: productRowsSchema,\n rows: result.productIds.map((productId) => [productId]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX products\"));\n }\n}\n\nexport const listProductsByCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID used to filter the product search.\"),\n page: pageSchemaField,\n pageSize: categoryProductPageSizeSchemaField,\n});\n\nconst productByCategoryRowsSchema = [\n \"product_id\",\n \"product_name\",\n \"brand\",\n \"brand_id\",\n \"category_id\",\n \"product_reference\",\n] as const;\n\nexport async function listProductsByCategoryHandler(\n params: z.infer<typeof listProductsByCategorySchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const from = (page - 1) * pageSize;\n const to = from + pageSize - 1;\n const result = await listProductsByCategory(resolved.value.profileId, params.categoryId, from, to);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_products_by_category\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n rows_schema: productByCategoryRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"productId\", \"product_id\", \"productid\", \"id\", \"Id\"),\n readValue(item, \"productName\", \"product_name\", \"name\", \"Name\"),\n readValue(item, \"brand\", \"Brand\"),\n readValue(item, \"brandId\", \"brand_id\", \"BrandId\"),\n readValue(item, \"categoryId\", \"category_id\", \"CategoryId\") ?? params.categoryId,\n readValue(\n item,\n \"productReference\",\n \"product_reference\",\n \"productReferenceCode\",\n \"product_reference_code\"\n ),\n ]),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to list VTEX products for category ${params.categoryId}`)\n );\n }\n}\n\nexport const getSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().trim().min(1).describe(\"VTEX SKU ID.\"),\n});\n\nexport async function getSkuHandler(params: z.infer<typeof getSkuSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const sku = await getSku(resolved.value.profileId, params.skuId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n sku_id: params.skuId,\n sku: toSnakeCaseKeys(sku),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX SKU ${params.skuId}`));\n }\n}\n\nexport const listSkusByProductSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nconst skuRowsSchema = [\"id\", \"name\", \"is_active\", \"ref_id\"] as const;\n\nexport async function listSkusByProductHandler(params: z.infer<typeof listSkusByProductSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const skus = await listSkusByProduct(resolved.value.profileId, params.productId);\n\n return object({\n metadata: { total: skus.length, returned: skus.length, has_more: false },\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n rows_schema: skuRowsSchema,\n rows: skus.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"IsActive\", \"isActive\"),\n readValue(item, \"RefId\", \"refId\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, `Failed to list VTEX SKUs for product ${params.productId}`));\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport {\n getCategoryTree,\n listBrands,\n listCategories,\n listProducts,\n listProductsByCategory,\n listSpecificationGroupsByCategory,\n listSkusByProduct,\n type VtexCatalogRecord,\n} from \"../../services/vtex/vtex-catalog.js\";\nimport {\n getBrand,\n getCategory,\n getProduct,\n getProductSpecifications,\n getSku,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport { toSnakeCaseKeys } from \"../../utils/case-conversion.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { resolveVtexProfileOrSelection } from \"./profile-resolution.js\";\n\nconst vtexProfileIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"Explicit VTEX profile id to use. If omitted, the tool returns a guided selection payload with available active profiles.\"\n );\n\nconst pageSchemaField = z.number().int().min(1).optional().describe(\"Page number, starting at 1.\");\nconst pageSizeSchemaField = z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Items per page, from 1 to 100.\");\n\nconst categoryProductPageSizeSchemaField = z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\n \"Items per page, from 1 to 50. VTEX public product search rejects larger page sizes for category product listing.\"\n );\n\nasync function resolveReadProfile(profileId?: string) {\n return resolveVtexProfileOrSelection(profileId);\n}\n\nfunction readValue(record: VtexCatalogRecord, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nfunction buildPaginationMetadata(input: {\n toolName: string;\n total: number;\n page: number;\n pageSize: number;\n returned: number;\n}) {\n const hasMore = input.page * input.pageSize < input.total;\n const nextPage = hasMore ? input.page + 1 : undefined;\n\n return {\n total: input.total,\n page: input.page,\n pageSize: input.pageSize,\n returned: input.returned,\n has_more: hasMore,\n next_page: nextPage,\n continuation: nextPage\n ? `Call ${input.toolName} again with page=${nextPage} and pageSize=${input.pageSize} to continue.`\n : undefined,\n };\n}\n\nexport const getCategoryTreeSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n depth: z.number().int().min(1).max(5).optional().describe(\"Tree depth from 1 to 5. Defaults to 5.\"),\n});\n\nexport async function getCategoryTreeHandler(params: z.infer<typeof getCategoryTreeSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const depth = params.depth ?? 5;\n const categories = await getCategoryTree(resolved.value.profileId, depth);\n\n return object({\n profile_id: resolved.value.profileId,\n depth,\n categories: toSnakeCaseKeys(categories),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to fetch VTEX category tree\"));\n }\n}\n\nexport const listCategoriesSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n});\n\nconst categoryRowsSchema = [\"id\", \"name\", \"parent_id\", \"is_active\", \"show_in_storefront\"] as const;\n\nexport async function listCategoriesHandler(params: z.infer<typeof listCategoriesSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const result = await listCategories(resolved.value.profileId, page, pageSize);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_categories\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: categoryRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"FatherCategoryId\", \"fatherCategoryId\", \"parentId\"),\n readValue(item, \"IsActive\", \"isActive\"),\n readValue(item, \"ShowInStoreFront\", \"showInStoreFront\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX categories\"));\n }\n}\n\nexport const getCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID.\"),\n});\n\nexport async function getCategoryHandler(params: z.infer<typeof getCategorySchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const category = await getCategory(resolved.value.profileId, params.categoryId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n category: toSnakeCaseKeys(category),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX category ${params.categoryId}`));\n }\n}\n\nexport const listBrandsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n});\n\nconst brandRowsSchema = [\"id\", \"name\", \"is_active\", \"menu_home\"] as const;\n\nexport async function listBrandsHandler(params: z.infer<typeof listBrandsSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const result = await listBrands(resolved.value.profileId, page, pageSize);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_brands\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: brandRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"Active\", \"active\"),\n readValue(item, \"MenuHome\", \"menuHome\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX brands\"));\n }\n}\n\nexport const getBrandSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n brandId: z.string().trim().min(1).describe(\"VTEX brand ID.\"),\n});\n\nexport async function getBrandHandler(params: z.infer<typeof getBrandSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const brand = await getBrand(resolved.value.profileId, params.brandId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n brand_id: params.brandId,\n brand: toSnakeCaseKeys(brand),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX brand ${params.brandId}`));\n }\n}\n\nexport const listSpecificationGroupsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID used to discover specification groups.\"),\n nameContains: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\"Optional case-insensitive substring filter applied to specification group names.\"),\n});\n\nconst specificationGroupRowsSchema = [\"id\", \"name\", \"category_id\"] as const;\n\nexport async function listSpecificationGroupsHandler(\n params: z.infer<typeof listSpecificationGroupsSchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const groups = await listSpecificationGroupsByCategory(resolved.value.profileId, params.categoryId);\n const normalizedFilter = params.nameContains?.toLocaleLowerCase();\n const filteredGroups = normalizedFilter\n ? groups.filter((group) => {\n const name = readValue(group, \"Name\", \"name\");\n return typeof name === \"string\" && name.toLocaleLowerCase().includes(normalizedFilter);\n })\n : groups;\n\n return object({\n metadata: stripNulls({\n total: groups.length,\n returned: filteredGroups.length,\n has_more: false,\n name_contains: params.nameContains,\n }),\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n rows_schema: specificationGroupRowsSchema,\n rows: filteredGroups.map((group) => [\n readValue(group, \"Id\", \"id\", \"FieldGroupId\", \"fieldGroupId\"),\n readValue(group, \"Name\", \"name\"),\n readValue(group, \"CategoryId\", \"categoryId\") ?? params.categoryId,\n ]),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to list VTEX specification groups for category ${params.categoryId}`)\n );\n }\n}\n\nexport const getProductSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nexport async function getProductHandler(params: z.infer<typeof getProductSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const product = await getProduct(resolved.value.profileId, params.productId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n product: toSnakeCaseKeys(product),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX product ${params.productId}`));\n }\n}\n\nexport const getProductSpecificationsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nexport async function getProductSpecificationsHandler(\n params: z.infer<typeof getProductSpecificationsSchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const specifications = await getProductSpecifications(resolved.value.profileId, params.productId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n specifications: toSnakeCaseKeys(specifications),\n })\n );\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to fetch VTEX product specifications for product ${params.productId}`)\n );\n }\n}\n\nexport const listProductsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n keyword: z.string().trim().min(1).optional().describe(\"Optional VTEX catalog keyword filter.\"),\n});\n\nconst productRowsSchema = [\"product_id\"] as const;\n\nexport async function listProductsHandler(params: z.infer<typeof listProductsSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 100;\n const from = (page - 1) * pageSize + 1;\n const to = from + pageSize - 1;\n const result = await listProducts(resolved.value.profileId, from, to, params.keyword);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_products\",\n total: result.total,\n page,\n pageSize,\n returned: result.productIds.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: productRowsSchema,\n rows: result.productIds.map((productId) => [productId]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX products\"));\n }\n}\n\nexport const listProductsByCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID used to filter the product search.\"),\n page: pageSchemaField,\n pageSize: categoryProductPageSizeSchemaField,\n});\n\nconst productByCategoryRowsSchema = [\n \"product_id\",\n \"product_name\",\n \"brand\",\n \"brand_id\",\n \"category_id\",\n \"product_reference\",\n] as const;\n\nexport async function listProductsByCategoryHandler(\n params: z.infer<typeof listProductsByCategorySchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const from = (page - 1) * pageSize;\n const to = from + pageSize - 1;\n const result = await listProductsByCategory(resolved.value.profileId, params.categoryId, from, to);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_products_by_category\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n rows_schema: productByCategoryRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"productId\", \"product_id\", \"productid\", \"id\", \"Id\"),\n readValue(item, \"productName\", \"product_name\", \"name\", \"Name\"),\n readValue(item, \"brand\", \"Brand\"),\n readValue(item, \"brandId\", \"brand_id\", \"BrandId\"),\n readValue(item, \"categoryId\", \"category_id\", \"CategoryId\") ?? null,\n readValue(\n item,\n \"productReference\",\n \"product_reference\",\n \"productReferenceCode\",\n \"product_reference_code\"\n ),\n ]),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to list VTEX products for category ${params.categoryId}`)\n );\n }\n}\n\nexport const getSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().trim().min(1).describe(\"VTEX SKU ID.\"),\n});\n\nexport async function getSkuHandler(params: z.infer<typeof getSkuSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const sku = await getSku(resolved.value.profileId, params.skuId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n sku_id: params.skuId,\n sku: toSnakeCaseKeys(sku),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX SKU ${params.skuId}`));\n }\n}\n\nexport const listSkusByProductSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nconst skuRowsSchema = [\"id\", \"name\", \"is_active\", \"ref_id\"] as const;\n\nexport async function listSkusByProductHandler(params: z.infer<typeof listSkusByProductSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const skus = await listSkusByProduct(resolved.value.profileId, params.productId);\n\n return object({\n metadata: { total: skus.length, returned: skus.length, has_more: false },\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n rows_schema: skuRowsSchema,\n rows: skus.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"IsActive\", \"isActive\"),\n readValue(item, \"RefId\", \"refId\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, `Failed to list VTEX SKUs for product ${params.productId}`));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -525,9 +525,15 @@ describe("MercadoLibre medium tool handlers batch 4", () => {
|
|
|
525
525
|
{
|
|
526
526
|
id: 999,
|
|
527
527
|
status: "approved",
|
|
528
|
+
status_detail: "accredited",
|
|
529
|
+
payment_method_id: "visa",
|
|
528
530
|
payment_type: "credit_card",
|
|
529
531
|
installments: 3,
|
|
530
|
-
total_paid_amount: 200
|
|
532
|
+
total_paid_amount: 200,
|
|
533
|
+
transaction_amount: 210,
|
|
534
|
+
transaction_amount_refunded: 10,
|
|
535
|
+
shipping_cost: 15,
|
|
536
|
+
coupon_amount: 5
|
|
531
537
|
}
|
|
532
538
|
],
|
|
533
539
|
tags: ["packed"]
|
|
@@ -568,16 +574,22 @@ describe("MercadoLibre medium tool handlers batch 4", () => {
|
|
|
568
574
|
paid_amount: 200,
|
|
569
575
|
payments: [
|
|
570
576
|
{
|
|
571
|
-
id: "",
|
|
577
|
+
id: "999",
|
|
572
578
|
status: "approved",
|
|
579
|
+
status_detail: "accredited",
|
|
580
|
+
payment_method_id: "visa",
|
|
573
581
|
payment_type: "credit_card",
|
|
574
582
|
installments: 3,
|
|
575
|
-
total_paid_amount: 200
|
|
583
|
+
total_paid_amount: 200,
|
|
584
|
+
transaction_amount: 210,
|
|
585
|
+
transaction_amount_refunded: 10,
|
|
586
|
+
shipping_cost: 15,
|
|
587
|
+
coupon_amount: 5
|
|
576
588
|
}
|
|
577
589
|
],
|
|
578
590
|
seller: { id: "", nickname: "seller-1" },
|
|
579
591
|
shipping: {
|
|
580
|
-
id: "",
|
|
592
|
+
id: "1",
|
|
581
593
|
status: "ready_to_ship",
|
|
582
594
|
substatus: "",
|
|
583
595
|
mode: "",
|