@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
package/dist/mcp-use.json
CHANGED
|
@@ -33,10 +33,7 @@ describe("VTEX catalog read wrappers", () => {
|
|
|
33
33
|
headers: { resources: "0-0/18" }
|
|
34
34
|
});
|
|
35
35
|
const brands = await catalog.listBrands("profile-1", 1, 10);
|
|
36
|
-
const specGroups = await catalog.listSpecificationGroupsByCategory(
|
|
37
|
-
"profile-1",
|
|
38
|
-
"42"
|
|
39
|
-
);
|
|
36
|
+
const specGroups = await catalog.listSpecificationGroupsByCategory("profile-1", "42");
|
|
40
37
|
const products = await catalog.listProducts("profile-1", 1, 10, "runner");
|
|
41
38
|
const categoryProducts = await catalog.listProductsByCategory("profile-1", "42", 0, 24);
|
|
42
39
|
expect(brands).toEqual({ items: [{ Id: 7, Name: "Acme" }], total: 1 });
|
|
@@ -57,7 +54,7 @@ describe("VTEX catalog read wrappers", () => {
|
|
|
57
54
|
params: { _from: 1, _to: 10, keyword: "runner" }
|
|
58
55
|
});
|
|
59
56
|
expect(getMock).toHaveBeenNthCalledWith(4, "/api/catalog_system/pub/products/search", {
|
|
60
|
-
params: {
|
|
57
|
+
params: { fq: "C:/42/", _from: 0, _to: 24 }
|
|
61
58
|
});
|
|
62
59
|
});
|
|
63
60
|
it("uses official SKU-by-product endpoint and normalizes non-array payloads", async () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/services/vtex/__tests__/vtex-catalog.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst getMock = vi.fn();\n\nvi.mock(\"../vtex-api.js\", () => ({\n getVtexApiClients: vi.fn(async () => ({\n vtexApi: { get: getMock },\n })),\n}));\n\nconst catalog = await import(\"../vtex-catalog.js\");\n\ndescribe(\"VTEX catalog read wrappers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"uses official category tree and category list endpoints\", async () => {\n getMock.mockResolvedValueOnce({ data: [{ id: 1 }] });\n getMock.mockResolvedValueOnce({ data: [{ Id: 10 }, { Id: 11 }] });\n\n const tree = await catalog.getCategoryTree(\"profile-1\", 3);\n const categories = await catalog.listCategories(\"profile-1\", 2, 25);\n\n expect(tree).toEqual([{ id: 1 }]);\n expect(categories).toEqual({ items: [{ Id: 10 }, { Id: 11 }], total: 2 });\n expect(getMock).toHaveBeenNthCalledWith(1, \"/api/catalog_system/pub/category/tree/3\");\n expect(getMock).toHaveBeenNthCalledWith(2, \"/api/catalog_system/pvt/category/list\", {\n params: { page: 2, pageSize: 25 },\n });\n });\n\n
|
|
5
|
-
"mappings": "AAAA,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD,MAAM,UAAU,GAAG,GAAG;AAEtB,GAAG,KAAK,kBAAkB,OAAO;AAAA,EAC/B,mBAAmB,GAAG,GAAG,aAAa;AAAA,IACpC,SAAS,EAAE,KAAK,QAAQ;AAAA,EAC1B,EAAE;AACJ,EAAE;AAEF,MAAM,UAAU,MAAM,OAAO,oBAAoB;AAEjD,SAAS,8BAA8B,MAAM;AAC3C,aAAW,MAAM;AACf,OAAG,cAAc;AAAA,EACnB,CAAC;AAED,KAAG,2DAA2D,YAAY;AACxE,YAAQ,sBAAsB,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACnD,YAAQ,sBAAsB,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;AAEhE,UAAM,OAAO,MAAM,QAAQ,gBAAgB,aAAa,CAAC;AACzD,UAAM,aAAa,MAAM,QAAQ,eAAe,aAAa,GAAG,EAAE;AAElE,WAAO,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAChC,WAAO,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC;AACxE,WAAO,OAAO,EAAE,wBAAwB,GAAG,yCAAyC;AACpF,WAAO,OAAO,EAAE,wBAAwB,GAAG,yCAAyC;AAAA,MAClF,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst getMock = vi.fn();\n\nvi.mock(\"../vtex-api.js\", () => ({\n getVtexApiClients: vi.fn(async () => ({\n vtexApi: { get: getMock },\n })),\n}));\n\nconst catalog = await import(\"../vtex-catalog.js\");\n\ndescribe(\"VTEX catalog read wrappers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"uses official category tree and category list endpoints\", async () => {\n getMock.mockResolvedValueOnce({ data: [{ id: 1 }] });\n getMock.mockResolvedValueOnce({ data: [{ Id: 10 }, { Id: 11 }] });\n\n const tree = await catalog.getCategoryTree(\"profile-1\", 3);\n const categories = await catalog.listCategories(\"profile-1\", 2, 25);\n\n expect(tree).toEqual([{ id: 1 }]);\n expect(categories).toEqual({ items: [{ Id: 10 }, { Id: 11 }], total: 2 });\n expect(getMock).toHaveBeenNthCalledWith(1, \"/api/catalog_system/pub/category/tree/3\");\n expect(getMock).toHaveBeenNthCalledWith(2, \"/api/catalog_system/pvt/category/list\", {\n params: { page: 2, pageSize: 25 },\n });\n });\n\n it(\"uses official brand list and product id search endpoints\", async () => {\n getMock.mockResolvedValueOnce({ data: [{ Id: 7, Name: \"Acme\" }] });\n getMock.mockResolvedValueOnce({ data: [{ Id: 90, Name: \"General\" }] });\n getMock.mockResolvedValueOnce({ data: { data: [101, 102], range: { total: 30 } } });\n getMock.mockResolvedValueOnce({\n data: [\n { productId: \"200\", productName: \"Runner\", brand: \"Acme\", categoryId: \"42\" },\n ],\n headers: { resources: \"0-0/18\" },\n });\n\n const brands = await catalog.listBrands(\"profile-1\", 1, 10);\n const specGroups = await catalog.listSpecificationGroupsByCategory(\"profile-1\", \"42\");\n const products = await catalog.listProducts(\"profile-1\", 1, 10, \"runner\");\n const categoryProducts = await catalog.listProductsByCategory(\"profile-1\", \"42\", 0, 24);\n\n expect(brands).toEqual({ items: [{ Id: 7, Name: \"Acme\" }], total: 1 });\n expect(specGroups).toEqual([{ Id: 90, Name: \"General\" }]);\n expect(products).toEqual({ productIds: [101, 102], total: 30 });\n expect(categoryProducts).toEqual({\n items: [{ productId: \"200\", productName: \"Runner\", brand: \"Acme\", categoryId: \"42\" }],\n total: 18,\n });\n expect(getMock).toHaveBeenNthCalledWith(1, \"/api/catalog_system/pvt/brand/list\", {\n params: { page: 1, pageSize: 10 },\n });\n expect(getMock).toHaveBeenNthCalledWith(\n 2,\n \"/api/catalog_system/pvt/specification/groupbycategory/42\"\n );\n expect(getMock).toHaveBeenNthCalledWith(3, \"/api/catalog_system/pvt/products/GetProductAndSkuIds\", {\n params: { _from: 1, _to: 10, keyword: \"runner\" },\n });\n expect(getMock).toHaveBeenNthCalledWith(4, \"/api/catalog_system/pub/products/search\", {\n params: { fq: \"C:/42/\", _from: 0, _to: 24 },\n });\n });\n\n it(\"uses official SKU-by-product endpoint and normalizes non-array payloads\", async () => {\n getMock.mockResolvedValueOnce({ data: [{ Id: 501 }, { Id: 502 }] });\n getMock.mockResolvedValueOnce({ data: null });\n\n const skus = await catalog.listSkusByProduct(\"profile-1\", \"101\");\n const empty = await catalog.listSkusByProduct(\"profile-1\", \"102\");\n\n expect(skus).toEqual([{ Id: 501 }, { Id: 502 }]);\n expect(empty).toEqual([]);\n expect(getMock).toHaveBeenNthCalledWith(\n 1,\n \"/api/catalog_system/pvt/sku/stockkeepingunitByProductId/101\"\n );\n expect(getMock).toHaveBeenNthCalledWith(\n 2,\n \"/api/catalog_system/pvt/sku/stockkeepingunitByProductId/102\"\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -93,7 +93,7 @@ async function listProductsByCategory(profileId, categoryId, from, to) {
|
|
|
93
93
|
const { vtexApi } = await getVtexApiClients(profileId);
|
|
94
94
|
const response = await vtexApi.get("/api/catalog_system/pub/products/search", {
|
|
95
95
|
params: {
|
|
96
|
-
|
|
96
|
+
fq: `C:/${categoryId}/`,
|
|
97
97
|
_from: from,
|
|
98
98
|
_to: to
|
|
99
99
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/vtex/vtex-catalog.ts"],
|
|
4
|
-
"sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type ProductOffersResponse = Record<string, unknown>[];\nexport type VtexCatalogRecord = Record<string, unknown>;\n\nexport interface VtexCatalogListResponse<TRecord extends VtexCatalogRecord = VtexCatalogRecord> {\n items: TRecord[];\n total: number;\n}\n\nexport interface VtexProductIdListResponse {\n productIds: Array<string | number>;\n total: number;\n}\n\nfunction readTotalFromHeaders(headers: unknown, fallback: number): number {\n if (!headers || typeof headers !== \"object\") {\n return fallback;\n }\n\n const record = headers as Record<string, unknown>;\n const rawRange = record.resources ?? record[\"content-range\"] ?? record[\"Content-Range\"];\n const range = Array.isArray(rawRange) ? rawRange[0] : rawRange;\n\n if (typeof range !== \"string\") {\n return fallback;\n }\n\n const match = range.match(/\\/(\\d+)$/);\n if (!match) {\n return fallback;\n }\n\n const total = Number(match[1]);\n return Number.isFinite(total) ? total : fallback;\n}\n\nfunction toRecordArray(data: unknown): VtexCatalogRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.filter((item): item is VtexCatalogRecord => item !== null && typeof item === \"object\");\n}\n\nfunction toProductIds(data: unknown): Array<string | number> {\n if (Array.isArray(data)) {\n return data.filter((item): item is string | number => typeof item === \"string\" || typeof item === \"number\");\n }\n\n if (data && typeof data === \"object\") {\n return Object.keys(data);\n }\n\n return [];\n}\n\nfunction readTotal(data: unknown, fallback: number): number {\n if (!data || typeof data !== \"object\") {\n return fallback;\n }\n\n const record = data as Record<string, unknown>;\n const range = record.range;\n if (range && typeof range === \"object\") {\n const total = (range as Record<string, unknown>).total;\n if (typeof total === \"number\") {\n return total;\n }\n }\n\n if (typeof record.total === \"number\") {\n return record.total;\n }\n\n return fallback;\n}\n\nexport async function getCategoryTree(\n profileId: string,\n depth = 5\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(`/api/catalog_system/pub/category/tree/${depth}`);\n\n return toRecordArray(response.data);\n}\n\nexport async function listCategories(\n profileId: string,\n page: number,\n pageSize: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/category/list\", {\n params: { page, pageSize },\n });\n const items = toRecordArray(response.data);\n\n return { items, total: readTotal(response.data, items.length) };\n}\n\nexport async function listBrands(\n profileId: string,\n page: number,\n pageSize: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/brand/list\", {\n params: { page, pageSize },\n });\n const items = toRecordArray(response.data);\n\n return { items, total: readTotal(response.data, items.length) };\n}\n\nexport async function listSpecificationGroupsByCategory(\n profileId: string,\n categoryId: string\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\n `/api/catalog_system/pvt/specification/groupbycategory/${categoryId}`\n );\n\n return toRecordArray(response.data);\n}\n\nexport async function listProducts(\n profileId: string,\n from: number,\n to: number,\n keyword?: string\n): Promise<VtexProductIdListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/products/GetProductAndSkuIds\", {\n params: {\n _from: from,\n _to: to,\n keyword,\n },\n });\n const data = response.data && typeof response.data === \"object\" && \"data\" in response.data\n ? (response.data as Record<string, unknown>).data\n : response.data;\n const productIds = toProductIds(data);\n\n return { productIds, total: readTotal(response.data, productIds.length) };\n}\n\nexport async function listProductsByCategory(\n profileId: string,\n categoryId: string,\n from: number,\n to: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pub/products/search\", {\n params: {\n
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type ProductOffersResponse = Record<string, unknown>[];\nexport type VtexCatalogRecord = Record<string, unknown>;\n\nexport interface VtexCatalogListResponse<TRecord extends VtexCatalogRecord = VtexCatalogRecord> {\n items: TRecord[];\n total: number;\n}\n\nexport interface VtexProductIdListResponse {\n productIds: Array<string | number>;\n total: number;\n}\n\nfunction readTotalFromHeaders(headers: unknown, fallback: number): number {\n if (!headers || typeof headers !== \"object\") {\n return fallback;\n }\n\n const record = headers as Record<string, unknown>;\n const rawRange = record.resources ?? record[\"content-range\"] ?? record[\"Content-Range\"];\n const range = Array.isArray(rawRange) ? rawRange[0] : rawRange;\n\n if (typeof range !== \"string\") {\n return fallback;\n }\n\n const match = range.match(/\\/(\\d+)$/);\n if (!match) {\n return fallback;\n }\n\n const total = Number(match[1]);\n return Number.isFinite(total) ? total : fallback;\n}\n\nfunction toRecordArray(data: unknown): VtexCatalogRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.filter((item): item is VtexCatalogRecord => item !== null && typeof item === \"object\");\n}\n\nfunction toProductIds(data: unknown): Array<string | number> {\n if (Array.isArray(data)) {\n return data.filter((item): item is string | number => typeof item === \"string\" || typeof item === \"number\");\n }\n\n if (data && typeof data === \"object\") {\n return Object.keys(data);\n }\n\n return [];\n}\n\nfunction readTotal(data: unknown, fallback: number): number {\n if (!data || typeof data !== \"object\") {\n return fallback;\n }\n\n const record = data as Record<string, unknown>;\n const range = record.range;\n if (range && typeof range === \"object\") {\n const total = (range as Record<string, unknown>).total;\n if (typeof total === \"number\") {\n return total;\n }\n }\n\n if (typeof record.total === \"number\") {\n return record.total;\n }\n\n return fallback;\n}\n\nexport async function getCategoryTree(\n profileId: string,\n depth = 5\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(`/api/catalog_system/pub/category/tree/${depth}`);\n\n return toRecordArray(response.data);\n}\n\nexport async function listCategories(\n profileId: string,\n page: number,\n pageSize: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/category/list\", {\n params: { page, pageSize },\n });\n const items = toRecordArray(response.data);\n\n return { items, total: readTotal(response.data, items.length) };\n}\n\nexport async function listBrands(\n profileId: string,\n page: number,\n pageSize: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/brand/list\", {\n params: { page, pageSize },\n });\n const items = toRecordArray(response.data);\n\n return { items, total: readTotal(response.data, items.length) };\n}\n\nexport async function listSpecificationGroupsByCategory(\n profileId: string,\n categoryId: string\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\n `/api/catalog_system/pvt/specification/groupbycategory/${categoryId}`\n );\n\n return toRecordArray(response.data);\n}\n\nexport async function listProducts(\n profileId: string,\n from: number,\n to: number,\n keyword?: string\n): Promise<VtexProductIdListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/products/GetProductAndSkuIds\", {\n params: {\n _from: from,\n _to: to,\n keyword,\n },\n });\n const data = response.data && typeof response.data === \"object\" && \"data\" in response.data\n ? (response.data as Record<string, unknown>).data\n : response.data;\n const productIds = toProductIds(data);\n\n return { productIds, total: readTotal(response.data, productIds.length) };\n}\n\nexport async function listProductsByCategory(\n profileId: string,\n categoryId: string,\n from: number,\n to: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pub/products/search\", {\n params: {\n fq: `C:/${categoryId}/`,\n _from: from,\n _to: to,\n },\n });\n const items = toRecordArray(response.data);\n const totalFromHeaders = readTotalFromHeaders(response.headers, items.length);\n\n return { items, total: readTotal(response.data, totalFromHeaders) };\n}\n\nexport async function listSkusByProduct(\n profileId: string,\n productId: string\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\n `/api/catalog_system/pvt/sku/stockkeepingunitByProductId/${productId}`\n );\n\n return toRecordArray(response.data);\n}\n\nexport async function getProductOffers(\n profileId: string,\n productId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}`\n );\n\n return response.data;\n}\n\nexport async function getSkuOffers(\n profileId: string,\n productId: string,\n skuId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}/sku/${skuId}`\n );\n\n return response.data;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,7 +3,14 @@ import { z } from "zod";
|
|
|
3
3
|
import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
|
|
4
4
|
import { getMercadoLibreOrder, getMercadoLibreOrderDetailsBatch } from "../../services/mercadolibre/mercadolibre-orders.js";
|
|
5
5
|
import { stripNulls } from "../../utils/strip-payload.js";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
asArray,
|
|
8
|
+
asRecord,
|
|
9
|
+
compactDateTime,
|
|
10
|
+
normalizeScalarString,
|
|
11
|
+
normalizeString,
|
|
12
|
+
toNumber
|
|
13
|
+
} from "./helpers.js";
|
|
7
14
|
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
8
15
|
import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
|
|
9
16
|
const MAX_ORDER_IDS = 50;
|
|
@@ -12,6 +19,7 @@ const meliGetOrderDetailsSchema = z.object({
|
|
|
12
19
|
orderIds: z.array(z.string().trim().min(1).describe("MercadoLibre order id.")).min(1).max(MAX_ORDER_IDS).describe("One or more MercadoLibre order ids (up to 50).")
|
|
13
20
|
});
|
|
14
21
|
function formatOrder(order) {
|
|
22
|
+
const optionalMoney = (value) => value == null || value === "" ? void 0 : toNumber(value);
|
|
15
23
|
return stripNulls({
|
|
16
24
|
order_id: normalizeString(order.id),
|
|
17
25
|
status: normalizeString(order.status),
|
|
@@ -22,7 +30,7 @@ function formatOrder(order) {
|
|
|
22
30
|
total_amount: toNumber(order.total_amount),
|
|
23
31
|
paid_amount: toNumber(order.paid_amount),
|
|
24
32
|
shipping: stripNulls({
|
|
25
|
-
id:
|
|
33
|
+
id: normalizeScalarString(asRecord(order.shipping).id),
|
|
26
34
|
status: normalizeString(asRecord(order.shipping).status),
|
|
27
35
|
substatus: normalizeString(asRecord(order.shipping).substatus),
|
|
28
36
|
mode: normalizeString(asRecord(order.shipping).mode),
|
|
@@ -49,11 +57,17 @@ function formatOrder(order) {
|
|
|
49
57
|
}),
|
|
50
58
|
payments: asArray(order.payments).map(
|
|
51
59
|
(payment) => stripNulls({
|
|
52
|
-
id:
|
|
60
|
+
id: normalizeScalarString(payment.id),
|
|
53
61
|
status: normalizeString(payment.status),
|
|
62
|
+
status_detail: normalizeString(payment.status_detail) || void 0,
|
|
63
|
+
payment_method_id: normalizeString(payment.payment_method_id) || void 0,
|
|
54
64
|
payment_type: normalizeString(payment.payment_type),
|
|
55
65
|
installments: toNumber(payment.installments),
|
|
56
|
-
total_paid_amount: toNumber(payment.total_paid_amount)
|
|
66
|
+
total_paid_amount: toNumber(payment.total_paid_amount),
|
|
67
|
+
transaction_amount: optionalMoney(payment.transaction_amount),
|
|
68
|
+
transaction_amount_refunded: optionalMoney(payment.transaction_amount_refunded),
|
|
69
|
+
shipping_cost: optionalMoney(payment.shipping_cost),
|
|
70
|
+
coupon_amount: optionalMoney(payment.coupon_amount)
|
|
57
71
|
})
|
|
58
72
|
),
|
|
59
73
|
tags: Array.isArray(order.tags) ? order.tags : void 0
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/get-order-details.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { getMercadoLibreOrder, getMercadoLibreOrderDetailsBatch } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {
|
|
5
|
-
"mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,+BAA+B;AACxC,SAAS,sBAAsB,wCAAwC;AACvE,SAAS,kBAAkB;AAC3B,
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { getMercadoLibreOrder, getMercadoLibreOrderDetailsBatch } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n normalizeScalarString,\n normalizeString,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst MAX_ORDER_IDS = 50;\n\nexport const meliGetOrderDetailsSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n orderIds: z\n .array(z.string().trim().min(1).describe(\"MercadoLibre order id.\"))\n .min(1)\n .max(MAX_ORDER_IDS)\n .describe(\"One or more MercadoLibre order ids (up to 50).\"),\n});\n\nfunction formatOrder(order: Record<string, unknown>) {\n const optionalMoney = (value: unknown) => (value == null || value === \"\" ? undefined : toNumber(value));\n\n return stripNulls({\n order_id: normalizeString(order.id),\n status: normalizeString(order.status),\n status_detail: normalizeString(order.status_detail),\n date_created: compactDateTime(order.date_created),\n date_closed: compactDateTime(order.date_closed),\n currency_id: normalizeString(order.currency_id, \"UNKNOWN\"),\n total_amount: toNumber(order.total_amount),\n paid_amount: toNumber(order.paid_amount),\n shipping: stripNulls({\n id: normalizeScalarString(asRecord(order.shipping).id),\n status: normalizeString(asRecord(order.shipping).status),\n substatus: normalizeString(asRecord(order.shipping).substatus),\n mode: normalizeString(asRecord(order.shipping).mode),\n logistic_type: normalizeString(asRecord(order.shipping).logistic_type),\n }),\n buyer: stripNulls({\n id: normalizeString(asRecord(order.buyer).id),\n nickname: normalizeString(asRecord(order.buyer).nickname),\n }),\n seller: stripNulls({\n id: normalizeString(asRecord(order.seller).id),\n nickname: normalizeString(asRecord(order.seller).nickname),\n }),\n items: asArray<Record<string, unknown>>(order.order_items).map((entry) => {\n const item = asRecord(entry.item);\n return stripNulls({\n item_id: normalizeString(item.id),\n title: normalizeString(item.title),\n variation_id: normalizeString(item.variation_id),\n quantity: toNumber(entry.quantity),\n unit_price: toNumber(entry.unit_price),\n full_unit_price: toNumber(entry.full_unit_price),\n });\n }),\n payments: asArray<Record<string, unknown>>(order.payments).map((payment) =>\n stripNulls({\n id: normalizeScalarString(payment.id),\n status: normalizeString(payment.status),\n status_detail: normalizeString(payment.status_detail) || undefined,\n payment_method_id: normalizeString(payment.payment_method_id) || undefined,\n payment_type: normalizeString(payment.payment_type),\n installments: toNumber(payment.installments),\n total_paid_amount: toNumber(payment.total_paid_amount),\n transaction_amount: optionalMoney(payment.transaction_amount),\n transaction_amount_refunded: optionalMoney(payment.transaction_amount_refunded),\n shipping_cost: optionalMoney(payment.shipping_cost),\n coupon_amount: optionalMoney(payment.coupon_amount),\n })\n ),\n tags: Array.isArray(order.tags) ? order.tags : undefined,\n });\n}\n\nexport async function meliGetOrderDetailsHandler(\n params: z.infer<typeof meliGetOrderDetailsSchema>\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 uniqueOrderIds = Array.from(new Set(params.orderIds));\n\n if (uniqueOrderIds.length === 1) {\n const order = await getMercadoLibreOrder(profileId, uniqueOrderIds[0]);\n return object(\n stripNulls({\n metadata: {\n profile_id: profileId,\n requested: 1,\n successful: 1,\n failed: 0,\n },\n orders: [formatOrder(order)],\n })\n );\n }\n\n const batch = await getMercadoLibreOrderDetailsBatch(profileId, uniqueOrderIds, {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n\n return object(\n stripNulls({\n metadata: {\n profile_id: profileId,\n requested: uniqueOrderIds.length,\n successful: batch.successful.length,\n failed: batch.failed.length,\n has_failures: batch.failed.length > 0,\n },\n orders: batch.successful.map((entry) => formatOrder(entry.document)),\n failures: batch.failed.map((failure) => ({\n order_id: failure.id,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n })),\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre order details\"));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -71,7 +71,9 @@ const ordersSchema = [
|
|
|
71
71
|
"first_item_sale_fee",
|
|
72
72
|
"first_item_listing_type",
|
|
73
73
|
"variation_attributes",
|
|
74
|
-
"stock_node_id"
|
|
74
|
+
"stock_node_id",
|
|
75
|
+
"payment_shipping_cost",
|
|
76
|
+
"payment_coupon_amount"
|
|
75
77
|
];
|
|
76
78
|
function compactStringList(values, separator = " | ") {
|
|
77
79
|
return asArray(values).map((value) => normalizeScalarString(value).trim()).filter(Boolean).join(separator);
|
|
@@ -929,7 +931,9 @@ function formatCompactOrder(order, metricsByCurrency) {
|
|
|
929
931
|
toNumber(firstOrderItem.sale_fee),
|
|
930
932
|
normalizeString(firstOrderItem.listing_type_id),
|
|
931
933
|
compactVariationAttributes(firstItem.variation_attributes),
|
|
932
|
-
normalizeString(stock.node_id)
|
|
934
|
+
normalizeString(stock.node_id),
|
|
935
|
+
toNumber(firstPayment.shipping_cost),
|
|
936
|
+
toNumber(firstPayment.coupon_amount)
|
|
933
937
|
];
|
|
934
938
|
}
|
|
935
939
|
const meliGetOrdersSummarySchema = z.object({
|