@unchainedshop/api 4.0.0-rc.10 → 4.0.0-rc.11

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 (166) hide show
  1. package/lib/mcp/index.d.ts.map +1 -1
  2. package/lib/mcp/index.js +6 -0
  3. package/lib/mcp/index.js.map +1 -1
  4. package/lib/mcp/tools/delivery/createDeliveryProviderHandler.d.ts +44 -0
  5. package/lib/mcp/tools/delivery/createDeliveryProviderHandler.d.ts.map +1 -0
  6. package/lib/mcp/tools/delivery/createDeliveryProviderHandler.js +50 -0
  7. package/lib/mcp/tools/delivery/createDeliveryProviderHandler.js.map +1 -0
  8. package/lib/mcp/tools/delivery/deliveryInterfacesHandler.d.ts +20 -0
  9. package/lib/mcp/tools/delivery/deliveryInterfacesHandler.d.ts.map +1 -0
  10. package/lib/mcp/tools/delivery/deliveryInterfacesHandler.js +45 -0
  11. package/lib/mcp/tools/delivery/deliveryInterfacesHandler.js.map +1 -0
  12. package/lib/mcp/tools/delivery/deliveryProvider.d.ts +20 -0
  13. package/lib/mcp/tools/delivery/deliveryProvider.d.ts.map +1 -0
  14. package/lib/mcp/tools/delivery/deliveryProvider.js +43 -0
  15. package/lib/mcp/tools/delivery/deliveryProvider.js.map +1 -0
  16. package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.d.ts +20 -0
  17. package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.d.ts.map +1 -0
  18. package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.js +36 -0
  19. package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.js.map +1 -0
  20. package/lib/mcp/tools/delivery/deliveryProvidersListHandler.d.ts +24 -0
  21. package/lib/mcp/tools/delivery/deliveryProvidersListHandler.d.ts.map +1 -0
  22. package/lib/mcp/tools/delivery/deliveryProvidersListHandler.js +44 -0
  23. package/lib/mcp/tools/delivery/deliveryProvidersListHandler.js.map +1 -0
  24. package/lib/mcp/tools/delivery/index.d.ts +4 -0
  25. package/lib/mcp/tools/delivery/index.d.ts.map +1 -0
  26. package/lib/mcp/tools/delivery/index.js +17 -0
  27. package/lib/mcp/tools/delivery/index.js.map +1 -0
  28. package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.d.ts +20 -0
  29. package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.d.ts.map +1 -0
  30. package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.js +37 -0
  31. package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.js.map +1 -0
  32. package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.d.ts +96 -0
  33. package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.d.ts.map +1 -0
  34. package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.js +54 -0
  35. package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.js.map +1 -0
  36. package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.d.ts +36 -0
  37. package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.d.ts.map +1 -0
  38. package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.js +89 -0
  39. package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.js.map +1 -0
  40. package/lib/mcp/tools/order/getSalesSummaryHandler.d.ts +40 -0
  41. package/lib/mcp/tools/order/getSalesSummaryHandler.d.ts.map +1 -0
  42. package/lib/mcp/tools/order/getSalesSummaryHandler.js +90 -0
  43. package/lib/mcp/tools/order/getSalesSummaryHandler.js.map +1 -0
  44. package/lib/mcp/tools/order/getTopCustomersHandler.d.ts +52 -0
  45. package/lib/mcp/tools/order/getTopCustomersHandler.d.ts.map +1 -0
  46. package/lib/mcp/tools/order/getTopCustomersHandler.js +111 -0
  47. package/lib/mcp/tools/order/getTopCustomersHandler.js.map +1 -0
  48. package/lib/mcp/tools/order/getTopSellingProductsHandler.d.ts +28 -0
  49. package/lib/mcp/tools/order/getTopSellingProductsHandler.d.ts.map +1 -0
  50. package/lib/mcp/tools/order/getTopSellingProductsHandler.js +99 -0
  51. package/lib/mcp/tools/order/getTopSellingProductsHandler.js.map +1 -0
  52. package/lib/mcp/tools/order/index.d.ts +4 -0
  53. package/lib/mcp/tools/order/index.d.ts.map +1 -0
  54. package/lib/mcp/tools/order/index.js +13 -0
  55. package/lib/mcp/tools/order/index.js.map +1 -0
  56. package/lib/mcp/tools/order/ordersListHandler.d.ts +108 -0
  57. package/lib/mcp/tools/order/ordersListHandler.d.ts.map +1 -0
  58. package/lib/mcp/tools/order/ordersListHandler.js +91 -0
  59. package/lib/mcp/tools/order/ordersListHandler.js.map +1 -0
  60. package/lib/mcp/tools/payment/createPaymentProviderHandler.d.ts.map +1 -1
  61. package/lib/mcp/tools/payment/createPaymentProviderHandler.js +5 -2
  62. package/lib/mcp/tools/payment/createPaymentProviderHandler.js.map +1 -1
  63. package/lib/mcp/tools/payment/index.js +1 -1
  64. package/lib/mcp/tools/payment/index.js.map +1 -1
  65. package/lib/mcp/tools/payment/paymentInterfacesHandler.d.ts +2 -2
  66. package/lib/mcp/tools/payment/paymentInterfacesHandler.d.ts.map +1 -1
  67. package/lib/mcp/tools/payment/paymentInterfacesHandler.js +7 -5
  68. package/lib/mcp/tools/payment/paymentInterfacesHandler.js.map +1 -1
  69. package/lib/mcp/tools/payment/paymentProviderByIdHandler.js +1 -1
  70. package/lib/mcp/tools/payment/paymentProviderByIdHandler.js.map +1 -1
  71. package/lib/mcp/tools/payment/paymentProvidersListHandler.d.ts +4 -0
  72. package/lib/mcp/tools/payment/paymentProvidersListHandler.d.ts.map +1 -1
  73. package/lib/mcp/tools/payment/paymentProvidersListHandler.js +12 -3
  74. package/lib/mcp/tools/payment/paymentProvidersListHandler.js.map +1 -1
  75. package/lib/mcp/tools/payment/removePaymentProviderHandler.d.ts.map +1 -1
  76. package/lib/mcp/tools/payment/removePaymentProviderHandler.js +5 -4
  77. package/lib/mcp/tools/payment/removePaymentProviderHandler.js.map +1 -1
  78. package/lib/mcp/tools/payment/updatePaymentProviderHandler.d.ts +66 -10
  79. package/lib/mcp/tools/payment/updatePaymentProviderHandler.d.ts.map +1 -1
  80. package/lib/mcp/tools/payment/updatePaymentProviderHandler.js +18 -3
  81. package/lib/mcp/tools/payment/updatePaymentProviderHandler.js.map +1 -1
  82. package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.d.ts +44 -0
  83. package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.d.ts.map +1 -0
  84. package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.js +48 -0
  85. package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.js.map +1 -0
  86. package/lib/mcp/tools/warehousing/index.d.ts +4 -0
  87. package/lib/mcp/tools/warehousing/index.d.ts.map +1 -0
  88. package/lib/mcp/tools/warehousing/index.js +17 -0
  89. package/lib/mcp/tools/warehousing/index.js.map +1 -0
  90. package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.d.ts +20 -0
  91. package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.d.ts.map +1 -0
  92. package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.js +39 -0
  93. package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.js.map +1 -0
  94. package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.d.ts +96 -0
  95. package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.d.ts.map +1 -0
  96. package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.js +58 -0
  97. package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.js.map +1 -0
  98. package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.d.ts +20 -0
  99. package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.d.ts.map +1 -0
  100. package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.js +45 -0
  101. package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.js.map +1 -0
  102. package/lib/mcp/tools/warehousing/warehousingProviderHandler.d.ts +20 -0
  103. package/lib/mcp/tools/warehousing/warehousingProviderHandler.d.ts.map +1 -0
  104. package/lib/mcp/tools/warehousing/warehousingProviderHandler.js +45 -0
  105. package/lib/mcp/tools/warehousing/warehousingProviderHandler.js.map +1 -0
  106. package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.d.ts +20 -0
  107. package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.d.ts.map +1 -0
  108. package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.js +36 -0
  109. package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.js.map +1 -0
  110. package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.d.ts +24 -0
  111. package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.d.ts.map +1 -0
  112. package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.js +44 -0
  113. package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.js.map +1 -0
  114. package/lib/mcp/utils/orderFilters.d.ts +22 -0
  115. package/lib/mcp/utils/orderFilters.d.ts.map +1 -0
  116. package/lib/mcp/utils/orderFilters.js +34 -0
  117. package/lib/mcp/utils/orderFilters.js.map +1 -0
  118. package/lib/mcp/utils/sharedSchemas.d.ts +11 -0
  119. package/lib/mcp/utils/sharedSchemas.d.ts.map +1 -0
  120. package/lib/mcp/utils/sharedSchemas.js +11 -0
  121. package/lib/mcp/utils/sharedSchemas.js.map +1 -0
  122. package/lib/resolvers/queries/orders/orders.d.ts.map +1 -1
  123. package/lib/resolvers/queries/orders/orders.js +33 -4
  124. package/lib/resolvers/queries/orders/orders.js.map +1 -1
  125. package/lib/resolvers/queries/orders/ordersCount.d.ts.map +1 -1
  126. package/lib/resolvers/queries/orders/ordersCount.js +29 -1
  127. package/lib/resolvers/queries/orders/ordersCount.js.map +1 -1
  128. package/lib/schema/query.d.ts.map +1 -1
  129. package/lib/schema/query.js +11 -1
  130. package/lib/schema/query.js.map +1 -1
  131. package/package.json +1 -1
  132. package/src/mcp/index.ts +6 -1
  133. package/src/mcp/tools/delivery/createDeliveryProviderHandler.ts +62 -0
  134. package/src/mcp/tools/delivery/deliveryInterfacesHandler.ts +56 -0
  135. package/src/mcp/tools/delivery/deliveryProvider.ts +51 -0
  136. package/src/mcp/tools/delivery/deliveryProvidersCountHandler.ts +46 -0
  137. package/src/mcp/tools/delivery/deliveryProvidersListHandler.ts +54 -0
  138. package/src/mcp/tools/delivery/index.ts +74 -0
  139. package/src/mcp/tools/delivery/removeDeliveryProviderHandler.ts +45 -0
  140. package/src/mcp/tools/delivery/updateDeliveryProviderHandler.ts +68 -0
  141. package/src/mcp/tools/order/getMonthlySalesBreakdownHandler.ts +106 -0
  142. package/src/mcp/tools/order/getSalesSummaryHandler.ts +103 -0
  143. package/src/mcp/tools/order/getTopCustomersHandler.ts +123 -0
  144. package/src/mcp/tools/order/getTopSellingProductsHandler.ts +112 -0
  145. package/src/mcp/tools/order/index.ts +50 -0
  146. package/src/mcp/tools/order/ordersListHandler.ts +119 -0
  147. package/src/mcp/tools/payment/createPaymentProviderHandler.ts +7 -2
  148. package/src/mcp/tools/payment/index.ts +1 -1
  149. package/src/mcp/tools/payment/paymentInterfacesHandler.ts +13 -10
  150. package/src/mcp/tools/payment/paymentProviderByIdHandler.ts +1 -1
  151. package/src/mcp/tools/payment/paymentProvidersListHandler.ts +14 -4
  152. package/src/mcp/tools/payment/removePaymentProviderHandler.ts +6 -8
  153. package/src/mcp/tools/payment/updatePaymentProviderHandler.ts +23 -4
  154. package/src/mcp/tools/warehousing/createWarehousingProviderHandler.ts +61 -0
  155. package/src/mcp/tools/warehousing/index.ts +81 -0
  156. package/src/mcp/tools/warehousing/removeWarehousingProviderHandler.ts +46 -0
  157. package/src/mcp/tools/warehousing/updateWarehousingProviderHandler.ts +72 -0
  158. package/src/mcp/tools/warehousing/warehousingInterfacesHandler.ts +58 -0
  159. package/src/mcp/tools/warehousing/warehousingProviderHandler.ts +55 -0
  160. package/src/mcp/tools/warehousing/warehousingProvidersCountHandler.ts +46 -0
  161. package/src/mcp/tools/warehousing/warehousingProvidersListHandler.ts +55 -0
  162. package/src/mcp/utils/orderFilters.ts +52 -0
  163. package/src/mcp/utils/sharedSchemas.ts +12 -0
  164. package/src/resolvers/queries/orders/orders.ts +46 -5
  165. package/src/resolvers/queries/orders/ordersCount.ts +42 -1
  166. package/src/schema/query.ts +11 -1
@@ -0,0 +1,119 @@
1
+ import { z } from 'zod';
2
+ import { Context } from '../../../context.js';
3
+ import { log } from '@unchainedshop/logger';
4
+ import { PaymentProviderType } from '@unchainedshop/core-payment';
5
+ import { DeliveryProviderType } from '@unchainedshop/core-delivery';
6
+ import { resolveOrderFilters } from '../../utils/orderFilters.js';
7
+
8
+ const OrderStatusEnum = z.enum(['PENDING', 'CONFIRMED', 'SHIPPED', 'DELIVERED', 'CANCELLED']);
9
+ const PaymentProviderTypeEnum = z.enum(['CARD', 'INVOICE', 'GENERIC']);
10
+ const DeliveryProviderTypeEnum = z.enum(['PICKUP', 'SHIPPING', 'LOCAL']);
11
+ const SortDirectionEnum = z.enum(['ASC', 'DESC']);
12
+
13
+ const SortOptionInput = z.object({
14
+ key: z.string().min(1).describe('Field to sort by'),
15
+ value: SortDirectionEnum.describe('Sort direction'),
16
+ });
17
+
18
+ const DateFilterInput = z.object({
19
+ from: z.string().datetime().optional().describe('Start date (ISO format)'),
20
+ to: z.string().datetime().optional().describe('End date (ISO format)'),
21
+ });
22
+
23
+ export const OrdersListSchema = {
24
+ limit: z.number().int().min(1).max(100).default(10),
25
+ offset: z.number().int().min(0).default(0),
26
+ includeCarts: z.boolean().default(false),
27
+ queryString: z.string().optional(),
28
+ status: z.array(OrderStatusEnum).optional(),
29
+ sort: z.array(SortOptionInput).optional(),
30
+ paymentProviderTypes: z.array(PaymentProviderTypeEnum).optional(),
31
+ deliveryProviderTypes: z.array(DeliveryProviderTypeEnum).optional(),
32
+ paymentProviderIds: z.array(z.string().min(1)).optional(),
33
+ deliveryProviderIds: z.array(z.string().min(1)).optional(),
34
+ dateRange: DateFilterInput.optional(),
35
+ };
36
+
37
+ export const OrdersListZodSchema = z.object(OrdersListSchema);
38
+ export type OrdersListParams = z.infer<typeof OrdersListZodSchema>;
39
+
40
+ export async function ordersListHandler(context: Context, params: OrdersListParams) {
41
+ const { modules, userId } = context;
42
+
43
+ try {
44
+ log('handler ordersListHandler', { userId, params });
45
+
46
+ const {
47
+ paymentProviderTypes,
48
+ deliveryProviderTypes,
49
+ paymentProviderIds = [],
50
+ deliveryProviderIds = [],
51
+ ...restParams
52
+ } = params;
53
+
54
+ const resolvedPaymentProviderIds = new Set(paymentProviderIds);
55
+ const resolvedDeliveryProviderIds = new Set(deliveryProviderIds);
56
+
57
+ const lookups: Promise<void>[] = [];
58
+
59
+ if (paymentProviderTypes?.length) {
60
+ lookups.push(
61
+ modules.payment.paymentProviders
62
+ .findProviders({ type: { $in: paymentProviderTypes as PaymentProviderType[] } })
63
+ .then((providers) => {
64
+ providers.forEach((p) => resolvedPaymentProviderIds.add(p._id));
65
+ }),
66
+ );
67
+ }
68
+
69
+ if (deliveryProviderTypes?.length) {
70
+ lookups.push(
71
+ modules.delivery
72
+ .findProviders({ type: { $in: deliveryProviderTypes as DeliveryProviderType[] } })
73
+ .then((providers) => {
74
+ providers.forEach((p) => resolvedDeliveryProviderIds.add(p._id));
75
+ }),
76
+ );
77
+ }
78
+
79
+ await Promise.all(lookups);
80
+
81
+ const filters = await resolveOrderFilters(modules, {
82
+ paymentProviderIds: [...resolvedPaymentProviderIds],
83
+ deliveryProviderIds: [...resolvedDeliveryProviderIds],
84
+ });
85
+
86
+ if (!filters) {
87
+ return {
88
+ content: [
89
+ {
90
+ type: 'text' as const,
91
+ text: JSON.stringify({ orders: [] }),
92
+ },
93
+ ],
94
+ };
95
+ }
96
+ const orders = await modules.orders.findOrders({
97
+ ...restParams,
98
+ ...filters,
99
+ } as any);
100
+
101
+ return {
102
+ content: [
103
+ {
104
+ type: 'text' as const,
105
+ text: JSON.stringify({ orders }),
106
+ },
107
+ ],
108
+ };
109
+ } catch (error) {
110
+ return {
111
+ content: [
112
+ {
113
+ type: 'text' as const,
114
+ text: `Error fetching orders: ${(error as Error).message}`,
115
+ },
116
+ ],
117
+ };
118
+ }
119
+ }
@@ -9,7 +9,12 @@ const PaymentProviderTypeEnum = z.enum(['CARD', 'INVOICE', 'GENERIC']);
9
9
  export const CreatePaymentProviderSchema = {
10
10
  paymentProvider: z.object({
11
11
  type: PaymentProviderTypeEnum.describe('Type of payment provider'),
12
- adapterKey: z.string().min(1).describe('Adapter key for the payment provider'),
12
+ adapterKey: z
13
+ .string()
14
+ .min(1)
15
+ .describe(
16
+ 'Adapter key for the payment provider, this value should be a valid adapter key found in payment provider interfaces',
17
+ ),
13
18
  }),
14
19
  };
15
20
 
@@ -38,7 +43,7 @@ export async function createPaymentProviderHandler(
38
43
  content: [
39
44
  {
40
45
  type: 'text' as const,
41
- text: JSON.stringify({ paymentProvider: created }),
46
+ text: JSON.stringify({ provider: created }),
42
47
  },
43
48
  ],
44
49
  };
@@ -51,7 +51,7 @@ export const registerPaymentProviderTools = (server: McpServer, context: Context
51
51
  async (params) => paymentInterfacesHandler(context, params),
52
52
  );
53
53
  server.tool(
54
- 'paymentProvider_create',
54
+ 'paymentProvider_add',
55
55
  'Adds new payment provider.',
56
56
  CreatePaymentProviderSchema,
57
57
  async (params) => createPaymentProviderHandler(context, params),
@@ -1,5 +1,4 @@
1
1
  import { z } from 'zod';
2
-
3
2
  import { Context } from '../../../context.js';
4
3
  import { log } from '@unchainedshop/logger';
5
4
  import { PaymentDirector } from '@unchainedshop/core';
@@ -8,7 +7,7 @@ import { PaymentProviderType } from '@unchainedshop/core-payment';
8
7
  const PaymentProviderTypeEnum = z.enum(['CARD', 'INVOICE', 'GENERIC']);
9
8
 
10
9
  export const PaymentInterfacesSchema = {
11
- type: PaymentProviderTypeEnum.describe('Filter payment interfaces by provider type'),
10
+ type: PaymentProviderTypeEnum.optional().describe('Optional filter by payment provider type'),
12
11
  };
13
12
 
14
13
  export const PaymentInterfacesZodSchema = z.object(PaymentInterfacesSchema);
@@ -21,19 +20,23 @@ export async function paymentInterfacesHandler(context: Context, params: Payment
21
20
  try {
22
21
  log('handler paymentInterfacesHandler', { userId, type });
23
22
 
24
- const interfaces = await PaymentDirector.getAdapters()
25
- .filter((Adapter) => Adapter.typeSupported(type as PaymentProviderType))
26
- .map((Adapter) => ({
27
- _id: Adapter.key,
28
- label: Adapter.label,
29
- version: Adapter.version,
30
- }));
23
+ const allAdapters = await PaymentDirector.getAdapters();
24
+
25
+ const filteredAdapters = type
26
+ ? allAdapters.filter((Adapter) => Adapter.typeSupported(type as PaymentProviderType))
27
+ : allAdapters;
28
+
29
+ const interfaces = filteredAdapters.map((Adapter) => ({
30
+ _id: Adapter.key,
31
+ label: Adapter.label,
32
+ version: Adapter.version,
33
+ }));
31
34
 
32
35
  return {
33
36
  content: [
34
37
  {
35
38
  type: 'text' as const,
36
- text: JSON.stringify({ paymentInterfaces: interfaces }),
39
+ text: JSON.stringify({ interfaces }),
37
40
  },
38
41
  ],
39
42
  };
@@ -35,7 +35,7 @@ export async function paymentProviderByIdHandler(context: Context, params: Payme
35
35
  content: [
36
36
  {
37
37
  type: 'text' as const,
38
- text: JSON.stringify({ paymentProvider: provider }),
38
+ text: JSON.stringify({ provider }),
39
39
  },
40
40
  ],
41
41
  };
@@ -5,25 +5,35 @@ import { log } from '@unchainedshop/logger';
5
5
  const PaymentProviderTypeEnum = z.enum(['CARD', 'INVOICE', 'GENERIC']);
6
6
 
7
7
  export const PaymentProvidersListSchema = {
8
- type: PaymentProviderTypeEnum.optional().describe('Filter payment providers by type'),
8
+ type: PaymentProviderTypeEnum.optional().describe('Optional filter by payment provider type'),
9
+ queryString: z.string().min(1).optional().describe('Optional full-text search string'),
9
10
  };
10
11
 
11
12
  export const PaymentProvidersListZodSchema = z.object(PaymentProvidersListSchema);
12
13
  export type PaymentProvidersListParams = z.infer<typeof PaymentProvidersListZodSchema>;
13
-
14
14
  export async function paymentProvidersListHandler(context: Context, params: PaymentProvidersListParams) {
15
15
  const { modules, userId } = context;
16
16
 
17
17
  try {
18
18
  log('handler paymentProvidersListHandler', { userId, params });
19
19
 
20
- const providers = await modules.payment.paymentProviders.findProviders(params as any);
20
+ const { type, queryString } = params;
21
+
22
+ const selector: Record<string, any> = {};
23
+ if (type) selector.type = type;
24
+
25
+ if (queryString) {
26
+ const regex = new RegExp(queryString, 'i');
27
+ selector.$or = [{ _id: regex }, { adapterKey: regex }];
28
+ }
29
+
30
+ const providers = await modules.payment.paymentProviders.findProviders(selector);
21
31
 
22
32
  return {
23
33
  content: [
24
34
  {
25
35
  type: 'text' as const,
26
- text: JSON.stringify({ paymentProviders: providers }),
36
+ text: JSON.stringify({ providers }),
27
37
  },
28
38
  ],
29
39
  };
@@ -20,20 +20,18 @@ export async function removePaymentProviderHandler(
20
20
  try {
21
21
  log('handler removePaymentProviderHandler', { userId, paymentProviderId });
22
22
 
23
- if (
24
- !(await modules.payment.paymentProviders.providerExists({
25
- paymentProviderId,
26
- }))
27
- )
28
- throw new PaymentProviderNotFoundError({ paymentProviderId });
23
+ const provider = await modules.payment.paymentProviders.findProvider({
24
+ paymentProviderId,
25
+ });
26
+ if (!provider) throw new PaymentProviderNotFoundError({ paymentProviderId });
29
27
 
30
- const removed = await modules.payment.paymentProviders.delete(paymentProviderId);
28
+ await modules.payment.paymentProviders.delete(paymentProviderId);
31
29
 
32
30
  return {
33
31
  content: [
34
32
  {
35
33
  type: 'text' as const,
36
- text: JSON.stringify({ paymentProvider: removed }),
34
+ text: JSON.stringify({ provider }),
37
35
  },
38
36
  ],
39
37
  };
@@ -3,11 +3,30 @@ import { Context } from '../../../context.js';
3
3
  import { log } from '@unchainedshop/logger';
4
4
  import { PaymentProviderNotFoundError } from '../../../errors.js';
5
5
 
6
+ const ConfigurationEntry = z.object({
7
+ key: z.string().min(1).describe('Configuration key'),
8
+ value: z.any().describe('Configuration value'),
9
+ });
10
+
6
11
  export const UpdatePaymentProviderSchema = {
7
12
  paymentProviderId: z.string().min(1).describe('ID of the payment provider to update'),
8
- paymentProvider: z.object({
9
- configuration: z.array(z.any()).optional().describe('Array of JSON configuration values'),
10
- }),
13
+ paymentProvider: z
14
+ .object({
15
+ configuration: z
16
+ .array(ConfigurationEntry)
17
+ .optional()
18
+ .describe('List of key-value configuration entries'),
19
+ })
20
+ .refine(
21
+ (data) => {
22
+ const keys = data.configuration?.map((entry) => entry.key) || [];
23
+ return new Set(keys).size === keys.length;
24
+ },
25
+ {
26
+ message: 'Duplicate keys are not allowed in configuration.',
27
+ path: ['configuration'],
28
+ },
29
+ ),
11
30
  };
12
31
 
13
32
  export const UpdatePaymentProviderZodSchema = z.object(UpdatePaymentProviderSchema);
@@ -39,7 +58,7 @@ export async function updatePaymentProviderHandler(
39
58
  content: [
40
59
  {
41
60
  type: 'text' as const,
42
- text: JSON.stringify({ paymentProvider: updated }),
61
+ text: JSON.stringify({ provider: updated }),
43
62
  },
44
63
  ],
45
64
  };
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ import { Context } from '../../../context.js';
3
+ import { log } from '@unchainedshop/logger';
4
+ import { WarehousingDirector } from '@unchainedshop/core';
5
+ import { ProviderConfigurationInvalid } from '../../../errors.js';
6
+
7
+ const WarehousingProviderTypeEnum = z.enum(['PHYSICAL', 'VIRTUAL']);
8
+
9
+ export const CreateWarehousingProviderSchema = {
10
+ warehousingProvider: z.object({
11
+ type: WarehousingProviderTypeEnum.describe('Type of the warehousing provider'),
12
+ adapterKey: z
13
+ .string()
14
+ .min(1)
15
+ .describe(
16
+ 'Adapter key for the warehousing provider, it should be a valid interface key found in warehousing interfaces',
17
+ ),
18
+ }),
19
+ };
20
+
21
+ export const CreateWarehousingProviderZodSchema = z.object(CreateWarehousingProviderSchema);
22
+ export type CreateWarehousingProviderParams = z.infer<typeof CreateWarehousingProviderZodSchema>;
23
+
24
+ export async function createWarehousingProviderHandler(
25
+ context: Context,
26
+ params: CreateWarehousingProviderParams,
27
+ ) {
28
+ const { modules, userId } = context;
29
+ const { warehousingProvider } = params;
30
+
31
+ try {
32
+ log('handler createWarehousingProviderHandler', { userId, warehousingProvider });
33
+
34
+ const Adapter = WarehousingDirector.getAdapter(warehousingProvider.adapterKey);
35
+
36
+ const provider = await modules.warehousing.create({
37
+ configuration: Adapter.initialConfiguration,
38
+ ...warehousingProvider,
39
+ } as any);
40
+
41
+ if (!provider) throw new ProviderConfigurationInvalid(warehousingProvider);
42
+
43
+ return {
44
+ content: [
45
+ {
46
+ type: 'text' as const,
47
+ text: JSON.stringify({ provider }),
48
+ },
49
+ ],
50
+ };
51
+ } catch (error) {
52
+ return {
53
+ content: [
54
+ {
55
+ type: 'text' as const,
56
+ text: `Error creating warehousing provider: ${(error as Error).message}`,
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ }
@@ -0,0 +1,81 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { Context } from '../../../context.js';
3
+ import {
4
+ warehousingProvidersListHandler,
5
+ WarehousingProvidersListSchema,
6
+ } from './warehousingProvidersListHandler.js';
7
+ import {
8
+ warehousingProvidersCountHandler,
9
+ WarehousingProvidersCountSchema,
10
+ } from './warehousingProvidersCountHandler.js';
11
+ import {
12
+ WarehousingProviderByIdSchema,
13
+ warehousingProviderHandler,
14
+ } from './warehousingProviderHandler.js';
15
+ import {
16
+ warehousingInterfacesHandler,
17
+ WarehousingInterfacesSchema,
18
+ } from './warehousingInterfacesHandler.js';
19
+ import {
20
+ createWarehousingProviderHandler,
21
+ CreateWarehousingProviderSchema,
22
+ } from './createWarehousingProviderHandler.js';
23
+ import {
24
+ updateWarehousingProviderHandler,
25
+ UpdateWarehousingProviderSchema,
26
+ } from './updateWarehousingProviderHandler.js';
27
+ import {
28
+ removeWarehousingProviderHandler,
29
+ RemoveWarehousingProviderSchema,
30
+ } from './removeWarehousingProviderHandler.js';
31
+
32
+ export const registerWarehousingProviderTools = (server: McpServer, context: Context) => {
33
+ server.tool(
34
+ 'warehousingProviders_list',
35
+ 'Get all warehousing providers, optionally filtered by type.',
36
+ WarehousingProvidersListSchema,
37
+ async (params) => warehousingProvidersListHandler(context, params),
38
+ );
39
+
40
+ server.tool(
41
+ 'warehousingProviders_count',
42
+ 'Returns total number of warehousing providers, optionally filtered by type.',
43
+ WarehousingProvidersCountSchema,
44
+ async (params) => warehousingProvidersCountHandler(context, params),
45
+ );
46
+
47
+ server.tool(
48
+ 'warehousingProvider_get',
49
+ 'Get a specific warehousing provider by ID.',
50
+ WarehousingProviderByIdSchema,
51
+ async (params) => warehousingProviderHandler(context, params),
52
+ );
53
+
54
+ server.tool(
55
+ 'warehousingInterfaces_list',
56
+ 'Get all warehousing interfaces filtered by type.',
57
+ WarehousingInterfacesSchema,
58
+ async (params) => warehousingInterfacesHandler(context, params),
59
+ );
60
+
61
+ server.tool(
62
+ 'warehousingProvider_add',
63
+ 'Creates new warehousing provider.',
64
+ CreateWarehousingProviderSchema,
65
+ async (params) => createWarehousingProviderHandler(context, params),
66
+ );
67
+
68
+ server.tool(
69
+ 'warehousingProvider_update',
70
+ 'Updates warehousing provider information with the provided ID.',
71
+ UpdateWarehousingProviderSchema,
72
+ async (params) => updateWarehousingProviderHandler(context, params),
73
+ );
74
+
75
+ server.tool(
76
+ 'warehousingProvider_remove',
77
+ 'Soft deletes a warehousing provider by setting its deleted timestamp.',
78
+ RemoveWarehousingProviderSchema,
79
+ async (params) => removeWarehousingProviderHandler(context, params),
80
+ );
81
+ };
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ import { Context } from '../../../context.js';
3
+ import { log } from '@unchainedshop/logger';
4
+ import { WarehousingProviderNotFoundError } from '../../../errors.js';
5
+
6
+ export const RemoveWarehousingProviderSchema = {
7
+ warehousingProviderId: z.string().min(1).describe('ID of the warehousing provider to soft delete'),
8
+ };
9
+
10
+ export const RemoveWarehousingProviderZodSchema = z.object(RemoveWarehousingProviderSchema);
11
+ export type RemoveWarehousingProviderParams = z.infer<typeof RemoveWarehousingProviderZodSchema>;
12
+ export async function removeWarehousingProviderHandler(
13
+ context: Context,
14
+ params: RemoveWarehousingProviderParams,
15
+ ) {
16
+ const { modules, userId } = context;
17
+ const { warehousingProviderId } = params;
18
+
19
+ try {
20
+ log('handler removeWarehousingProviderHandler', { userId, warehousingProviderId });
21
+ const provider = await modules.warehousing.findProvider({
22
+ warehousingProviderId,
23
+ });
24
+ if (!provider) throw new WarehousingProviderNotFoundError({ warehousingProviderId });
25
+
26
+ await modules.warehousing.delete(warehousingProviderId);
27
+
28
+ return {
29
+ content: [
30
+ {
31
+ type: 'text' as const,
32
+ text: JSON.stringify({ provider }),
33
+ },
34
+ ],
35
+ };
36
+ } catch (error) {
37
+ return {
38
+ content: [
39
+ {
40
+ type: 'text' as const,
41
+ text: `Error removing warehousing provider: ${(error as Error).message}`,
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ }
@@ -0,0 +1,72 @@
1
+ import { z } from 'zod';
2
+ import { Context } from '../../../context.js';
3
+ import { log } from '@unchainedshop/logger';
4
+ import { WarehousingProviderNotFoundError } from '../../../errors.js';
5
+
6
+ const ConfigurationEntry = z.object({
7
+ key: z.string().min(1).describe('Configuration key'),
8
+ value: z.any().describe('Configuration value'),
9
+ });
10
+
11
+ export const UpdateWarehousingProviderSchema = {
12
+ warehousingProviderId: z.string().min(1).describe('ID of the warehousing provider to update'),
13
+ warehousingProvider: z
14
+ .object({
15
+ configuration: z
16
+ .array(ConfigurationEntry)
17
+ .optional()
18
+ .describe('List of key-value configuration entries'),
19
+ })
20
+ .refine(
21
+ (data) => {
22
+ const keys = data.configuration?.map((entry) => entry.key) || [];
23
+ return new Set(keys).size === keys.length;
24
+ },
25
+ {
26
+ message: 'Duplicate keys are not allowed in configuration.',
27
+ path: ['configuration'],
28
+ },
29
+ ),
30
+ };
31
+
32
+ export const UpdateWarehousingProviderZodSchema = z.object(UpdateWarehousingProviderSchema);
33
+ export type UpdateWarehousingProviderParams = z.infer<typeof UpdateWarehousingProviderZodSchema>;
34
+
35
+ export async function updateWarehousingProviderHandler(
36
+ context: Context,
37
+ params: UpdateWarehousingProviderParams,
38
+ ) {
39
+ const { modules, userId } = context;
40
+ const { warehousingProviderId, warehousingProvider } = params;
41
+
42
+ try {
43
+ log('handler updateWarehousingProviderHandler', {
44
+ userId,
45
+ warehousingProviderId,
46
+ warehousingProvider,
47
+ });
48
+
49
+ if (!(await modules.warehousing.providerExists({ warehousingProviderId })))
50
+ throw new WarehousingProviderNotFoundError({ warehousingProviderId });
51
+
52
+ const provider = await modules.warehousing.update(warehousingProviderId, warehousingProvider as any);
53
+
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text' as const,
58
+ text: JSON.stringify({ provider }),
59
+ },
60
+ ],
61
+ };
62
+ } catch (error) {
63
+ return {
64
+ content: [
65
+ {
66
+ type: 'text' as const,
67
+ text: `Error updating warehousing provider: ${(error as Error).message}`,
68
+ },
69
+ ],
70
+ };
71
+ }
72
+ }
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ import { Context } from '../../../context.js';
3
+ import { log } from '@unchainedshop/logger';
4
+ import { WarehousingDirector } from '@unchainedshop/core';
5
+ import { WarehousingProviderType } from '@unchainedshop/core-warehousing';
6
+
7
+ const WarehousingProviderTypeEnum = z
8
+ .enum(['PHYSICAL', 'VIRTUAL'])
9
+ .describe('Warehousing provider type');
10
+
11
+ export const WarehousingInterfacesSchema = {
12
+ type: WarehousingProviderTypeEnum.optional().describe('Optional filter by warehousing provider type'),
13
+ };
14
+
15
+ export const WarehousingInterfacesZodSchema = z.object(WarehousingInterfacesSchema);
16
+ export type WarehousingInterfacesParams = z.infer<typeof WarehousingInterfacesZodSchema>;
17
+
18
+ export async function warehousingInterfacesHandler(
19
+ context: Context,
20
+ params: WarehousingInterfacesParams,
21
+ ) {
22
+ const { userId } = context;
23
+ const { type } = params;
24
+
25
+ try {
26
+ log('handler warehousingInterfacesHandler', { userId, type });
27
+
28
+ const allAdapters = await WarehousingDirector.getAdapters();
29
+
30
+ const filteredAdapters = type
31
+ ? allAdapters.filter((Adapter) => Adapter.typeSupported(type as WarehousingProviderType))
32
+ : allAdapters;
33
+
34
+ const interfaces = filteredAdapters.map((Adapter) => ({
35
+ _id: Adapter.key,
36
+ label: Adapter.label,
37
+ version: Adapter.version,
38
+ }));
39
+
40
+ return {
41
+ content: [
42
+ {
43
+ type: 'text' as const,
44
+ text: JSON.stringify({ interfaces }),
45
+ },
46
+ ],
47
+ };
48
+ } catch (error) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text' as const,
53
+ text: `Error fetching warehousing interfaces: ${(error as Error).message}`,
54
+ },
55
+ ],
56
+ };
57
+ }
58
+ }