@yoryoboy/bi-mcp 1.14.2 → 1.14.3

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/mcp-use.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "includeInspector": false,
3
- "buildTime": "2026-06-20T22:11:48.741Z",
4
- "buildId": "c7a6a5ff31e542a4",
3
+ "buildTime": "2026-06-24T12:33:14.047Z",
4
+ "buildId": "e656cda6902530db",
5
5
  "entryPoint": "dist/index.js",
6
6
  "widgets": {},
7
7
  "tunnel": {
@@ -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: { category: "42", _from: 0, _to: 24 }
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\tit(\"uses official brand list and product id search endpoints\", async () => {\n\t\tgetMock.mockResolvedValueOnce({ data: [{ Id: 7, Name: \"Acme\" }] });\n\t\tgetMock.mockResolvedValueOnce({ data: [{ Id: 90, Name: \"General\" }] });\n\t\tgetMock.mockResolvedValueOnce({ data: { data: [101, 102], range: { total: 30 } } });\n\t\tgetMock.mockResolvedValueOnce({\n\t\t\tdata: [\n\t\t\t\t{ productId: \"200\", productName: \"Runner\", brand: \"Acme\", categoryId: \"42\" },\n\t\t\t],\n\t\t\theaders: { resources: \"0-0/18\" },\n\t\t});\n\n\t\tconst brands = await catalog.listBrands(\"profile-1\", 1, 10);\n\t\tconst specGroups = await catalog.listSpecificationGroupsByCategory(\n\t\t\t\"profile-1\",\n\t\t\t\"42\",\n\t\t);\n\t\tconst products = await catalog.listProducts(\"profile-1\", 1, 10, \"runner\");\n\t\tconst categoryProducts = await catalog.listProductsByCategory(\"profile-1\", \"42\", 0, 24);\n\n\t\texpect(brands).toEqual({ items: [{ Id: 7, Name: \"Acme\" }], total: 1 });\n\t\texpect(specGroups).toEqual([{ Id: 90, Name: \"General\" }]);\n\t\texpect(products).toEqual({ productIds: [101, 102], total: 30 });\n\t\texpect(categoryProducts).toEqual({\n\t\t\titems: [{ productId: \"200\", productName: \"Runner\", brand: \"Acme\", categoryId: \"42\" }],\n\t\t\ttotal: 18,\n\t\t});\n\t\texpect(getMock).toHaveBeenNthCalledWith(1, \"/api/catalog_system/pvt/brand/list\", {\n\t\t\tparams: { page: 1, pageSize: 10 },\n\t\t});\n\t\texpect(getMock).toHaveBeenNthCalledWith(\n\t\t\t2,\n\t\t\t\"/api/catalog_system/pvt/specification/groupbycategory/42\",\n\t\t);\n\t\texpect(getMock).toHaveBeenNthCalledWith(3, \"/api/catalog_system/pvt/products/GetProductAndSkuIds\", {\n\t\t\tparams: { _from: 1, _to: 10, keyword: \"runner\" },\n\t\t});\n\t\texpect(getMock).toHaveBeenNthCalledWith(4, \"/api/catalog_system/pub/products/search\", {\n\t\t\tparams: { category: \"42\", _from: 0, _to: 24 },\n\t\t});\n\t});\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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",
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
- category: categoryId,
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 category: 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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",
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
  }
@@ -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: 1,
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: [["101", "Runner", "Acme", 7, "23", "RUN-001"]]
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": "AAAA,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD,MAAM,sBAAsB,GAAG,GAAG;AAClC,MAAM,qBAAqB,GAAG,GAAG;AACjC,MAAM,iBAAiB,GAAG,GAAG;AAC7B,MAAM,wCAAwC,GAAG,GAAG;AACpD,MAAM,mBAAmB,GAAG,GAAG;AAC/B,MAAM,6BAA6B,GAAG,GAAG;AACzC,MAAM,wBAAwB,GAAG,GAAG;AACpC,MAAM,eAAe,GAAG,GAAG;AAC3B,MAAM,kBAAkB,GAAG,GAAG;AAC9B,MAAM,iBAAiB,GAAG,GAAG;AAC7B,MAAM,+BAA+B,GAAG,GAAG;AAC3C,MAAM,aAAa,GAAG,GAAG;AACzB,MAAM,oCAAoC,GAAG,GAAG;AAChD,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,EAAE,MAAM,UAAU,MAAM,EAAE;AAC/D,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,EAAE,MAAM,SAAS,QAAQ,EAAE;AAEjE,GAAG,KAAK,kBAAkB,OAAO;AAAA,EAC/B,QAAQ;AAAA,EACR,OAAO;AACT,EAAE;AAEF,GAAG,KAAK,0CAA0C,OAAO;AAAA,EACvD,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,mCAAmC;AAAA,EACnC,cAAc;AAAA,EACd,wBAAwB;AAAA,EACxB,mBAAmB;AACrB,EAAE;AAEF,GAAG,KAAK,gDAAgD,OAAO;AAAA,EAC7D,UAAU;AAAA,EACV,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,QAAQ;AACV,EAAE;AAEF,GAAG,KAAK,4BAA4B,OAAO;AAAA,EACzC,+BAA+B;AACjC,EAAE;AAEF,MAAM,eAAe,MAAM,OAAO,gCAAgC;AAClE,MAAM,wBAAwB,MAAM,OAAO,yBAAyB;AACpE,MAAM,uBAAuB,MAAM,OAAO,uBAAuB;AACjE,MAAM,oBAAoB,MAAM,OAAO,oBAAoB;AAC3D,MAAM,iBAAiB,MAAM,OAAO,iBAAiB;AACrD,MAAM,mBAAmB,MAAM,OAAO,mBAAmB;AACzD,MAAM,gCAAgC,MAAM,OAAO,iCAAiC;AACpF,MAAM,mBAAmB,MAAM,OAAO,mBAAmB;AACzD,MAAM,iCAAiC,MAAM,OAAO,kCAAkC;AACtF,MAAM,qBAAqB,MAAM,OAAO,qBAAqB;AAC7D,MAAM,+BAA+B,MAAM,OAAO,iCAAiC;AACnF,MAAM,eAAe,MAAM,OAAO,eAAe;AACjD,MAAM,0BAA0B,MAAM,OAAO,4BAA4B;AAEzE,SAAS,oCAAoC,MAAM;AACjD,aAAW,MAAM;AACf,OAAG,cAAc;AACjB,sCAAkC,kBAAkB;AAAA,MAClD,IAAI;AAAA,MACJ,OAAO,EAAE,WAAW,YAAY;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAED,KAAG,8DAA8D,MAAM;AACrE,WAAO,sBAAsB,qBAAqB,EAAE,KAAK,aAAa,qBAAqB;AAC3F,WAAO,sBAAsB,sBAAsB,EAAE,KAAK,aAAa,sBAAsB;AAC7F,WAAO,qBAAqB,oBAAoB,EAAE,KAAK,aAAa,oBAAoB;AACxF,WAAO,qBAAqB,qBAAqB,EAAE,KAAK,aAAa,qBAAqB;AAC1F,WAAO,kBAAkB,iBAAiB,EAAE,KAAK,aAAa,iBAAiB;AAC/E,WAAO,kBAAkB,kBAAkB,EAAE,KAAK,aAAa,kBAAkB;AACjF,WAAO,eAAe,cAAc,EAAE,KAAK,aAAa,cAAc;AACtE,WAAO,eAAe,eAAe,EAAE,KAAK,aAAa,eAAe;AACxE,WAAO,iBAAiB,gBAAgB,EAAE,KAAK,aAAa,gBAAgB;AAC5E,WAAO,iBAAiB,iBAAiB,EAAE,KAAK,aAAa,iBAAiB;AAC9E,WAAO,8BAA8B,6BAA6B,EAAE;AAAA,MAClE,aAAa;AAAA,IACf;AACA,WAAO,8BAA8B,8BAA8B,EAAE;AAAA,MACnE,aAAa;AAAA,IACf;AACA,WAAO,iBAAiB,gBAAgB,EAAE,KAAK,aAAa,gBAAgB;AAC5E,WAAO,iBAAiB,iBAAiB,EAAE,KAAK,aAAa,iBAAiB;AAC9E,WAAO,+BAA+B,8BAA8B,EAAE;AAAA,MACpE,aAAa;AAAA,IACf;AACA,WAAO,+BAA+B,+BAA+B,EAAE;AAAA,MACrE,aAAa;AAAA,IACf;AACA,WAAO,mBAAmB,kBAAkB,EAAE,KAAK,aAAa,kBAAkB;AAClF,WAAO,mBAAmB,mBAAmB,EAAE,KAAK,aAAa,mBAAmB;AACpF,WAAO,6BAA6B,4BAA4B,EAAE;AAAA,MAChE,aAAa;AAAA,IACf;AACA,WAAO,6BAA6B,6BAA6B,EAAE;AAAA,MACjE,aAAa;AAAA,IACf;AACA,WAAO,aAAa,YAAY,EAAE,KAAK,aAAa,YAAY;AAChE,WAAO,aAAa,aAAa,EAAE,KAAK,aAAa,aAAa;AAClE,WAAO,wBAAwB,uBAAuB,EAAE,KAAK,aAAa,uBAAuB;AACjG,WAAO,wBAAwB,wBAAwB,EAAE,KAAK,aAAa,wBAAwB;AAAA,EACrG,CAAC;AAED,KAAG,6CAA6C,MAAM;AACpD,WAAO,MAAM,aAAa,kBAAkB,MAAM,EAAE,WAAW,OAAO,YAAY,KAAK,CAAC,CAAC,EAAE,QAAQ;AACnG,WAAO,MAAM,aAAa,eAAe,MAAM,EAAE,WAAW,aAAa,SAAS,GAAG,CAAC,CAAC,EAAE,QAAQ;AACjG,WAAO,MAAM,aAAa,8BAA8B,MAAM,EAAE,YAAY,GAAG,CAAC,CAAC,EAAE,QAAQ;AAC3F,WAAO,MAAM,aAAa,iBAAiB,MAAM,EAAE,WAAW,aAAa,WAAW,GAAG,CAAC,CAAC,EAAE,QAAQ;AACrG;AAAA,MAAO,MACL,aAAa,6BAA6B,MAAM,EAAE,WAAW,aAAa,YAAY,GAAG,CAAC;AAAA,IAC5F,EAAE,QAAQ;AACV;AAAA,MAAO,MACL,aAAa,+BAA+B,MAAM,EAAE,WAAW,aAAa,WAAW,GAAG,CAAC;AAAA,IAC7F,EAAE,QAAQ;AACV,WAAO,MAAM,aAAa,aAAa,MAAM,EAAE,WAAW,aAAa,OAAO,GAAG,CAAC,CAAC,EAAE,QAAQ;AAC7F;AAAA,MAAO,MACL,aAAa,wBAAwB,MAAM,EAAE,WAAW,aAAa,WAAW,GAAG,CAAC;AAAA,IACtF,EAAE,QAAQ;AAAA,EACZ,CAAC;AAED,KAAG,yDAAyD,MAAM;AAChE;AAAA,MACE,aAAa,6BAA6B,MAAM;AAAA,QAC9C,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAED;AAAA,MAAO,MACL,aAAa,6BAA6B,MAAM;AAAA,QAC9C,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,EACZ,CAAC;AAED,KAAG,6DAA6D,YAAY;AAC1E,wBAAoB,kBAAkB,CAAC,EAAE,IAAI,GAAG,MAAM,QAAQ,UAAU,CAAC,EAAE,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;AAErG,UAAM,SAAS,MAAM,aAAa,uBAAuB,EAAE,WAAW,YAAY,CAAC;AAEnF,WAAO,iCAAiC,EAAE,qBAAqB,WAAW;AAC1E,WAAO,mBAAmB,EAAE,qBAAqB,aAAa,CAAC;AAC/D,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,YAAY,CAAC,EAAE,IAAI,GAAG,MAAM,QAAQ,UAAU,CAAC,EAAE,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,MAC5E;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,mGAAmG,YAAY;AAChH,sCAAkC,sBAAsB;AAAA,MACtD,IAAI;AAAA,MACJ,UAAU,EAAE,oBAAoB,MAAM,UAAU,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE;AAAA,IACxE,CAAC;AAED,UAAM,SAAS,MAAM,aAAa,uBAAuB,CAAC,CAAC;AAE3D,WAAO,iCAAiC,EAAE,qBAAqB,MAAS;AACxE,WAAO,mBAAmB,EAAE,IAAI,iBAAiB;AACjD,WAAO,MAAM,EAAE,QAAQ,EAAE,oBAAoB,MAAM,UAAU,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC;AAAA,EACtF,CAAC;AAED,KAAG,sDAAsD,YAAY;AACnE,wBAAoB,kBAAkB,CAAC,EAAE,IAAI,GAAG,MAAM,OAAO,CAAC,CAAC;AAE/D,UAAM,SAAS,MAAM,aAAa,uBAAuB,EAAE,WAAW,aAAa,OAAO,EAAE,CAAC;AAE7F,WAAO,mBAAmB,EAAE,qBAAqB,aAAa,CAAC;AAC/D,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,YAAY,CAAC,EAAE,IAAI,GAAG,MAAM,OAAO,CAAC;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,+EAA+E,YAAY;AAC5F,uBAAmB,kBAAkB;AAAA,MACnC,OAAO;AAAA,QACL,EAAE,IAAI,IAAI,MAAM,SAAS,kBAAkB,MAAM,UAAU,MAAM,kBAAkB,KAAK;AAAA,QACxF,EAAE,IAAI,IAAI,MAAM,SAAS,kBAAkB,IAAI,UAAU,OAAO,kBAAkB,MAAM;AAAA,MAC1F;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AACD,mBAAe,kBAAkB;AAAA,MAC/B,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,QAAQ,QAAQ,MAAM,UAAU,MAAM,CAAC;AAAA,MAC9D,OAAO;AAAA,IACT,CAAC;AAED,UAAM,aAAa,MAAM,aAAa,sBAAsB;AAAA,MAC1D,WAAW;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,SAAS,MAAM,aAAa,kBAAkB,EAAE,WAAW,aAAa,MAAM,GAAG,UAAU,GAAG,CAAC;AAErG,WAAO,kBAAkB,EAAE,qBAAqB,aAAa,GAAG,CAAC;AACjE,WAAO,UAAU,EAAE,QAAQ;AAAA,MACzB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU;AAAA,UACR,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,UACX,cAAc;AAAA,QAChB;AAAA,QACA,YAAY;AAAA,QACZ,aAAa,CAAC,MAAM,QAAQ,aAAa,aAAa,oBAAoB;AAAA,QAC1E,MAAM;AAAA,UACJ,CAAC,IAAI,SAAS,MAAM,MAAM,IAAI;AAAA,UAC9B,CAAC,IAAI,SAAS,IAAI,OAAO,KAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,IAAI,UAAU,GAAG,UAAU,MAAM;AAAA,QAC1E,YAAY;AAAA,QACZ,aAAa,CAAC,MAAM,QAAQ,aAAa,WAAW;AAAA,QACpD,MAAM,CAAC,CAAC,GAAG,QAAQ,MAAM,KAAK,CAAC;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,0EAA0E,YAAY;AACvF,0CAAsC,kBAAkB;AAAA,MACtD,EAAE,IAAI,IAAI,MAAM,WAAW,YAAY,IAAI;AAAA,MAC3C,EAAE,IAAI,IAAI,MAAM,YAAY,YAAY,IAAI;AAAA,IAC9C,CAAC;AAED,UAAM,SAAS,MAAM,aAAa,+BAA+B;AAAA,MAC/D,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC;AAED,WAAO,qCAAqC,EAAE,qBAAqB,aAAa,KAAK;AACrF,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU;AAAA,UACR,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,eAAe;AAAA,QACjB;AAAA,QACA,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,aAAa,CAAC,MAAM,QAAQ,aAAa;AAAA,QACzC,MAAM,CAAC,CAAC,IAAI,YAAY,GAAG,CAAC;AAAA,MAC9B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,oEAAoE,YAAY;AACjF,oBAAgB,kBAAkB,EAAE,IAAI,IAAI,MAAM,SAAS,OAAO,KAAK,CAAC;AACxE,iBAAa,kBAAkB,EAAE,IAAI,GAAG,MAAM,QAAQ,MAAM,KAAK,CAAC;AAClE,mBAAe,kBAAkB,EAAE,IAAI,KAAK,MAAM,UAAU,aAAa,KAAK,CAAC;AAC/E,iCAA6B,kBAAkB;AAAA,MAC7C,EAAE,IAAI,IAAI,MAAM,YAAY,OAAO,WAAW,OAAO,KAAK;AAAA,IAC5D,CAAC;AACD,eAAW,kBAAkB,EAAE,IAAI,KAAK,MAAM,aAAa,KAAK,KAAK,CAAC;AAEtE,UAAM,WAAW,MAAM,aAAa,mBAAmB,EAAE,WAAW,aAAa,YAAY,KAAK,CAAC;AACnG,UAAM,QAAQ,MAAM,aAAa,gBAAgB,EAAE,WAAW,aAAa,SAAS,IAAI,CAAC;AACzF,UAAM,UAAU,MAAM,aAAa,kBAAkB,EAAE,WAAW,aAAa,WAAW,MAAM,CAAC;AACjG,UAAM,iBAAiB,MAAM,aAAa,gCAAgC;AAAA,MACxE,WAAW;AAAA,MACX,WAAW;AAAA,IACb,CAAC;AACD,UAAM,MAAM,MAAM,aAAa,cAAc,EAAE,WAAW,aAAa,OAAO,MAAM,CAAC;AAErF,WAAO,eAAe,EAAE,qBAAqB,aAAa,IAAI;AAC9D,WAAO,YAAY,EAAE,qBAAqB,aAAa,GAAG;AAC1D,WAAO,cAAc,EAAE,qBAAqB,aAAa,KAAK;AAC9D,WAAO,4BAA4B,EAAE,qBAAqB,aAAa,KAAK;AAC5E,WAAO,UAAU,EAAE,qBAAqB,aAAa,KAAK;AAC1D,WAAO,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,OAAO,EAAE,YAAY,aAAa,aAAa,MAAM,UAAU,EAAE,IAAI,IAAI,MAAM,QAAQ,EAAE,EAAE,CAAC;AACvI,WAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,OAAO,EAAE,YAAY,aAAa,UAAU,KAAK,OAAO,EAAE,IAAI,GAAG,MAAM,OAAO,EAAE,EAAE,CAAC;AAC3H,WAAO,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,OAAO,EAAE,YAAY,aAAa,YAAY,OAAO,SAAS,EAAE,IAAI,KAAK,MAAM,SAAS,EAAE,EAAE,CAAC;AACvI,WAAO,cAAc,EAAE,QAAQ;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,gBAAgB,CAAC,EAAE,IAAI,IAAI,MAAM,YAAY,OAAO,UAAU,CAAC;AAAA,MACjE;AAAA,IACF,CAAC;AACD,WAAO,GAAG,EAAE,QAAQ,EAAE,MAAM,UAAU,OAAO,EAAE,YAAY,aAAa,QAAQ,OAAO,KAAK,EAAE,IAAI,KAAK,MAAM,YAAY,EAAE,EAAE,CAAC;AAAA,EAChI,CAAC;AAED,KAAG,yEAAyE,YAAY;AACtF,qBAAiB,kBAAkB,EAAE,YAAY,CAAC,KAAK,GAAG,GAAG,OAAO,EAAE,CAAC;AACvE,+BAA2B,kBAAkB;AAAA,MAC3C,OAAO;AAAA,QACL;AAAA,UACE,WAAW;AAAA,UACX,aAAa;AAAA,UACb,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,kBAAkB;AAAA,QACpB;AAAA,QACA;AAAA,UACE,WAAW;AAAA,UACX,aAAa;AAAA,UACb,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,kBAAkB;AAAA,QACpB;AAAA,QACA;AAAA,UACE,WAAW;AAAA,UACX,aAAa;AAAA,UACb,OAAO;AAAA,UACP,SAAS;AAAA,UACT,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AACD,0BAAsB,kBAAkB;AAAA,MACtC,EAAE,IAAI,KAAK,MAAM,aAAa,UAAU,MAAM,OAAO,SAAS;AAAA,MAC9D,EAAE,IAAI,KAAK,MAAM,aAAa,UAAU,OAAO,OAAO,SAAS;AAAA,IACjE,CAAC;AAED,UAAM,WAAW,MAAM,aAAa,oBAAoB;AAAA,MACtD,WAAW;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AACD,UAAM,mBAAmB,MAAM,aAAa,8BAA8B;AAAA,MACxE,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,OAAO,MAAM,aAAa,yBAAyB,EAAE,WAAW,aAAa,WAAW,MAAM,CAAC;AAErG,WAAO,gBAAgB,EAAE,qBAAqB,aAAa,GAAG,GAAG,QAAQ;AACzE,WAAO,0BAA0B,EAAE,qBAAqB,aAAa,MAAM,IAAI,EAAE;AACjF,WAAO,QAAQ,EAAE,QAAQ;AAAA,MACvB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU;AAAA,UACR,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QACA,YAAY;AAAA,QACZ,aAAa,CAAC,YAAY;AAAA,QAC1B,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;AAAA,MACrB;AAAA,IACF,CAAC;AACD,WAAO,gBAAgB,EAAE,QAAQ;AAAA,MAC/B,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU;AAAA,UACR,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QACA,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAM;AAAA,UACJ,CAAC,OAAO,UAAU,QAAQ,GAAG,MAAM,SAAS;AAAA,UAC5C,CAAC,OAAO,SAAS,QAAQ,GAAG,OAAO,SAAS;AAAA,UAC5C,CAAC,OAAO,eAAe,QAAQ,GAAG,MAAM,QAAQ;AAAA,QAClD;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,IAAI,EAAE,QAAQ;AAAA,MACnB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,MAAM;AAAA,QACnD,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,aAAa,CAAC,MAAM,QAAQ,aAAa,QAAQ;AAAA,QACjD,MAAM;AAAA,UACJ,CAAC,KAAK,aAAa,MAAM,QAAQ;AAAA,UACjC,CAAC,KAAK,aAAa,OAAO,QAAQ;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
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") ?? params.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
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yoryoboy/bi-mcp",
3
3
  "type": "module",
4
- "version": "1.14.2",
4
+ "version": "1.14.3",
5
5
  "description": "MCP server: bi-mcp",
6
6
  "author": "",
7
7
  "license": "MIT",