@hszrdm/core 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +4357 -4110
- package/.medusa/server/src/admin/index.mjs +4357 -4110
- package/.medusa/server/src/api/admin/email/preview/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/email/preview/route.js +20 -0
- package/.medusa/server/src/api/admin/email/templates/[id]/route.d.ts +4 -0
- package/.medusa/server/src/api/admin/email/templates/[id]/route.js +25 -0
- package/.medusa/server/src/api/admin/email/templates/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/email/templates/route.js +40 -0
- package/.medusa/server/src/api/admin/email/test-send/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/email/test-send/route.js +64 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/cancel/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/cancel/route.js +15 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/route.d.ts +4 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/route.js +39 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/send/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/send/route.js +14 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/stats/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/stats/route.js +17 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/test-send/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/test-send/route.js +23 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/newsletter/campaigns/route.js +40 -0
- package/.medusa/server/src/api/hooks/email/status/route.d.ts +2 -0
- package/.medusa/server/src/api/hooks/email/status/route.js +69 -0
- package/.medusa/server/src/api/mcp/route.d.ts +4 -0
- package/.medusa/server/src/api/mcp/route.js +19 -0
- package/.medusa/server/src/api/store/email/track/click/[token]/route.d.ts +2 -0
- package/.medusa/server/src/api/store/email/track/click/[token]/route.js +19 -0
- package/.medusa/server/src/api/store/email/track/open/[token]/route.d.ts +2 -0
- package/.medusa/server/src/api/store/email/track/open/[token]/route.js +22 -0
- package/.medusa/server/src/api/store/leads/route.js +27 -93
- package/.medusa/server/src/api/store/newsletter/route.js +24 -107
- package/.medusa/server/src/api/store/quote-requests/route.js +41 -129
- package/.medusa/server/src/config.d.ts +1 -1
- package/.medusa/server/src/config.js +38 -15
- package/.medusa/server/src/core/customer-email.d.ts +5 -5
- package/.medusa/server/src/core/customer-email.js +55 -109
- package/.medusa/server/src/core/store-mcp.d.ts +19 -0
- package/.medusa/server/src/core/store-mcp.js +541 -0
- package/.medusa/server/src/core/transactional-email.d.ts +9 -8
- package/.medusa/server/src/core/transactional-email.js +74 -244
- package/.medusa/server/src/core/version.d.ts +2 -2
- package/.medusa/server/src/core/version.js +2 -2
- package/.medusa/server/src/jobs/email-campaign-dispatch.d.ts +6 -0
- package/.medusa/server/src/jobs/email-campaign-dispatch.js +18 -0
- package/.medusa/server/src/localized-config.d.ts +1 -1
- package/.medusa/server/src/modules/cms/index.d.ts +32 -1
- package/.medusa/server/src/modules/core-audit/index.d.ts +18 -1
- package/.medusa/server/src/modules/core-audit/writer.d.ts +14 -1
- package/.medusa/server/src/modules/email-center/campaign.d.ts +74 -0
- package/.medusa/server/src/modules/email-center/campaign.js +193 -0
- package/.medusa/server/src/modules/email-center/constants.d.ts +1 -0
- package/.medusa/server/src/modules/email-center/constants.js +5 -0
- package/.medusa/server/src/modules/email-center/defaults.d.ts +10 -0
- package/.medusa/server/src/modules/email-center/defaults.js +49 -0
- package/.medusa/server/src/modules/email-center/index.d.ts +57 -0
- package/.medusa/server/src/modules/email-center/index.js +42 -0
- package/.medusa/server/src/modules/email-center/migrations/Migration20261030173000.d.ts +5 -0
- package/.medusa/server/src/modules/email-center/migrations/Migration20261030173000.js +25 -0
- package/.medusa/server/src/modules/email-center/models/email-campaign.d.ts +22 -0
- package/.medusa/server/src/modules/email-center/models/email-campaign.js +37 -0
- package/.medusa/server/src/modules/email-center/models/email-delivery.d.ts +21 -0
- package/.medusa/server/src/modules/email-center/models/email-delivery.js +38 -0
- package/.medusa/server/src/modules/email-center/models/email-template.d.ts +13 -0
- package/.medusa/server/src/modules/email-center/models/email-template.js +20 -0
- package/.medusa/server/src/modules/email-center/render.d.ts +31 -0
- package/.medusa/server/src/modules/email-center/render.js +92 -0
- package/.medusa/server/src/modules/email-center/send.d.ts +27 -0
- package/.medusa/server/src/modules/email-center/send.js +67 -0
- package/.medusa/server/src/modules/email-center/service.d.ts +56 -0
- package/.medusa/server/src/modules/email-center/service.js +13 -0
- package/.medusa/server/src/modules/email-center/tracking.d.ts +9 -0
- package/.medusa/server/src/modules/email-center/tracking.js +92 -0
- package/.medusa/server/src/modules/integration-operation/index.d.ts +18 -1
- package/.medusa/server/src/modules/integration-settings/index.d.ts +18 -1
- package/.medusa/server/src/modules/lead/index.d.ts +18 -1
- package/.medusa/server/src/modules/legal-consent/consent.d.ts +4 -4
- package/.medusa/server/src/modules/legal-consent/index.d.ts +46 -1
- package/.medusa/server/src/modules/newsletter/index.d.ts +18 -1
- package/.medusa/server/src/modules/product-review/index.d.ts +18 -1
- package/.medusa/server/src/modules/quote-request/index.d.ts +18 -1
- package/.medusa/server/src/modules/seo/index.d.ts +32 -1
- package/.medusa/server/src/modules/webshop-analytics/index.d.ts +18 -1
- package/.medusa/server/src/modules/wishlist/index.d.ts +18 -1
- package/.medusa/server/src/providers/dpd/index.d.ts +1 -1
- package/.medusa/server/src/providers/email/index.d.ts +2 -0
- package/.medusa/server/src/providers/email/index.js +11 -0
- package/.medusa/server/src/providers/email/service.d.ts +24 -0
- package/.medusa/server/src/providers/email/service.js +117 -0
- package/.medusa/server/src/providers/foxpost/index.d.ts +1 -1
- package/.medusa/server/src/providers/gls/index.d.ts +1 -1
- package/.medusa/server/src/providers/mpl/index.d.ts +1 -1
- package/.medusa/server/src/providers/packeta/index.d.ts +1 -1
- package/.medusa/server/src/providers/resilient-stripe/index.d.ts +1 -1
- package/.medusa/server/src/providers/simplepay/index.d.ts +1 -1
- package/.medusa/server/src/scripts/core-init.js +20 -3
- package/.medusa/server/src/scripts/verify-bootstrap.js +1 -7
- package/.medusa/server/src/subscribers/transactional-email-shipment-created.js +6 -2
- package/package.json +3 -3
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleStoreMcpRequest = handleStoreMcpRequest;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const MODERN_PROTOCOL = "2026-07-28";
|
|
8
|
+
const LEGACY_PROTOCOL = "2025-11-25";
|
|
9
|
+
const SERVER_NAME = "hszrdm-store";
|
|
10
|
+
const SERVER_VERSION = "1.0.0";
|
|
11
|
+
const DEFAULT_LIMIT = 20;
|
|
12
|
+
const MAX_LIMIT = 100;
|
|
13
|
+
const DEFAULT_RATE_LIMIT = 120;
|
|
14
|
+
const TOOL_CACHE_TTL_MS = 300_000;
|
|
15
|
+
const rateLimitBuckets = new Map();
|
|
16
|
+
const pageSchema = zod_1.z.object({
|
|
17
|
+
limit: zod_1.z.number().int().min(1).max(MAX_LIMIT).optional(),
|
|
18
|
+
offset: zod_1.z.number().int().min(0).optional(),
|
|
19
|
+
});
|
|
20
|
+
const pageWithStatusSchema = pageSchema.extend({
|
|
21
|
+
status: zod_1.z.string().trim().min(1).optional(),
|
|
22
|
+
});
|
|
23
|
+
const idSchema = zod_1.z.object({ id: zod_1.z.string().trim().min(1) });
|
|
24
|
+
const tools = [
|
|
25
|
+
{
|
|
26
|
+
name: "store_summary",
|
|
27
|
+
title: "Store summary",
|
|
28
|
+
description: "Return a compact read-only summary of the store, including counts for orders, products, customers, and sales channels.",
|
|
29
|
+
inputSchema: objectSchema({}),
|
|
30
|
+
parse: (input) => zod_1.z.object({}).parse(input ?? {}),
|
|
31
|
+
run: async (query) => {
|
|
32
|
+
const [orders, products, customers, salesChannels] = await Promise.all([
|
|
33
|
+
countEntity(query, "order"),
|
|
34
|
+
countEntity(query, "product"),
|
|
35
|
+
countEntity(query, "customer"),
|
|
36
|
+
countEntity(query, "sales_channel"),
|
|
37
|
+
]);
|
|
38
|
+
return {
|
|
39
|
+
orders,
|
|
40
|
+
products,
|
|
41
|
+
customers,
|
|
42
|
+
sales_channels: salesChannels,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "orders_list",
|
|
48
|
+
title: "List orders",
|
|
49
|
+
description: "List recent orders with totals, payment status, fulfillment status, customer email, and timestamps. Read-only.",
|
|
50
|
+
inputSchema: objectSchema({
|
|
51
|
+
limit: integerSchema(1, MAX_LIMIT),
|
|
52
|
+
offset: integerSchema(0),
|
|
53
|
+
status: stringSchema(),
|
|
54
|
+
}),
|
|
55
|
+
parse: (input) => pageWithStatusSchema.parse(input ?? {}),
|
|
56
|
+
run: async (query, input) => {
|
|
57
|
+
const { limit, offset, status } = input;
|
|
58
|
+
return query.graph({
|
|
59
|
+
entity: "order",
|
|
60
|
+
fields: [
|
|
61
|
+
"id",
|
|
62
|
+
"display_id",
|
|
63
|
+
"email",
|
|
64
|
+
"currency_code",
|
|
65
|
+
"total",
|
|
66
|
+
"subtotal",
|
|
67
|
+
"tax_total",
|
|
68
|
+
"shipping_total",
|
|
69
|
+
"status",
|
|
70
|
+
"fulfillment_status",
|
|
71
|
+
"payment_status",
|
|
72
|
+
"created_at",
|
|
73
|
+
"updated_at",
|
|
74
|
+
],
|
|
75
|
+
filters: status ? { status } : undefined,
|
|
76
|
+
pagination: page(limit, offset, { created_at: "DESC" }),
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "order_get",
|
|
82
|
+
title: "Get order",
|
|
83
|
+
description: "Get one order by its Medusa order ID, including line items. Read-only.",
|
|
84
|
+
inputSchema: objectSchema({ id: stringSchema() }, ["id"]),
|
|
85
|
+
parse: (input) => idSchema.parse(input ?? {}),
|
|
86
|
+
run: async (query, input) => {
|
|
87
|
+
const { id } = input;
|
|
88
|
+
const result = await query.graph({
|
|
89
|
+
entity: "order",
|
|
90
|
+
fields: [
|
|
91
|
+
"id",
|
|
92
|
+
"display_id",
|
|
93
|
+
"email",
|
|
94
|
+
"currency_code",
|
|
95
|
+
"total",
|
|
96
|
+
"subtotal",
|
|
97
|
+
"discount_total",
|
|
98
|
+
"tax_total",
|
|
99
|
+
"shipping_total",
|
|
100
|
+
"status",
|
|
101
|
+
"fulfillment_status",
|
|
102
|
+
"payment_status",
|
|
103
|
+
"created_at",
|
|
104
|
+
"updated_at",
|
|
105
|
+
"items.id",
|
|
106
|
+
"items.title",
|
|
107
|
+
"items.subtitle",
|
|
108
|
+
"items.quantity",
|
|
109
|
+
"items.unit_price",
|
|
110
|
+
"items.total",
|
|
111
|
+
"items.variant_id",
|
|
112
|
+
"items.product_id",
|
|
113
|
+
],
|
|
114
|
+
filters: { id },
|
|
115
|
+
pagination: { take: 1 },
|
|
116
|
+
});
|
|
117
|
+
return result.data[0] ?? null;
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: "products_list",
|
|
122
|
+
title: "List products",
|
|
123
|
+
description: "List products with status, handle, thumbnail, and variants. Read-only.",
|
|
124
|
+
inputSchema: objectSchema({
|
|
125
|
+
limit: integerSchema(1, MAX_LIMIT),
|
|
126
|
+
offset: integerSchema(0),
|
|
127
|
+
status: stringSchema(),
|
|
128
|
+
}),
|
|
129
|
+
parse: (input) => pageWithStatusSchema.parse(input ?? {}),
|
|
130
|
+
run: async (query, input) => {
|
|
131
|
+
const { limit, offset, status } = input;
|
|
132
|
+
return query.graph({
|
|
133
|
+
entity: "product",
|
|
134
|
+
fields: [
|
|
135
|
+
"id",
|
|
136
|
+
"title",
|
|
137
|
+
"handle",
|
|
138
|
+
"status",
|
|
139
|
+
"thumbnail",
|
|
140
|
+
"created_at",
|
|
141
|
+
"updated_at",
|
|
142
|
+
"variants.id",
|
|
143
|
+
"variants.title",
|
|
144
|
+
"variants.sku",
|
|
145
|
+
"variants.manage_inventory",
|
|
146
|
+
],
|
|
147
|
+
filters: status ? { status } : undefined,
|
|
148
|
+
pagination: page(limit, offset, { created_at: "DESC" }),
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "product_get",
|
|
154
|
+
title: "Get product",
|
|
155
|
+
description: "Get one product by Medusa product ID, including variants and sales-channel membership. Read-only.",
|
|
156
|
+
inputSchema: objectSchema({ id: stringSchema() }, ["id"]),
|
|
157
|
+
parse: (input) => idSchema.parse(input ?? {}),
|
|
158
|
+
run: async (query, input) => {
|
|
159
|
+
const { id } = input;
|
|
160
|
+
const result = await query.graph({
|
|
161
|
+
entity: "product",
|
|
162
|
+
fields: [
|
|
163
|
+
"id",
|
|
164
|
+
"title",
|
|
165
|
+
"subtitle",
|
|
166
|
+
"description",
|
|
167
|
+
"handle",
|
|
168
|
+
"status",
|
|
169
|
+
"thumbnail",
|
|
170
|
+
"created_at",
|
|
171
|
+
"updated_at",
|
|
172
|
+
"variants.id",
|
|
173
|
+
"variants.title",
|
|
174
|
+
"variants.sku",
|
|
175
|
+
"variants.manage_inventory",
|
|
176
|
+
"sales_channels.id",
|
|
177
|
+
"sales_channels.name",
|
|
178
|
+
],
|
|
179
|
+
filters: { id },
|
|
180
|
+
pagination: { take: 1 },
|
|
181
|
+
});
|
|
182
|
+
return result.data[0] ?? null;
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: "customers_list",
|
|
187
|
+
title: "List customers",
|
|
188
|
+
description: "List basic customer identity and account metadata. Addresses, credentials, and secrets are not exposed. Read-only.",
|
|
189
|
+
inputSchema: objectSchema({
|
|
190
|
+
limit: integerSchema(1, MAX_LIMIT),
|
|
191
|
+
offset: integerSchema(0),
|
|
192
|
+
}),
|
|
193
|
+
parse: (input) => pageSchema.parse(input ?? {}),
|
|
194
|
+
run: async (query, input) => {
|
|
195
|
+
const { limit, offset } = input;
|
|
196
|
+
return query.graph({
|
|
197
|
+
entity: "customer",
|
|
198
|
+
fields: [
|
|
199
|
+
"id",
|
|
200
|
+
"email",
|
|
201
|
+
"first_name",
|
|
202
|
+
"last_name",
|
|
203
|
+
"company_name",
|
|
204
|
+
"has_account",
|
|
205
|
+
"created_at",
|
|
206
|
+
"updated_at",
|
|
207
|
+
],
|
|
208
|
+
pagination: page(limit, offset, { created_at: "DESC" }),
|
|
209
|
+
});
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: "sales_channels_list",
|
|
214
|
+
title: "List sales channels",
|
|
215
|
+
description: "List configured Medusa sales channels. Read-only.",
|
|
216
|
+
inputSchema: objectSchema({
|
|
217
|
+
limit: integerSchema(1, MAX_LIMIT),
|
|
218
|
+
offset: integerSchema(0),
|
|
219
|
+
}),
|
|
220
|
+
parse: (input) => pageSchema.parse(input ?? {}),
|
|
221
|
+
run: async (query, input) => {
|
|
222
|
+
const { limit, offset } = input;
|
|
223
|
+
return query.graph({
|
|
224
|
+
entity: "sales_channel",
|
|
225
|
+
fields: [
|
|
226
|
+
"id",
|
|
227
|
+
"name",
|
|
228
|
+
"description",
|
|
229
|
+
"is_disabled",
|
|
230
|
+
"created_at",
|
|
231
|
+
"updated_at",
|
|
232
|
+
],
|
|
233
|
+
pagination: page(limit, offset, { created_at: "DESC" }),
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: "inventory_list",
|
|
239
|
+
title: "List inventory",
|
|
240
|
+
description: "List inventory items and stock levels by location, including stocked, reserved, incoming, and available quantities. Read-only.",
|
|
241
|
+
inputSchema: objectSchema({
|
|
242
|
+
limit: integerSchema(1, MAX_LIMIT),
|
|
243
|
+
offset: integerSchema(0),
|
|
244
|
+
}),
|
|
245
|
+
parse: (input) => pageSchema.parse(input ?? {}),
|
|
246
|
+
run: async (query, input) => {
|
|
247
|
+
const { limit, offset } = input;
|
|
248
|
+
return query.graph({
|
|
249
|
+
entity: "inventory_item",
|
|
250
|
+
fields: [
|
|
251
|
+
"id",
|
|
252
|
+
"sku",
|
|
253
|
+
"title",
|
|
254
|
+
"requires_shipping",
|
|
255
|
+
"location_levels.id",
|
|
256
|
+
"location_levels.stocked_quantity",
|
|
257
|
+
"location_levels.reserved_quantity",
|
|
258
|
+
"location_levels.incoming_quantity",
|
|
259
|
+
"location_levels.available_quantity",
|
|
260
|
+
"location_levels.location_id",
|
|
261
|
+
],
|
|
262
|
+
pagination: page(limit, offset, { created_at: "DESC" }),
|
|
263
|
+
});
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
];
|
|
267
|
+
async function handleStoreMcpRequest(req, res) {
|
|
268
|
+
res.setHeader("Cache-Control", "private, no-store, max-age=0");
|
|
269
|
+
if (String(req.method || "POST").toUpperCase() !== "POST") {
|
|
270
|
+
res.setHeader("Allow", "POST");
|
|
271
|
+
return res.status(405).json({ error: "Method not allowed" });
|
|
272
|
+
}
|
|
273
|
+
const token = String(process.env.HSZRDM_MCP_TOKEN || "").trim();
|
|
274
|
+
if (!token) {
|
|
275
|
+
return res.status(503).json({
|
|
276
|
+
error: "HSZRDM Store MCP is disabled. Set HSZRDM_MCP_TOKEN to enable it.",
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
const authorization = header(req, "authorization");
|
|
280
|
+
if (!isValidBearerToken(authorization, token)) {
|
|
281
|
+
res.setHeader("WWW-Authenticate", 'Bearer realm="HSZRDM Store MCP"');
|
|
282
|
+
return res.status(401).json({ error: "Unauthorized" });
|
|
283
|
+
}
|
|
284
|
+
const allowedOrigins = csv(process.env.HSZRDM_MCP_ALLOWED_ORIGINS);
|
|
285
|
+
const origin = header(req, "origin");
|
|
286
|
+
if (origin && allowedOrigins.length && !allowedOrigins.includes(origin)) {
|
|
287
|
+
return res.status(403).json({ error: "Origin is not allowed" });
|
|
288
|
+
}
|
|
289
|
+
const allowedHosts = csv(process.env.HSZRDM_MCP_ALLOWED_HOSTS);
|
|
290
|
+
const host = header(req, "host")?.split(":")[0];
|
|
291
|
+
if (host && allowedHosts.length && !allowedHosts.includes(host)) {
|
|
292
|
+
return res.status(403).json({ error: "Host is not allowed" });
|
|
293
|
+
}
|
|
294
|
+
if (!consumeRateLimit(req, token)) {
|
|
295
|
+
res.setHeader("Retry-After", "60");
|
|
296
|
+
return res.status(429).json({ error: "MCP rate limit exceeded" });
|
|
297
|
+
}
|
|
298
|
+
const rpc = parseRpc(req.body);
|
|
299
|
+
if (!rpc.ok) {
|
|
300
|
+
return res.status(400).json(rpcError(null, -32600, rpc.message));
|
|
301
|
+
}
|
|
302
|
+
const request = rpc.request;
|
|
303
|
+
if (request.method === "notifications/initialized") {
|
|
304
|
+
return res.status(202).end();
|
|
305
|
+
}
|
|
306
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
307
|
+
const modern = isModernRequest(req, request);
|
|
308
|
+
try {
|
|
309
|
+
switch (request.method) {
|
|
310
|
+
case "server/discover":
|
|
311
|
+
return res.json(rpcResult(request.id, modernDiscoverResult()));
|
|
312
|
+
case "initialize":
|
|
313
|
+
return res.json(rpcResult(request.id, legacyInitializeResult(request.params)));
|
|
314
|
+
case "ping":
|
|
315
|
+
return res.json(rpcResult(request.id, completeResult(modern, {})));
|
|
316
|
+
case "tools/list":
|
|
317
|
+
return res.json(rpcResult(request.id, completeResult(modern, {
|
|
318
|
+
tools: tools.map(publicTool),
|
|
319
|
+
...(modern
|
|
320
|
+
? { ttlMs: TOOL_CACHE_TTL_MS, cacheScope: "private" }
|
|
321
|
+
: {}),
|
|
322
|
+
})));
|
|
323
|
+
case "tools/call":
|
|
324
|
+
return handleToolCall(query, request, res, modern);
|
|
325
|
+
default:
|
|
326
|
+
return res.status(404).json(rpcError(request.id, -32601, `Method not found: ${request.method}`));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
const message = error instanceof Error ? error.message : "Internal MCP error";
|
|
331
|
+
return res.status(500).json(rpcError(request.id, -32603, message));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
async function handleToolCall(query, request, res, modern) {
|
|
335
|
+
const params = isRecord(request.params) ? request.params : {};
|
|
336
|
+
const name = typeof params.name === "string" ? params.name : "";
|
|
337
|
+
const tool = tools.find((candidate) => candidate.name === name);
|
|
338
|
+
if (!tool) {
|
|
339
|
+
return res.status(400).json(rpcError(request.id, -32602, `Unknown tool: ${name || "(missing name)"}`));
|
|
340
|
+
}
|
|
341
|
+
let input;
|
|
342
|
+
try {
|
|
343
|
+
input = tool.parse(params.arguments ?? {});
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
const message = error instanceof Error ? error.message : "Invalid tool arguments";
|
|
347
|
+
return res.json(rpcResult(request.id, completeResult(modern, {
|
|
348
|
+
content: [{ type: "text", text: message }],
|
|
349
|
+
isError: true,
|
|
350
|
+
})));
|
|
351
|
+
}
|
|
352
|
+
try {
|
|
353
|
+
const value = await tool.run(query, input);
|
|
354
|
+
console.info(`[HSZRDM MCP] ${tool.name}`);
|
|
355
|
+
return res.json(rpcResult(request.id, completeResult(modern, {
|
|
356
|
+
content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
|
|
357
|
+
structuredContent: value,
|
|
358
|
+
})));
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
const message = error instanceof Error ? error.message : "Tool execution failed";
|
|
362
|
+
return res.json(rpcResult(request.id, completeResult(modern, {
|
|
363
|
+
content: [{ type: "text", text: message }],
|
|
364
|
+
isError: true,
|
|
365
|
+
})));
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
function publicTool(tool) {
|
|
369
|
+
return {
|
|
370
|
+
name: tool.name,
|
|
371
|
+
title: tool.title,
|
|
372
|
+
description: tool.description,
|
|
373
|
+
inputSchema: tool.inputSchema,
|
|
374
|
+
annotations: {
|
|
375
|
+
readOnlyHint: true,
|
|
376
|
+
destructiveHint: false,
|
|
377
|
+
idempotentHint: true,
|
|
378
|
+
openWorldHint: false,
|
|
379
|
+
},
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
function modernDiscoverResult() {
|
|
383
|
+
return {
|
|
384
|
+
resultType: "complete",
|
|
385
|
+
supportedVersions: [MODERN_PROTOCOL],
|
|
386
|
+
capabilities: { tools: {} },
|
|
387
|
+
instructions: "Read-only HSZRDM commerce access backed by Medusa. Use tools to inspect orders, products, customers, sales channels, and inventory. No tool can modify store data.",
|
|
388
|
+
ttlMs: TOOL_CACHE_TTL_MS,
|
|
389
|
+
cacheScope: "private",
|
|
390
|
+
_meta: serverMeta(),
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
function legacyInitializeResult(params) {
|
|
394
|
+
const requested = isRecord(params) && typeof params.protocolVersion === "string"
|
|
395
|
+
? params.protocolVersion
|
|
396
|
+
: LEGACY_PROTOCOL;
|
|
397
|
+
const protocolVersion = requested.startsWith("2025-") || requested === "2024-11-05"
|
|
398
|
+
? requested
|
|
399
|
+
: LEGACY_PROTOCOL;
|
|
400
|
+
return {
|
|
401
|
+
protocolVersion,
|
|
402
|
+
capabilities: { tools: {} },
|
|
403
|
+
serverInfo: { name: SERVER_NAME, version: SERVER_VERSION },
|
|
404
|
+
instructions: "Read-only HSZRDM commerce access backed by Medusa. No tool can create, update, or delete store data.",
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
function completeResult(modern, value) {
|
|
408
|
+
if (!modern)
|
|
409
|
+
return value;
|
|
410
|
+
return {
|
|
411
|
+
resultType: "complete",
|
|
412
|
+
...value,
|
|
413
|
+
_meta: serverMeta(),
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
function serverMeta() {
|
|
417
|
+
return {
|
|
418
|
+
"io.modelcontextprotocol/serverInfo": {
|
|
419
|
+
name: SERVER_NAME,
|
|
420
|
+
version: SERVER_VERSION,
|
|
421
|
+
},
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
function parseRpc(body) {
|
|
425
|
+
if (!isRecord(body) || body.jsonrpc !== "2.0" || typeof body.method !== "string") {
|
|
426
|
+
return { ok: false, message: "Invalid JSON-RPC request" };
|
|
427
|
+
}
|
|
428
|
+
return {
|
|
429
|
+
ok: true,
|
|
430
|
+
request: {
|
|
431
|
+
id: body.id ?? null,
|
|
432
|
+
method: body.method,
|
|
433
|
+
params: body.params ?? {},
|
|
434
|
+
},
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
function isModernRequest(req, request) {
|
|
438
|
+
if (request.method === "server/discover")
|
|
439
|
+
return true;
|
|
440
|
+
if (header(req, "mcp-protocol-version") === MODERN_PROTOCOL)
|
|
441
|
+
return true;
|
|
442
|
+
if (!isRecord(request.params) || !isRecord(request.params._meta))
|
|
443
|
+
return false;
|
|
444
|
+
return request.params._meta["io.modelcontextprotocol/protocolVersion"] === MODERN_PROTOCOL;
|
|
445
|
+
}
|
|
446
|
+
function rpcResult(id, result) {
|
|
447
|
+
return { jsonrpc: "2.0", id, result };
|
|
448
|
+
}
|
|
449
|
+
function rpcError(id, code, message) {
|
|
450
|
+
return {
|
|
451
|
+
jsonrpc: "2.0",
|
|
452
|
+
id,
|
|
453
|
+
error: { code, message },
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
function page(limit, offset, order) {
|
|
457
|
+
return {
|
|
458
|
+
take: Math.min(limit ?? DEFAULT_LIMIT, MAX_LIMIT),
|
|
459
|
+
skip: offset ?? 0,
|
|
460
|
+
...(order ? { order } : {}),
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
async function countEntity(query, entity) {
|
|
464
|
+
const result = await query.graph({
|
|
465
|
+
entity,
|
|
466
|
+
fields: ["id"],
|
|
467
|
+
pagination: { take: 1, skip: 0 },
|
|
468
|
+
});
|
|
469
|
+
const count = result.metadata?.count;
|
|
470
|
+
return typeof count === "number" ? count : result.data.length;
|
|
471
|
+
}
|
|
472
|
+
function objectSchema(properties, required = []) {
|
|
473
|
+
return {
|
|
474
|
+
type: "object",
|
|
475
|
+
properties,
|
|
476
|
+
additionalProperties: false,
|
|
477
|
+
...(required.length ? { required } : {}),
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
function integerSchema(minimum, maximum) {
|
|
481
|
+
return {
|
|
482
|
+
type: "integer",
|
|
483
|
+
minimum,
|
|
484
|
+
...(maximum === undefined ? {} : { maximum }),
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
function stringSchema() {
|
|
488
|
+
return { type: "string", minLength: 1 };
|
|
489
|
+
}
|
|
490
|
+
function csv(value) {
|
|
491
|
+
return String(value || "")
|
|
492
|
+
.split(",")
|
|
493
|
+
.map((item) => item.trim())
|
|
494
|
+
.filter(Boolean);
|
|
495
|
+
}
|
|
496
|
+
function header(req, name) {
|
|
497
|
+
const viaGetter = req.get?.(name);
|
|
498
|
+
if (viaGetter)
|
|
499
|
+
return viaGetter;
|
|
500
|
+
const raw = req.headers?.[name] ?? req.headers?.[name.toLowerCase()];
|
|
501
|
+
return Array.isArray(raw) ? String(raw[0] || "") : raw ? String(raw) : undefined;
|
|
502
|
+
}
|
|
503
|
+
function isValidBearerToken(authorization, expected) {
|
|
504
|
+
if (!authorization?.startsWith("Bearer "))
|
|
505
|
+
return false;
|
|
506
|
+
const provided = authorization.slice("Bearer ".length).trim();
|
|
507
|
+
const left = Buffer.from(provided);
|
|
508
|
+
const right = Buffer.from(expected);
|
|
509
|
+
if (left.length !== right.length)
|
|
510
|
+
return false;
|
|
511
|
+
return (0, node_crypto_1.timingSafeEqual)(left, right);
|
|
512
|
+
}
|
|
513
|
+
function consumeRateLimit(req, token) {
|
|
514
|
+
const configured = Number(process.env.HSZRDM_MCP_RATE_LIMIT_PER_MINUTE || DEFAULT_RATE_LIMIT);
|
|
515
|
+
const limit = Number.isFinite(configured) && configured > 0
|
|
516
|
+
? Math.floor(configured)
|
|
517
|
+
: DEFAULT_RATE_LIMIT;
|
|
518
|
+
const minute = Math.floor(Date.now() / 60_000);
|
|
519
|
+
const forwarded = header(req, "x-forwarded-for")?.split(",")[0]?.trim();
|
|
520
|
+
const key = `${token.slice(0, 12)}:${forwarded || req.ip || "unknown"}`;
|
|
521
|
+
const current = rateLimitBuckets.get(key);
|
|
522
|
+
if (!current || current.minute !== minute) {
|
|
523
|
+
rateLimitBuckets.set(key, { minute, count: 1 });
|
|
524
|
+
pruneRateLimits(minute);
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
current.count += 1;
|
|
528
|
+
return current.count <= limit;
|
|
529
|
+
}
|
|
530
|
+
function pruneRateLimits(currentMinute) {
|
|
531
|
+
if (rateLimitBuckets.size < 500)
|
|
532
|
+
return;
|
|
533
|
+
for (const [key, value] of rateLimitBuckets) {
|
|
534
|
+
if (value.minute < currentMinute - 1)
|
|
535
|
+
rateLimitBuckets.delete(key);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
function isRecord(value) {
|
|
539
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
540
|
+
}
|
|
541
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtbWNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvc3RvcmUtbWNwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd1VBLHNEQTRGQztBQXBhRCxxREFBcUU7QUFDckUsNkNBQTZDO0FBQzdDLDZCQUF1QjtBQUV2QixNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUE7QUFDcEMsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFBO0FBQ3BDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQTtBQUNsQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUE7QUFDOUIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFBO0FBQ3hCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQTtBQUNyQixNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQTtBQUM5QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQTtBQUVqQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUE2QyxDQUFBO0FBK0M3RSxNQUFNLFVBQVUsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFCLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDeEQsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0NBQzNDLENBQUMsQ0FBQTtBQUVGLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUM3QyxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDNUMsQ0FBQyxDQUFBO0FBRUYsTUFBTSxRQUFR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
|
|
@@ -2,6 +2,7 @@ type ResolveContainer = {
|
|
|
2
2
|
resolve: (key: string) => unknown;
|
|
3
3
|
};
|
|
4
4
|
export type TransactionalEmailKind = "order_placed" | "payment_captured" | "fulfillment_created" | "shipment_created" | "order_canceled" | "payment_refunded";
|
|
5
|
+
export declare function transactionalEmailEnabled(kind: TransactionalEmailKind): boolean;
|
|
5
6
|
export declare function queueOrderLifecycleEmail(input: {
|
|
6
7
|
container: ResolveContainer;
|
|
7
8
|
kind: TransactionalEmailKind;
|
|
@@ -16,13 +17,19 @@ export declare function queueOrderLifecycleEmail(input: {
|
|
|
16
17
|
template?: undefined;
|
|
17
18
|
} | {
|
|
18
19
|
skipped: boolean;
|
|
19
|
-
reason: "
|
|
20
|
+
reason: "missing-email";
|
|
20
21
|
orderId?: undefined;
|
|
21
22
|
locale?: undefined;
|
|
22
23
|
template?: undefined;
|
|
23
24
|
} | {
|
|
24
25
|
skipped: boolean;
|
|
25
|
-
|
|
26
|
+
orderId: string;
|
|
27
|
+
locale: string;
|
|
28
|
+
template: string;
|
|
29
|
+
reason?: undefined;
|
|
30
|
+
} | {
|
|
31
|
+
skipped: boolean;
|
|
32
|
+
reason: "provider-disabled";
|
|
26
33
|
orderId?: undefined;
|
|
27
34
|
locale?: undefined;
|
|
28
35
|
template?: undefined;
|
|
@@ -32,12 +39,6 @@ export declare function queueOrderLifecycleEmail(input: {
|
|
|
32
39
|
orderId?: undefined;
|
|
33
40
|
locale?: undefined;
|
|
34
41
|
template?: undefined;
|
|
35
|
-
} | {
|
|
36
|
-
skipped: boolean;
|
|
37
|
-
orderId: string;
|
|
38
|
-
locale: string;
|
|
39
|
-
template: string;
|
|
40
|
-
reason?: undefined;
|
|
41
42
|
}>;
|
|
42
43
|
export declare function resolveOrderIdForPayment(container: ResolveContainer, paymentId: string): Promise<string | null>;
|
|
43
44
|
export declare function resolveRefundEmailContexts(container: ResolveContainer, paymentId: string): Promise<{
|