@yoryoboy/bi-mcp 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +126 -9
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/index.js +30 -0
  4. package/dist/index.js.map +2 -2
  5. package/dist/mcp-use.json +2 -2
  6. package/dist/scripts/_helpers.js +44 -0
  7. package/dist/scripts/_helpers.js.map +7 -0
  8. package/dist/scripts/admin-profile-delete.js +72 -0
  9. package/dist/scripts/admin-profile-delete.js.map +7 -0
  10. package/dist/scripts/admin-profile-list.js +24 -0
  11. package/dist/scripts/admin-profile-list.js.map +7 -0
  12. package/dist/scripts/admin-profile-upsert.js +25 -0
  13. package/dist/scripts/admin-profile-upsert.js.map +7 -0
  14. package/dist/scripts/admin-vtex-list.js +28 -0
  15. package/dist/scripts/admin-vtex-list.js.map +7 -0
  16. package/dist/scripts/admin-vtex-upsert.js +73 -0
  17. package/dist/scripts/admin-vtex-upsert.js.map +7 -0
  18. package/dist/scripts/admin-vtex-validate.js +55 -0
  19. package/dist/scripts/admin-vtex-validate.js.map +7 -0
  20. package/dist/scripts/run-migrations.js +50 -0
  21. package/dist/scripts/run-migrations.js.map +7 -0
  22. package/dist/scripts/test-db-connection.js +19 -0
  23. package/dist/scripts/test-db-connection.js.map +7 -0
  24. package/dist/src/config/profile-store.js +86 -0
  25. package/dist/src/config/profile-store.js.map +7 -0
  26. package/dist/src/config/vtex-crypto.js +43 -0
  27. package/dist/src/config/vtex-crypto.js.map +7 -0
  28. package/dist/src/config/vtex-profile-store.js +132 -0
  29. package/dist/src/config/vtex-profile-store.js.map +7 -0
  30. package/dist/src/config/vtex.js +27 -21
  31. package/dist/src/config/vtex.js.map +2 -2
  32. package/dist/src/db/client.js +58 -0
  33. package/dist/src/db/client.js.map +7 -0
  34. package/dist/src/services/vtex/vtex-api.js +24 -8
  35. package/dist/src/services/vtex/vtex-api.js.map +2 -2
  36. package/dist/src/services/vtex/vtex-catalog.js +5 -3
  37. package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
  38. package/dist/src/services/vtex/vtex-logistics.js +18 -9
  39. package/dist/src/services/vtex/vtex-logistics.js.map +2 -2
  40. package/dist/src/services/vtex/vtex-orders.js +13 -7
  41. package/dist/src/services/vtex/vtex-orders.js.map +2 -2
  42. package/dist/src/services/vtex/vtex-pricing.js +5 -3
  43. package/dist/src/services/vtex/vtex-pricing.js.map +2 -2
  44. package/dist/src/tools/config/check-database-connection.js +59 -0
  45. package/dist/src/tools/config/check-database-connection.js.map +7 -0
  46. package/dist/src/tools/config/index.js +3 -0
  47. package/dist/src/tools/config/index.js.map +7 -0
  48. package/dist/src/tools/config/list-profiles.js +26 -0
  49. package/dist/src/tools/config/list-profiles.js.map +7 -0
  50. package/dist/src/tools/index.js +1 -0
  51. package/dist/src/tools/index.js.map +2 -2
  52. package/dist/src/tools/vtex/computed-price.js +12 -1
  53. package/dist/src/tools/vtex/computed-price.js.map +2 -2
  54. package/dist/src/tools/vtex/index.js +1 -0
  55. package/dist/src/tools/vtex/index.js.map +2 -2
  56. package/dist/src/tools/vtex/inventory-check.js +15 -2
  57. package/dist/src/tools/vtex/inventory-check.js.map +2 -2
  58. package/dist/src/tools/vtex/order-details.js +16 -2
  59. package/dist/src/tools/vtex/order-details.js.map +2 -2
  60. package/dist/src/tools/vtex/orders-summary.js +11 -1
  61. package/dist/src/tools/vtex/orders-summary.js.map +2 -2
  62. package/dist/src/tools/vtex/product-offers.js +15 -2
  63. package/dist/src/tools/vtex/product-offers.js.map +2 -2
  64. package/dist/src/tools/vtex/profile-resolution.js +57 -0
  65. package/dist/src/tools/vtex/profile-resolution.js.map +7 -0
  66. package/dist/src/tools/vtex/sku-offers.js +16 -2
  67. package/dist/src/tools/vtex/sku-offers.js.map +2 -2
  68. package/dist/src/tools/vtex/sku-price.js +12 -2
  69. package/dist/src/tools/vtex/sku-price.js.map +2 -2
  70. package/dist/src/tools/vtex/update-inventory.js +12 -1
  71. package/dist/src/tools/vtex/update-inventory.js.map +2 -2
  72. package/dist/src/tools/vtex/update-lead-time.js +12 -1
  73. package/dist/src/tools/vtex/update-lead-time.js.map +2 -2
  74. package/dist/src/tools/vtex/warehouse-inventory.js +12 -1
  75. package/dist/src/tools/vtex/warehouse-inventory.js.map +2 -2
  76. package/package.json +12 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/vtex/update-lead-time.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport { updateInventoryLeadTime } from \"../../services/vtex/vtex-logistics.js\";\n\nexport const updateLeadTimeSchema = z.object({\n skuId: z.string().min(1).describe(\"SKU identifier\"),\n warehouseId: z.string().min(1).describe(\"Warehouse identifier\"),\n leadTime: z\n .string()\n .min(1)\n .describe(\"Lead time value for the SKU in VTEX expected format (e.g. 1.00:00:00)\"),\n});\n\nexport async function updateLeadTimeHandler({\n skuId,\n warehouseId,\n leadTime,\n}: z.infer<typeof updateLeadTimeSchema>) {\n try {\n await updateInventoryLeadTime(skuId, warehouseId, { leadTime });\n\n return object({\n success: true,\n sku_id: skuId,\n warehouse_id: warehouseId,\n lead_time: leadTime,\n message: \"Lead time updated successfully\",\n });\n } catch (err) {\n return error(formatVtexError(err, `Failed to update lead time for SKU ${skuId} in ${warehouseId}`));\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AAEjC,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,gBAAgB;AAAA,EAClD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,sBAAsB;AAAA,EAC9D,UAAU,EACP,OAAO,EACP,IAAI,CAAC,EACL,SAAS,uEAAuE;AACrF,CAAC;AAED,eAAsB,sBAAsB;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,MAAI;AACF,UAAM,wBAAwB,OAAO,aAAa,EAAE,SAAS,CAAC;AAE9D,WAAO,OAAO;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,sCAAsC,KAAK,OAAO,WAAW,EAAE,CAAC;AAAA,EACpG;AACF;",
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport { updateInventoryLeadTime } from \"../../services/vtex/vtex-logistics.js\";\nimport { resolveVtexProfileOrSelection } from \"./profile-resolution.js\";\n\nexport const updateLeadTimeSchema = z.object({\n profileId: 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 skuId: z.string().min(1).describe(\"SKU identifier\"),\n warehouseId: z.string().min(1).describe(\"Warehouse identifier\"),\n leadTime: z\n .string()\n .min(1)\n .describe(\"Lead time value for the SKU in VTEX expected format (e.g. 1.00:00:00)\"),\n});\n\nexport async function updateLeadTimeHandler({\n profileId,\n skuId,\n warehouseId,\n leadTime,\n}: z.infer<typeof updateLeadTimeSchema>) {\n try {\n const profileResolution = await resolveVtexProfileOrSelection(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n await updateInventoryLeadTime(resolvedProfileId, skuId, warehouseId, { leadTime });\n\n return object({\n success: true,\n profile_id: resolvedProfileId,\n sku_id: skuId,\n warehouse_id: warehouseId,\n lead_time: leadTime,\n message: \"Lead time updated successfully\",\n });\n } catch (err) {\n return error(formatVtexError(err, `Failed to update lead time for SKU ${skuId} in ${warehouseId}`));\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,qCAAqC;AAEvC,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,WAAW,EACR,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,gBAAgB;AAAA,EAClD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,sBAAsB;AAAA,EAC9D,UAAU,EACP,OAAO,EACP,IAAI,CAAC,EACL,SAAS,uEAAuE;AACrF,CAAC;AAED,eAAsB,sBAAsB;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,MAAI;AACF,UAAM,oBAAoB,MAAM,8BAA8B,SAAS;AACvE,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,oBAAoB,kBAAkB,MAAM;AAClD,UAAM,wBAAwB,mBAAmB,OAAO,aAAa,EAAE,SAAS,CAAC;AAEjF,WAAO,OAAO;AAAA,MACZ,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,sCAAsC,KAAK,OAAO,WAAW,EAAE,CAAC;AAAA,EACpG;AACF;",
6
6
  "names": []
7
7
  }
@@ -3,16 +3,26 @@ import { z } from "zod";
3
3
  import { formatVtexError } from "../../services/vtex/vtex-api.js";
4
4
  import { getInventoryByWarehouse } from "../../services/vtex/vtex-logistics.js";
5
5
  import { stripNulls } from "../../utils/strip-payload.js";
6
+ import { resolveVtexProfileOrSelection } from "./profile-resolution.js";
6
7
  const warehouseInventorySchema = z.object({
8
+ profileId: z.string().trim().min(1).optional().describe(
9
+ "Explicit VTEX profile id to use. If omitted, the tool returns a guided selection payload with available active profiles."
10
+ ),
7
11
  skuId: z.string().min(1).describe("SKU identifier"),
8
12
  warehouseId: z.string().min(1).describe("Warehouse identifier")
9
13
  });
10
14
  async function warehouseInventoryHandler({
15
+ profileId,
11
16
  skuId,
12
17
  warehouseId
13
18
  }) {
14
19
  try {
15
- const inventory = await getInventoryByWarehouse(skuId, warehouseId);
20
+ const profileResolution = await resolveVtexProfileOrSelection(profileId);
21
+ if (!profileResolution.ok) {
22
+ return profileResolution.response;
23
+ }
24
+ const resolvedProfileId = profileResolution.value.profileId;
25
+ const inventory = await getInventoryByWarehouse(resolvedProfileId, skuId, warehouseId);
16
26
  const normalizedInventory = inventory.map((item) => ({
17
27
  sku_id: item.skuId,
18
28
  warehouse_id: item.warehouseId,
@@ -24,6 +34,7 @@ async function warehouseInventoryHandler({
24
34
  }));
25
35
  return object(
26
36
  stripNulls({
37
+ profile_id: resolvedProfileId,
27
38
  sku_id: skuId,
28
39
  warehouse_id: warehouseId,
29
40
  inventory: normalizedInventory
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/vtex/warehouse-inventory.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport { getInventoryByWarehouse } from \"../../services/vtex/vtex-logistics.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nexport const warehouseInventorySchema = z.object({\n skuId: z.string().min(1).describe(\"SKU identifier\"),\n warehouseId: z.string().min(1).describe(\"Warehouse identifier\"),\n});\n\nexport async function warehouseInventoryHandler({\n skuId,\n warehouseId,\n}: z.infer<typeof warehouseInventorySchema>) {\n try {\n const inventory = await getInventoryByWarehouse(skuId, warehouseId);\n\n const normalizedInventory = inventory.map((item) => ({\n sku_id: item.skuId,\n warehouse_id: item.warehouseId,\n total_quantity: item.totalQuantity,\n reserved_quantity: item.reservedQuantity,\n available_quantity: item.availableQuantity,\n is_unlimited: item.isUnlimited,\n keep_selling_after_expiration: item.keepSellingAfterExpiration,\n }));\n\n return object(\n stripNulls({\n sku_id: skuId,\n warehouse_id: warehouseId,\n inventory: normalizedInventory,\n })\n );\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to fetch inventory for SKU ${skuId} in warehouse ${warehouseId}`)\n );\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,kBAAkB;AAEpB,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,gBAAgB;AAAA,EAClD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,sBAAsB;AAChE,CAAC;AAED,eAAsB,0BAA0B;AAAA,EAC9C;AAAA,EACA;AACF,GAA6C;AAC3C,MAAI;AACF,UAAM,YAAY,MAAM,wBAAwB,OAAO,WAAW;AAElE,UAAM,sBAAsB,UAAU,IAAI,CAAC,UAAU;AAAA,MACnD,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,gBAAgB,KAAK;AAAA,MACrB,mBAAmB,KAAK;AAAA,MACxB,oBAAoB,KAAK;AAAA,MACzB,cAAc,KAAK;AAAA,MACnB,+BAA+B,KAAK;AAAA,IACtC,EAAE;AAEF,WAAO;AAAA,MACL,WAAW;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,gBAAgB,KAAK,qCAAqC,KAAK,iBAAiB,WAAW,EAAE;AAAA,IAC/F;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport { getInventoryByWarehouse } from \"../../services/vtex/vtex-logistics.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { resolveVtexProfileOrSelection } from \"./profile-resolution.js\";\n\nexport const warehouseInventorySchema = z.object({\n profileId: 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 skuId: z.string().min(1).describe(\"SKU identifier\"),\n warehouseId: z.string().min(1).describe(\"Warehouse identifier\"),\n});\n\nexport async function warehouseInventoryHandler({\n profileId,\n skuId,\n warehouseId,\n}: z.infer<typeof warehouseInventorySchema>) {\n try {\n const profileResolution = await resolveVtexProfileOrSelection(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const inventory = await getInventoryByWarehouse(resolvedProfileId, skuId, warehouseId);\n\n const normalizedInventory = inventory.map((item) => ({\n sku_id: item.skuId,\n warehouse_id: item.warehouseId,\n total_quantity: item.totalQuantity,\n reserved_quantity: item.reservedQuantity,\n available_quantity: item.availableQuantity,\n is_unlimited: item.isUnlimited,\n keep_selling_after_expiration: item.keepSellingAfterExpiration,\n }));\n\n return object(\n stripNulls({\n profile_id: resolvedProfileId,\n sku_id: skuId,\n warehouse_id: warehouseId,\n inventory: normalizedInventory,\n })\n );\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to fetch inventory for SKU ${skuId} in warehouse ${warehouseId}`)\n );\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,kBAAkB;AAC3B,SAAS,qCAAqC;AAEvC,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,WAAW,EACR,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,gBAAgB;AAAA,EAClD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,sBAAsB;AAChE,CAAC;AAED,eAAsB,0BAA0B;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF,GAA6C;AAC3C,MAAI;AACF,UAAM,oBAAoB,MAAM,8BAA8B,SAAS;AACvE,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,oBAAoB,kBAAkB,MAAM;AAClD,UAAM,YAAY,MAAM,wBAAwB,mBAAmB,OAAO,WAAW;AAErF,UAAM,sBAAsB,UAAU,IAAI,CAAC,UAAU;AAAA,MACnD,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,gBAAgB,KAAK;AAAA,MACrB,mBAAmB,KAAK;AAAA,MACxB,oBAAoB,KAAK;AAAA,MACzB,cAAc,KAAK;AAAA,MACnB,+BAA+B,KAAK;AAAA,IACtC,EAAE;AAEF,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,gBAAgB,KAAK,qCAAqC,KAAK,iBAAiB,WAAW,EAAE;AAAA,IAC/F;AAAA,EACF;AACF;",
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.1.0",
4
+ "version": "1.2.0",
5
5
  "description": "MCP server: bi-mcp",
6
6
  "author": "",
7
7
  "license": "MIT",
@@ -36,6 +36,7 @@
36
36
  "cors": "^2.8.6",
37
37
  "express": "^5.2.1",
38
38
  "mcp-use": "^1.22.3",
39
+ "pg": "^8.20.0",
39
40
  "react": "^19.2.4",
40
41
  "react-dom": "^19.2.4",
41
42
  "react-router": "^7.13.0",
@@ -45,6 +46,7 @@
45
46
  "devDependencies": {
46
47
  "@tailwindcss/vite": "^4.2.0",
47
48
  "@types/node": "^25.3.0",
49
+ "@types/pg": "^8.20.0",
48
50
  "@types/react": "^19.2.14",
49
51
  "@types/react-dom": "^19.2.3",
50
52
  "@vitejs/plugin-react": "^5.1.4",
@@ -61,6 +63,14 @@
61
63
  "build": "mcp-use build",
62
64
  "dev": "mcp-use dev",
63
65
  "start": "mcp-use start",
64
- "deploy": "mcp-use deploy"
66
+ "deploy": "mcp-use deploy",
67
+ "db:test": "pnpm exec tsx scripts/test-db-connection.ts",
68
+ "db:migrate": "pnpm exec tsx scripts/run-migrations.ts",
69
+ "admin:profile-upsert": "pnpm exec tsx scripts/admin-profile-upsert.ts",
70
+ "admin:profile-list": "pnpm exec tsx scripts/admin-profile-list.ts",
71
+ "admin:profile-delete": "pnpm exec tsx scripts/admin-profile-delete.ts",
72
+ "admin:vtex-upsert": "pnpm exec tsx scripts/admin-vtex-upsert.ts",
73
+ "admin:vtex-validate": "pnpm exec tsx scripts/admin-vtex-validate.ts",
74
+ "admin:vtex-list": "pnpm exec tsx scripts/admin-vtex-list.ts"
65
75
  }
66
76
  }