medusa-plugin-statistics 0.1.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 (44) hide show
  1. package/.medusa/server/medusa-config.d.ts +1 -0
  2. package/.medusa/server/medusa-config.js +23 -0
  3. package/.medusa/server/src/admin/index.js +790 -0
  4. package/.medusa/server/src/admin/index.mjs +789 -0
  5. package/.medusa/server/src/api/admin/mcp/route.d.ts +4 -0
  6. package/.medusa/server/src/api/admin/mcp/route.js +60 -0
  7. package/.medusa/server/src/api/admin/statistics/layout/route.d.ts +4 -0
  8. package/.medusa/server/src/api/admin/statistics/layout/route.js +37 -0
  9. package/.medusa/server/src/api/admin/statistics/low-stock/route.d.ts +3 -0
  10. package/.medusa/server/src/api/admin/statistics/low-stock/route.js +85 -0
  11. package/.medusa/server/src/api/admin/statistics/recalculate/route.d.ts +3 -0
  12. package/.medusa/server/src/api/admin/statistics/recalculate/route.js +32 -0
  13. package/.medusa/server/src/api/admin/statistics/recent-orders/route.d.ts +3 -0
  14. package/.medusa/server/src/api/admin/statistics/recent-orders/route.js +19 -0
  15. package/.medusa/server/src/api/admin/statistics/route.d.ts +3 -0
  16. package/.medusa/server/src/api/admin/statistics/route.js +55 -0
  17. package/.medusa/server/src/api/middlewares.d.ts +2 -0
  18. package/.medusa/server/src/api/middlewares.js +44 -0
  19. package/.medusa/server/src/api/validators.d.ts +85 -0
  20. package/.medusa/server/src/api/validators.js +30 -0
  21. package/.medusa/server/src/jobs/update-statistics.d.ts +7 -0
  22. package/.medusa/server/src/jobs/update-statistics.js +165 -0
  23. package/.medusa/server/src/mcp/server.d.ts +3 -0
  24. package/.medusa/server/src/mcp/server.js +23 -0
  25. package/.medusa/server/src/mcp/tools/customers.d.ts +3 -0
  26. package/.medusa/server/src/mcp/tools/customers.js +72 -0
  27. package/.medusa/server/src/mcp/tools/inventory.d.ts +3 -0
  28. package/.medusa/server/src/mcp/tools/inventory.js +70 -0
  29. package/.medusa/server/src/mcp/tools/orders.d.ts +3 -0
  30. package/.medusa/server/src/mcp/tools/orders.js +80 -0
  31. package/.medusa/server/src/mcp/tools/products.d.ts +3 -0
  32. package/.medusa/server/src/mcp/tools/products.js +72 -0
  33. package/.medusa/server/src/mcp/tools/query.d.ts +3 -0
  34. package/.medusa/server/src/mcp/tools/query.js +42 -0
  35. package/.medusa/server/src/modules/statistics/index.d.ts +22 -0
  36. package/.medusa/server/src/modules/statistics/index.js +25 -0
  37. package/.medusa/server/src/modules/statistics/migrations/Migration20260409171831.d.ts +5 -0
  38. package/.medusa/server/src/modules/statistics/migrations/Migration20260409171831.js +15 -0
  39. package/.medusa/server/src/modules/statistics/models/statistics-daily.d.ts +13 -0
  40. package/.medusa/server/src/modules/statistics/models/statistics-daily.js +18 -0
  41. package/.medusa/server/src/modules/statistics/service.d.ts +18 -0
  42. package/.medusa/server/src/modules/statistics/service.js +9 -0
  43. package/LICENSE +21 -0
  44. package/package.json +97 -0
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.computeStatsForDay = computeStatsForDay;
5
+ exports.default = updateStatisticsJob;
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const statistics_1 = require("../modules/statistics");
8
+ async function computeStatsForDay(container, day) {
9
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
10
+ const statisticsService = container.resolve(statistics_1.STATISTICS_MODULE);
11
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
12
+ const startOfDay = day.toISOString();
13
+ const endOfDay = new Date(Date.UTC(day.getUTCFullYear(), day.getUTCMonth(), day.getUTCDate() + 1)).toISOString();
14
+ logger.info(`statistics: computing stats for ${startOfDay.slice(0, 10)}`);
15
+ // ── Orders & Revenue ────────────────────────────────────────────────
16
+ let revenueTotal = 0;
17
+ let orderCount = 0;
18
+ const productQuantities = {};
19
+ const customerIdsInPeriod = new Set();
20
+ const limit = 100;
21
+ let offset = 0;
22
+ let totalCount = 0;
23
+ do {
24
+ const { data: orders, metadata } = await query.graph({
25
+ entity: 'order',
26
+ fields: [
27
+ 'id', 'total', 'status',
28
+ 'customer.id',
29
+ 'items.*'
30
+ ],
31
+ filters: {
32
+ created_at: { $gte: startOfDay, $lt: endOfDay }
33
+ },
34
+ pagination: { take: limit, skip: offset }
35
+ });
36
+ totalCount = metadata?.count || 0;
37
+ offset += limit;
38
+ for (const order of orders) {
39
+ if (order.status === 'canceled')
40
+ continue;
41
+ orderCount++;
42
+ revenueTotal += order.total ?? 0;
43
+ if (order.customer?.id) {
44
+ customerIdsInPeriod.add(order.customer.id);
45
+ }
46
+ for (const item of order.items ?? []) {
47
+ if (!item?.product_id)
48
+ continue;
49
+ const existing = productQuantities[item.product_id];
50
+ if (existing) {
51
+ existing.quantity += item.quantity ?? 0;
52
+ }
53
+ else {
54
+ productQuantities[item.product_id] = {
55
+ title: item.title ?? '',
56
+ quantity: item.quantity ?? 0
57
+ };
58
+ }
59
+ }
60
+ }
61
+ } while (offset < totalCount);
62
+ const averageOrderValue = orderCount > 0 ? revenueTotal / orderCount : 0;
63
+ // Top 10 products by quantity sold
64
+ const topProducts = Object.entries(productQuantities)
65
+ .map(([product_id, { title, quantity }]) => ({ product_id, title, quantity_sold: quantity }))
66
+ .sort((a, b) => b.quantity_sold - a.quantity_sold)
67
+ .slice(0, 10);
68
+ // ── Customer Counts ─────────────────────────────────────────────────
69
+ let newCustomerCount = 0;
70
+ let customerOffset = 0;
71
+ let customerTotal = 0;
72
+ do {
73
+ const { data: customers, metadata } = await query.graph({
74
+ entity: 'customer',
75
+ fields: ['id'],
76
+ filters: {
77
+ created_at: { $gte: startOfDay, $lt: endOfDay }
78
+ },
79
+ pagination: { take: limit, skip: customerOffset }
80
+ });
81
+ customerTotal = metadata?.count || 0;
82
+ customerOffset += limit;
83
+ newCustomerCount += customers.length;
84
+ } while (customerOffset < customerTotal);
85
+ // Returning = customers who placed orders in period but were created before it
86
+ let returningCustomerCount = 0;
87
+ for (const customerId of customerIdsInPeriod) {
88
+ const { data: [customer] } = await query.graph({
89
+ entity: 'customer',
90
+ fields: ['id', 'created_at'],
91
+ filters: { id: customerId }
92
+ });
93
+ if (customer && new Date(customer.created_at) < day) {
94
+ returningCustomerCount++;
95
+ }
96
+ }
97
+ // ── Pending Fulfillment ─────────────────────────────────────────────
98
+ let pendingFulfillmentCount = 0;
99
+ let pendingOffset = 0;
100
+ let pendingTotal = 0;
101
+ do {
102
+ const { data: orders, metadata } = await query.graph({
103
+ entity: 'order',
104
+ fields: ['id'],
105
+ filters: {
106
+ status: { $nin: ['completed', 'canceled', 'archived'] }
107
+ },
108
+ pagination: { take: limit, skip: pendingOffset }
109
+ });
110
+ pendingTotal = metadata?.count || 0;
111
+ pendingOffset += limit;
112
+ pendingFulfillmentCount += orders.length;
113
+ } while (pendingOffset < pendingTotal);
114
+ // ── Low Stock ───────────────────────────────────────────────────────
115
+ const { metadata: lowStockMeta } = await query.graph({
116
+ entity: 'inventory_item',
117
+ fields: ['id'],
118
+ filters: {
119
+ location_levels: {
120
+ stocked_quantity: { $lte: 10 }
121
+ }
122
+ },
123
+ pagination: { take: 1 }
124
+ });
125
+ const lowStockCount = lowStockMeta?.count || 0;
126
+ // ── Upsert ──────────────────────────────────────────────────────────
127
+ const [existing] = await statisticsService.listStatisticsDailies({ date: day }, { take: 1 });
128
+ const statData = {
129
+ date: day,
130
+ revenue_total: revenueTotal,
131
+ order_count: orderCount,
132
+ average_order_value: averageOrderValue,
133
+ new_customer_count: newCustomerCount,
134
+ returning_customer_count: returningCustomerCount,
135
+ pending_fulfillment_count: pendingFulfillmentCount,
136
+ low_stock_count: lowStockCount,
137
+ top_products: topProducts
138
+ };
139
+ if (existing) {
140
+ await statisticsService.updateStatisticsDailies({ id: existing.id, ...statData });
141
+ }
142
+ else {
143
+ await statisticsService.createStatisticsDailies(statData);
144
+ }
145
+ logger.info(`statistics: ${startOfDay.slice(0, 10)} — ` +
146
+ `revenue: ${revenueTotal}, orders: ${orderCount}, AOV: ${averageOrderValue.toFixed(2)}, ` +
147
+ `new customers: ${newCustomerCount}, returning: ${returningCustomerCount}, ` +
148
+ `pending fulfillment: ${pendingFulfillmentCount}, low stock: ${lowStockCount}`);
149
+ }
150
+ async function updateStatisticsJob(container) {
151
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
152
+ try {
153
+ const now = new Date();
154
+ const yesterday = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() - 1));
155
+ await computeStatsForDay(container, yesterday);
156
+ }
157
+ catch (error) {
158
+ logger.error(`statistics: failed to update stats: ${error.message}`);
159
+ }
160
+ }
161
+ exports.config = {
162
+ name: 'update-statistics',
163
+ schedule: '0 1 * * *'
164
+ };
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXN0YXRpc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy91cGRhdGUtc3RhdGlzdGljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxnREFzS0M7QUFFRCxzQ0FTQztBQXJMRCxxREFBcUU7QUFDckUsc0RBQXlEO0FBR2xELEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxTQUEwQixFQUFFLEdBQVM7SUFDN0UsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLGlCQUFpQixHQUFzQixTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFDLENBQUE7SUFDakYsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVoRSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBRWhILE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUV6RSx1RUFBdUU7SUFDdkUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFBO0lBQ3BCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQTtJQUNsQixNQUFNLGlCQUFpQixHQUF3RCxFQUFFLENBQUE7SUFDakYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO0lBRTdDLE1BQU0sS0FBSyxH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
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { MedusaContainer } from '@medusajs/framework/types';
3
+ export declare const createMcpServer: (scope: MedusaContainer) => McpServer;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMcpServer = void 0;
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const query_1 = require("./tools/query");
6
+ const orders_1 = require("./tools/orders");
7
+ const customers_1 = require("./tools/customers");
8
+ const products_1 = require("./tools/products");
9
+ const inventory_1 = require("./tools/inventory");
10
+ const createMcpServer = (scope) => {
11
+ const server = new mcp_js_1.McpServer({
12
+ name: 'medusa-admin',
13
+ version: '1.0.0'
14
+ });
15
+ (0, query_1.registerQueryTool)(server, scope);
16
+ (0, orders_1.registerOrderTools)(server, scope);
17
+ (0, customers_1.registerCustomerTools)(server, scope);
18
+ (0, products_1.registerProductTools)(server, scope);
19
+ (0, inventory_1.registerInventoryTools)(server, scope);
20
+ return server;
21
+ };
22
+ exports.createMcpServer = createMcpServer;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21jcC9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0VBQW1FO0FBRW5FLHlDQUFpRDtBQUNqRCwyQ0FBbUQ7QUFDbkQsaURBQXlEO0FBQ3pELCtDQUF1RDtBQUN2RCxpREFBMEQ7QUFFbkQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFzQixFQUFhLEVBQUU7SUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBUyxDQUFDO1FBQzVCLElBQUksRUFBRSxjQUFjO1FBQ3BCLE9BQU8sRUFBRSxPQUFPO0tBQ2hCLENBQUMsQ0FBQTtJQUVGLElBQUEseUJBQWlCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLElBQUEsMkJBQWtCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2pDLElBQUEsaUNBQXFCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLElBQUEsK0JBQW9CLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ25DLElBQUEsa0NBQXNCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRXJDLE9BQU8sTUFBTSxDQUFBO0FBQ2QsQ0FBQyxDQUFBO0FBYlksUUFBQSxlQUFlLG1CQWEzQiJ9
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { MedusaContainer } from '@medusajs/framework/types';
3
+ export declare function registerCustomerTools(server: McpServer, scope: MedusaContainer): void;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerCustomerTools = registerCustomerTools;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const zod_1 = require("zod");
6
+ function registerCustomerTools(server, scope) {
7
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
8
+ server.registerTool('search_customers', {
9
+ description: 'Search customers by email or name.',
10
+ inputSchema: {
11
+ q: zod_1.z.string().describe('Search term (matches email, first_name, or last_name)'),
12
+ limit: zod_1.z.coerce.number().int().min(1).max(50).optional().default(10)
13
+ }
14
+ }, async ({ q, limit }) => {
15
+ const { data } = await query.graph({
16
+ entity: 'customer',
17
+ fields: [
18
+ 'id',
19
+ 'email',
20
+ 'first_name',
21
+ 'last_name',
22
+ 'phone',
23
+ 'has_account',
24
+ 'created_at'
25
+ ],
26
+ filters: {
27
+ $or: [
28
+ { email: { $ilike: `%${q}%` } },
29
+ { first_name: { $ilike: `%${q}%` } },
30
+ { last_name: { $ilike: `%${q}%` } }
31
+ ]
32
+ },
33
+ pagination: { take: limit }
34
+ });
35
+ return {
36
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
37
+ };
38
+ });
39
+ server.registerTool('get_customer', {
40
+ description: 'Fetch a single customer by ID with their order history.',
41
+ inputSchema: {
42
+ customer_id: zod_1.z.string().describe('The customer ID')
43
+ }
44
+ }, async ({ customer_id }) => {
45
+ const { data: [customer] } = await query.graph({
46
+ entity: 'customer',
47
+ fields: [
48
+ 'id',
49
+ 'email',
50
+ 'first_name',
51
+ 'last_name',
52
+ 'phone',
53
+ 'has_account',
54
+ 'orders.id',
55
+ 'orders.display_id',
56
+ 'orders.status',
57
+ 'orders.total',
58
+ 'orders.created_at',
59
+ 'created_at',
60
+ 'updated_at'
61
+ ],
62
+ filters: { id: customer_id }
63
+ });
64
+ if (!customer) {
65
+ return { content: [{ type: 'text', text: 'Customer not found.' }] };
66
+ }
67
+ return {
68
+ content: [{ type: 'text', text: JSON.stringify(customer, null, 2) }]
69
+ };
70
+ });
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL21jcC90b29scy9jdXN0b21lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxzREFnRkM7QUFuRkQscURBQXFFO0FBQ3JFLDZCQUF1QjtBQUV2QixTQUFnQixxQkFBcUIsQ0FBQyxNQUFpQixFQUFFLEtBQXNCO0lBQzlFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsa0JBQWtCLEVBQ2xCO1FBQ0MsV0FBVyxFQUFFLG9DQUFvQztRQUNqRCxXQUFXLEVBQUU7WUFDWixDQUFDLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx1REFBdUQsQ0FBQztZQUMvRSxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDcEU7S0FDRCxFQUNELEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQ3RCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxFQUFFLFVBQVU7WUFDbEIsTUFBTSxFQUFFO2dCQUNQLElBQUk7Z0JBQ0osT0FBTztnQkFDUCxZQUFZO2dCQUNaLFdBQVc7Z0JBQ1gsT0FBTztnQkFDUCxhQUFhO2dCQUNiLFlBQVk7YUFDWjtZQUNELE9BQU8sRUFBRTtnQkFDUixHQUFHLEVBQUU7b0JBQ0osRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUMvQixFQUFFLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ3BDLEVBQUUsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTtpQkFDbkM7YUFDRDtZQUNELFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7U0FDM0IsQ0FBQyxDQUFBO1FBRUYsT0FBTztZQUNOLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDekUsQ0FBQTtJQUNGLENBQUMsQ0FDRCxDQUFBO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsY0FBYyxFQUNkO1FBQ0MsV0FBVyxFQUFFLHlEQUF5RDtRQUN0RSxXQUFXLEVBQUU7WUFDWixXQUFXLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztTQUNuRDtLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRTtRQUN6QixNQUFNLEVBQ0wsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQ2hCLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLE1BQU0sRUFBRTtnQkFDUCxJQUFJO2dCQUNKLE9BQU87Z0JBQ1AsWUFBWTtnQkFDWixXQUFXO2dCQUNYLE9BQU87Z0JBQ1AsYUFBYTtnQkFDYixXQUFXO2dCQUNYLG1CQUFtQjtnQkFDbkIsZUFBZTtnQkFDZixjQUFjO2dCQUNkLG1CQUFtQjtnQkFDbkIsWUFBWTtnQkFDWixZQUFZO2FBQ1o7WUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFO1NBQzVCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLENBQUMsRUFBRSxDQUFBO1FBQzdFLENBQUM7UUFFRCxPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM3RSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7QUFDRixDQUFDIn0=
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { MedusaContainer } from '@medusajs/framework/types';
3
+ export declare function registerInventoryTools(server: McpServer, scope: MedusaContainer): void;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerInventoryTools = registerInventoryTools;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const zod_1 = require("zod");
6
+ function registerInventoryTools(server, scope) {
7
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
8
+ server.registerTool('low_stock_items', {
9
+ description: 'Find inventory items with stock levels at or below a threshold.',
10
+ inputSchema: {
11
+ threshold: zod_1.z.coerce.number().int().min(0).optional().default(10),
12
+ limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(20)
13
+ }
14
+ }, async ({ threshold, limit }) => {
15
+ const { data } = await query.graph({
16
+ entity: 'inventory_item',
17
+ fields: [
18
+ 'id',
19
+ 'sku',
20
+ 'title',
21
+ 'location_levels.id',
22
+ 'location_levels.stocked_quantity',
23
+ 'location_levels.reserved_quantity',
24
+ 'location_levels.stock_location.id',
25
+ 'location_levels.stock_location.name'
26
+ ],
27
+ filters: {
28
+ location_levels: {
29
+ stocked_quantity: { $lte: threshold }
30
+ }
31
+ },
32
+ pagination: { take: limit }
33
+ });
34
+ return {
35
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
36
+ };
37
+ });
38
+ server.registerTool('get_inventory_item', {
39
+ description: 'Fetch a single inventory item by ID with stock levels across locations.',
40
+ inputSchema: {
41
+ inventory_item_id: zod_1.z.string().describe('The inventory item ID')
42
+ }
43
+ }, async ({ inventory_item_id }) => {
44
+ const { data: [item] } = await query.graph({
45
+ entity: 'inventory_item',
46
+ fields: [
47
+ 'id',
48
+ 'sku',
49
+ 'title',
50
+ 'requires_shipping',
51
+ 'location_levels.id',
52
+ 'location_levels.stocked_quantity',
53
+ 'location_levels.reserved_quantity',
54
+ 'location_levels.incoming_quantity',
55
+ 'location_levels.stock_location.id',
56
+ 'location_levels.stock_location.name',
57
+ 'created_at',
58
+ 'updated_at'
59
+ ],
60
+ filters: { id: inventory_item_id }
61
+ });
62
+ if (!item) {
63
+ return { content: [{ type: 'text', text: 'Inventory item not found.' }] };
64
+ }
65
+ return {
66
+ content: [{ type: 'text', text: JSON.stringify(item, null, 2) }]
67
+ };
68
+ });
69
+ }
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52ZW50b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL21jcC90b29scy9pbnZlbnRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSx3REE4RUM7QUFqRkQscURBQXFFO0FBQ3JFLDZCQUF1QjtBQUV2QixTQUFnQixzQkFBc0IsQ0FBQyxNQUFpQixFQUFFLEtBQXNCO0lBQy9FLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsaUJBQWlCLEVBQ2pCO1FBQ0MsV0FBVyxFQUFFLGlFQUFpRTtRQUM5RSxXQUFXLEVBQUU7WUFDWixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDckU7S0FDRCxFQUNELEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzlCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxFQUFFLGdCQUFnQjtZQUN4QixNQUFNLEVBQUU7Z0JBQ1AsSUFBSTtnQkFDSixLQUFLO2dCQUNMLE9BQU87Z0JBQ1Asb0JBQW9CO2dCQUNwQixrQ0FBa0M7Z0JBQ2xDLG1DQUFtQztnQkFDbkMsbUNBQW1DO2dCQUNuQyxxQ0FBcUM7YUFDckM7WUFDRCxPQUFPLEVBQUU7Z0JBQ1IsZUFBZSxFQUFFO29CQUNoQixnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7aUJBQ3JDO2FBQ007WUFDUixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1NBQzNCLENBQUMsQ0FBQTtRQUVGLE9BQU87WUFDTixPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3pFLENBQUE7SUFDRixDQUFDLENBQ0QsQ0FBQTtJQUVELE1BQU0sQ0FBQyxZQUFZLENBQ2xCLG9CQUFvQixFQUNwQjtRQUNDLFdBQVcsRUFBRSx5RUFBeUU7UUFDdEYsV0FBVyxFQUFFO1lBQ1osaUJBQWlCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztTQUMvRDtLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFO1FBQy9CLE1BQU0sRUFDTCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFDWixHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLE1BQU0sRUFBRTtnQkFDUCxJQUFJO2dCQUNKLEtBQUs7Z0JBQ0wsT0FBTztnQkFDUCxtQkFBbUI7Z0JBQ25CLG9CQUFvQjtnQkFDcEIsa0NBQWtDO2dCQUNsQyxtQ0FBbUM7Z0JBQ25DLG1DQUFtQztnQkFDbkMsbUNBQW1DO2dCQUNuQyxxQ0FBcUM7Z0JBQ3JDLFlBQVk7Z0JBQ1osWUFBWTthQUNaO1lBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFO1NBQ2xDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLENBQUMsRUFBRSxDQUFBO1FBQ25GLENBQUM7UUFFRCxPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7QUFDRixDQUFDIn0=
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { MedusaContainer } from '@medusajs/framework/types';
3
+ export declare function registerOrderTools(server: McpServer, scope: MedusaContainer): void;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerOrderTools = registerOrderTools;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const zod_1 = require("zod");
6
+ function registerOrderTools(server, scope) {
7
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
8
+ server.registerTool('recent_orders', {
9
+ description: 'Fetch recent orders with status, totals, and customer info.',
10
+ inputSchema: {
11
+ limit: zod_1.z.coerce.number().int().min(1).max(50).optional().default(10),
12
+ status: zod_1.z.string().optional().describe('Filter by order status')
13
+ }
14
+ }, async ({ limit, status }) => {
15
+ const { data } = await query.graph({
16
+ entity: 'order',
17
+ fields: [
18
+ 'id',
19
+ 'display_id',
20
+ 'status',
21
+ 'email',
22
+ 'total',
23
+ 'subtotal',
24
+ 'tax_total',
25
+ 'shipping_total',
26
+ 'customer.first_name',
27
+ 'customer.last_name',
28
+ 'created_at'
29
+ ],
30
+ filters: (status ? { status } : {}),
31
+ pagination: { take: limit, order: { created_at: 'DESC' } }
32
+ });
33
+ return {
34
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
35
+ };
36
+ });
37
+ server.registerTool('get_order', {
38
+ description: 'Fetch a single order by ID with full details including items, fulfillments, and customer.',
39
+ inputSchema: {
40
+ order_id: zod_1.z.string().describe('The order ID')
41
+ }
42
+ }, async ({ order_id }) => {
43
+ const { data: [order] } = await query.graph({
44
+ entity: 'order',
45
+ fields: [
46
+ 'id',
47
+ 'display_id',
48
+ 'status',
49
+ 'email',
50
+ 'total',
51
+ 'subtotal',
52
+ 'tax_total',
53
+ 'shipping_total',
54
+ 'discount_total',
55
+ 'customer.id',
56
+ 'customer.first_name',
57
+ 'customer.last_name',
58
+ 'customer.email',
59
+ 'items.id',
60
+ 'items.title',
61
+ 'items.quantity',
62
+ 'items.unit_price',
63
+ 'shipping_address.*',
64
+ 'billing_address.*',
65
+ 'fulfillments.id',
66
+ 'fulfillments.status',
67
+ 'created_at',
68
+ 'updated_at'
69
+ ],
70
+ filters: { id: order_id }
71
+ });
72
+ if (!order) {
73
+ return { content: [{ type: 'text', text: 'Order not found.' }] };
74
+ }
75
+ return {
76
+ content: [{ type: 'text', text: JSON.stringify(order, null, 2) }]
77
+ };
78
+ });
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL21jcC90b29scy9vcmRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxnREF3RkM7QUEzRkQscURBQXFFO0FBQ3JFLDZCQUF1QjtBQUV2QixTQUFnQixrQkFBa0IsQ0FBQyxNQUFpQixFQUFFLEtBQXNCO0lBQzNFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsZUFBZSxFQUNmO1FBQ0MsV0FBVyxFQUFFLDZEQUE2RDtRQUMxRSxXQUFXLEVBQUU7WUFDWixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7U0FDaEU7S0FDRCxFQUNELEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQzNCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ1AsSUFBSTtnQkFDSixZQUFZO2dCQUNaLFFBQVE7Z0JBQ1IsT0FBTztnQkFDUCxPQUFPO2dCQUNQLFVBQVU7Z0JBQ1YsV0FBVztnQkFDWCxnQkFBZ0I7Z0JBQ2hCLHFCQUFxQjtnQkFDckIsb0JBQW9CO2dCQUNwQixZQUFZO2FBQ1o7WUFDRCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBUTtZQUMxQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRTtTQUMxRCxDQUFDLENBQUE7UUFFRixPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUNsQixXQUFXLEVBQ1g7UUFDQyxXQUFXLEVBQUUsMkZBQTJGO1FBQ3hHLFdBQVcsRUFBRTtZQUNaLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztTQUM3QztLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUN0QixNQUFNLEVBQ0wsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQ2IsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDckIsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ1AsSUFBSTtnQkFDSixZQUFZO2dCQUNaLFFBQVE7Z0JBQ1IsT0FBTztnQkFDUCxPQUFPO2dCQUNQLFVBQVU7Z0JBQ1YsV0FBVztnQkFDWCxnQkFBZ0I7Z0JBQ2hCLGdCQUFnQjtnQkFDaEIsYUFBYTtnQkFDYixxQkFBcUI7Z0JBQ3JCLG9CQUFvQjtnQkFDcEIsZ0JBQWdCO2dCQUNoQixVQUFVO2dCQUNWLGFBQWE7Z0JBQ2IsZ0JBQWdCO2dCQUNoQixrQkFBa0I7Z0JBQ2xCLG9CQUFvQjtnQkFDcEIsbUJBQW1CO2dCQUNuQixpQkFBaUI7Z0JBQ2pCLHFCQUFxQjtnQkFDckIsWUFBWTtnQkFDWixZQUFZO2FBQ1o7WUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFO1NBQ3pCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNaLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLENBQUMsRUFBRSxDQUFBO1FBQzFFLENBQUM7UUFFRCxPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMxRSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7QUFDRixDQUFDIn0=
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { MedusaContainer } from '@medusajs/framework/types';
3
+ export declare function registerProductTools(server: McpServer, scope: MedusaContainer): void;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerProductTools = registerProductTools;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const zod_1 = require("zod");
6
+ function registerProductTools(server, scope) {
7
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
8
+ server.registerTool('search_products', {
9
+ description: 'Search products by title.',
10
+ inputSchema: {
11
+ q: zod_1.z.string().describe('Search term (matches title)'),
12
+ limit: zod_1.z.coerce.number().int().min(1).max(50).optional().default(10)
13
+ }
14
+ }, async ({ q, limit }) => {
15
+ const { data } = await query.graph({
16
+ entity: 'product',
17
+ fields: [
18
+ 'id',
19
+ 'title',
20
+ 'handle',
21
+ 'status',
22
+ 'variants.id',
23
+ 'variants.title',
24
+ 'variants.sku',
25
+ 'created_at'
26
+ ],
27
+ filters: { title: { $ilike: `%${q}%` } },
28
+ pagination: { take: limit }
29
+ });
30
+ return {
31
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
32
+ };
33
+ });
34
+ server.registerTool('get_product', {
35
+ description: 'Fetch a single product by ID with variants and pricing.',
36
+ inputSchema: {
37
+ product_id: zod_1.z.string().describe('The product ID')
38
+ }
39
+ }, async ({ product_id }) => {
40
+ const { data: [product] } = await query.graph({
41
+ entity: 'product',
42
+ fields: [
43
+ 'id',
44
+ 'title',
45
+ 'handle',
46
+ 'subtitle',
47
+ 'description',
48
+ 'status',
49
+ 'variants.id',
50
+ 'variants.title',
51
+ 'variants.sku',
52
+ 'variants.prices.amount',
53
+ 'variants.prices.currency_code',
54
+ 'options.id',
55
+ 'options.title',
56
+ 'options.values.value',
57
+ 'tags.id',
58
+ 'tags.value',
59
+ 'created_at',
60
+ 'updated_at'
61
+ ],
62
+ filters: { id: product_id }
63
+ });
64
+ if (!product) {
65
+ return { content: [{ type: 'text', text: 'Product not found.' }] };
66
+ }
67
+ return {
68
+ content: [{ type: 'text', text: JSON.stringify(product, null, 2) }]
69
+ };
70
+ });
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbWNwL3Rvb2xzL3Byb2R1Y3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0Esb0RBZ0ZDO0FBbkZELHFEQUFxRTtBQUNyRSw2QkFBdUI7QUFFdkIsU0FBZ0Isb0JBQW9CLENBQUMsTUFBaUIsRUFBRSxLQUFzQjtJQUM3RSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTVELE1BQU0sQ0FBQyxZQUFZLENBQ2xCLGlCQUFpQixFQUNqQjtRQUNDLFdBQVcsRUFBRSwyQkFBMkI7UUFDeEMsV0FBVyxFQUFFO1lBQ1osQ0FBQyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUM7WUFDckQsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ3BFO0tBQ0QsRUFDRCxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUN0QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRTtnQkFDUCxJQUFJO2dCQUNKLE9BQU87Z0JBQ1AsUUFBUTtnQkFDUixRQUFRO2dCQUNSLGFBQWE7Z0JBQ2IsZ0JBQWdCO2dCQUNoQixjQUFjO2dCQUNkLFlBQVk7YUFDWjtZQUNELE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDeEMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtTQUMzQixDQUFDLENBQUE7UUFFRixPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUNsQixhQUFhLEVBQ2I7UUFDQyxXQUFXLEVBQUUseURBQXlEO1FBQ3RFLFdBQVcsRUFBRTtZQUNaLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1NBQ2pEO0tBQ0QsRUFDRCxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sRUFDTCxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFDZixHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQixNQUFNLEVBQUUsU0FBUztZQUNqQixNQUFNLEVBQUU7Z0JBQ1AsSUFBSTtnQkFDSixPQUFPO2dCQUNQLFFBQVE7Z0JBQ1IsVUFBVTtnQkFDVixhQUFhO2dCQUNiLFFBQVE7Z0JBQ1IsYUFBYTtnQkFDYixnQkFBZ0I7Z0JBQ2hCLGNBQWM7Z0JBQ2Qsd0JBQXdCO2dCQUN4QiwrQkFBK0I7Z0JBQy9CLFlBQVk7Z0JBQ1osZUFBZTtnQkFDZixzQkFBc0I7Z0JBQ3RCLFNBQVM7Z0JBQ1QsWUFBWTtnQkFDWixZQUFZO2dCQUNaLFlBQVk7YUFDWjtZQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUU7U0FDM0IsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQWUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLENBQUE7UUFDNUUsQ0FBQztRQUVELE9BQU87WUFDTixPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzVFLENBQUE7SUFDRixDQUFDLENBQ0QsQ0FBQTtBQUNGLENBQUMifQ==
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { MedusaContainer } from '@medusajs/framework/types';
3
+ export declare function registerQueryTool(server: McpServer, scope: MedusaContainer): void;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerQueryTool = registerQueryTool;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const zod_1 = require("zod");
6
+ const ALLOWED_ENTITIES = [
7
+ 'order', 'product', 'product_variant', 'customer', 'inventory_item',
8
+ 'fulfillment', 'cart', 'shipping_option', 'sales_channel', 'store',
9
+ 'form', 'form_submission', 'review', 'complaint', 'complaint_tag',
10
+ 'content_item', 'content_collection', 'stock_lot', 'serial_number',
11
+ 'veeqo_order', 'veeqo_shipment', 'webhook_trigger', 'webhook_action',
12
+ 'barcode', 'order_note', 'customer_tag'
13
+ ];
14
+ function registerQueryTool(server, scope) {
15
+ server.registerTool('query', {
16
+ description: `Run a query against any Medusa entity using query.graph(). Allowed entities: ${ALLOWED_ENTITIES.join(', ')}. ` +
17
+ 'Use dot notation for relations (e.g. "customer.first_name"). ' +
18
+ 'Filters support operators: $eq, $ne, $in, $nin, $like, $ilike, $gt, $gte, $lt, $lte.',
19
+ inputSchema: {
20
+ entity: zod_1.z.enum(ALLOWED_ENTITIES),
21
+ fields: zod_1.z.array(zod_1.z.string()).min(1).describe('Fields to return, e.g. ["id", "email", "orders.id"]'),
22
+ filters: zod_1.z.record(zod_1.z.unknown()).optional().describe('Filter conditions, e.g. { status: "completed" }'),
23
+ limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(20),
24
+ offset: zod_1.z.coerce.number().int().min(0).optional().default(0)
25
+ }
26
+ }, async ({ entity, fields, filters, limit, offset }) => {
27
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
28
+ const { data, metadata } = await query.graph({
29
+ entity,
30
+ fields,
31
+ filters: filters ?? {},
32
+ pagination: { take: limit, skip: offset }
33
+ });
34
+ return {
35
+ content: [{
36
+ type: 'text',
37
+ text: JSON.stringify({ data, count: metadata?.count ?? data.length, limit, offset }, null, 2)
38
+ }]
39
+ };
40
+ });
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbWNwL3Rvb2xzL3F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBY0EsOENBa0NDO0FBOUNELHFEQUFxRTtBQUNyRSw2QkFBdUI7QUFFdkIsTUFBTSxnQkFBZ0IsR0FBRztJQUN4QixPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxnQkFBZ0I7SUFDbkUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsT0FBTztJQUNsRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlO0lBQ2pFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsZUFBZTtJQUNsRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCO0lBQ3BFLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYztDQUN2QyxDQUFBO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsTUFBaUIsRUFBRSxLQUFzQjtJQUMxRSxNQUFNLENBQUMsWUFBWSxDQUNsQixPQUFPLEVBQ1A7UUFDQyxXQUFXLEVBQ1YsZ0ZBQWdGLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUMvRywrREFBK0Q7WUFDL0Qsc0ZBQXNGO1FBQ3ZGLFdBQVcsRUFBRTtZQUNaLE1BQU0sRUFBRSxPQUFDLENBQUMsSUFBSSxDQUFDLGdCQUF5QyxDQUFDO1lBQ3pELE1BQU0sRUFBRSxPQUFDLENBQUMsS0FBSyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMscURBQXFELENBQUM7WUFDbEcsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGlEQUFpRCxDQUFDO1lBQ3JHLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM1RDtLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7UUFDcEQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU1RCxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM1QyxNQUFNO1lBQ04sTUFBTTtZQUNOLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtZQUN0QixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7U0FDekMsQ0FBQyxDQUFBO1FBRUYsT0FBTztZQUNOLE9BQU8sRUFBRSxDQUFDO29CQUNULElBQUksRUFBRSxNQUFlO29CQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RixDQUFDO1NBQ0YsQ0FBQTtJQUNGLENBQUMsQ0FDRCxDQUFBO0FBQ0YsQ0FBQyJ9
@@ -0,0 +1,22 @@
1
+ import { StatisticsService } from './service';
2
+ export declare const STATISTICS_MODULE = "statistics";
3
+ declare const _default: import("@medusajs/types").ModuleExports<typeof StatisticsService> & {
4
+ linkable: {
5
+ readonly statisticsDaily: {
6
+ id: {
7
+ serviceName: "statistics";
8
+ field: "statisticsDaily";
9
+ linkable: "statistics_daily_id";
10
+ primaryKey: "id";
11
+ };
12
+ toJSON: () => {
13
+ serviceName: "statistics";
14
+ field: "statisticsDaily";
15
+ linkable: "statistics_daily_id";
16
+ primaryKey: "id";
17
+ };
18
+ };
19
+ };
20
+ };
21
+ export default _default;
22
+ export * from './service';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.STATISTICS_MODULE = void 0;
18
+ const utils_1 = require("@medusajs/framework/utils");
19
+ const service_1 = require("./service");
20
+ exports.STATISTICS_MODULE = 'statistics';
21
+ exports.default = (0, utils_1.Module)(exports.STATISTICS_MODULE, {
22
+ service: service_1.StatisticsService
23
+ });
24
+ __exportStar(require("./service"), exports);
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zdGF0aXN0aWNzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHVDQUE2QztBQUVoQyxRQUFBLGlCQUFpQixHQUFHLFlBQVksQ0FBQTtBQUU3QyxrQkFBZSxJQUFBLGNBQU0sRUFBQyx5QkFBaUIsRUFBRTtJQUN4QyxPQUFPLEVBQUUsMkJBQWlCO0NBQzFCLENBQUMsQ0FBQTtBQUVGLDRDQUF5QiJ9