medusa-plugin-mcp 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 +192 -0
  4. package/.medusa/server/src/admin/index.mjs +191 -0
  5. package/.medusa/server/src/api/admin/chat/route.d.ts +3 -0
  6. package/.medusa/server/src/api/admin/chat/route.js +102 -0
  7. package/.medusa/server/src/api/admin/mcp/route.d.ts +4 -0
  8. package/.medusa/server/src/api/admin/mcp/route.js +60 -0
  9. package/.medusa/server/src/api/middlewares.d.ts +2 -0
  10. package/.medusa/server/src/api/middlewares.js +24 -0
  11. package/.medusa/server/src/api/validators.d.ts +24 -0
  12. package/.medusa/server/src/api/validators.js +11 -0
  13. package/.medusa/server/src/lib/llm-provider.d.ts +32 -0
  14. package/.medusa/server/src/lib/llm-provider.js +22 -0
  15. package/.medusa/server/src/lib/providers/anthropic.d.ts +11 -0
  16. package/.medusa/server/src/lib/providers/anthropic.js +53 -0
  17. package/.medusa/server/src/lib/providers/ollama.d.ts +11 -0
  18. package/.medusa/server/src/lib/providers/ollama.js +39 -0
  19. package/.medusa/server/src/lib/providers/openai.d.ts +12 -0
  20. package/.medusa/server/src/lib/providers/openai.js +49 -0
  21. package/.medusa/server/src/mcp/server.d.ts +3 -0
  22. package/.medusa/server/src/mcp/server.js +42 -0
  23. package/.medusa/server/src/mcp/tools/automations.d.ts +3 -0
  24. package/.medusa/server/src/mcp/tools/automations.js +176 -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/mcp/tools/statistics.d.ts +3 -0
  36. package/.medusa/server/src/mcp/tools/statistics.js +10 -0
  37. package/.medusa/server/src/modules/mcp/index.d.ts +7 -0
  38. package/.medusa/server/src/modules/mcp/index.js +25 -0
  39. package/.medusa/server/src/modules/mcp/service.d.ts +8 -0
  40. package/.medusa/server/src/modules/mcp/service.js +15 -0
  41. package/.medusa/server/src/types.d.ts +7 -0
  42. package/.medusa/server/src/types.js +3 -0
  43. package/LICENSE.md +73 -0
  44. package/package.json +98 -0
@@ -0,0 +1,32 @@
1
+ export type ChatMessage = {
2
+ role: 'user' | 'assistant';
3
+ content: string;
4
+ };
5
+ export type ToolDefinition = {
6
+ name: string;
7
+ description: string;
8
+ inputSchema: Record<string, unknown>;
9
+ };
10
+ export type ToolCall = {
11
+ name: string;
12
+ args: Record<string, unknown>;
13
+ };
14
+ export type LlmResponse = {
15
+ content: string;
16
+ toolCalls: ToolCall[];
17
+ };
18
+ export interface LlmProvider {
19
+ /**
20
+ * Send a single turn to the LLM. If the LLM wants to call tools,
21
+ * return the tool calls in the response. The caller handles
22
+ * the tool-use loop.
23
+ */
24
+ chat(params: {
25
+ messages: ChatMessage[];
26
+ tools: ToolDefinition[];
27
+ systemPrompt: string;
28
+ }): Promise<LlmResponse>;
29
+ }
30
+ import type { McpPluginOptions } from '../types';
31
+ export type { McpPluginOptions };
32
+ export declare function createProvider(options: McpPluginOptions): LlmProvider;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProvider = createProvider;
4
+ function createProvider(options) {
5
+ switch (options.provider) {
6
+ case 'anthropic': {
7
+ const { AnthropicProvider } = require('./providers/anthropic');
8
+ return new AnthropicProvider(options.model, options.apiKey, options.baseUrl);
9
+ }
10
+ case 'openai': {
11
+ const { OpenAiProvider } = require('./providers/openai');
12
+ return new OpenAiProvider(options.model, options.apiKey, options.baseUrl);
13
+ }
14
+ case 'ollama': {
15
+ const { OllamaProvider } = require('./providers/ollama');
16
+ return new OllamaProvider(options.model, options.baseUrl);
17
+ }
18
+ default:
19
+ throw new Error(`Unknown LLM provider: ${options.provider}`);
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGxtLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9sbG0tcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxQ0Esd0NBaUJDO0FBakJELFNBQWdCLGNBQWMsQ0FBQyxPQUF5QjtJQUN2RCxRQUFRLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQixLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDbEIsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUE7WUFDOUQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDOUUsQ0FBQztRQUNELEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNmLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtZQUN4RCxPQUFPLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0UsQ0FBQztRQUNELEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNmLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtZQUN4RCxPQUFPLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzFELENBQUM7UUFDRDtZQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzlELENBQUM7QUFDRixDQUFDIn0=
@@ -0,0 +1,11 @@
1
+ import type { LlmProvider, ChatMessage, ToolDefinition, LlmResponse } from '../llm-provider';
2
+ export declare class AnthropicProvider implements LlmProvider {
3
+ private model;
4
+ private client;
5
+ constructor(model: string, apiKey: string, baseUrl?: string);
6
+ chat(params: {
7
+ messages: ChatMessage[];
8
+ tools: ToolDefinition[];
9
+ systemPrompt: string;
10
+ }): Promise<LlmResponse>;
11
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AnthropicProvider = void 0;
7
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
+ class AnthropicProvider {
9
+ constructor(model, apiKey, baseUrl) {
10
+ this.model = model;
11
+ this.client = new sdk_1.default({
12
+ apiKey,
13
+ ...(baseUrl ? { baseURL: baseUrl } : {})
14
+ });
15
+ }
16
+ async chat(params) {
17
+ const tools = params.tools.map(t => ({
18
+ name: t.name,
19
+ description: t.description,
20
+ input_schema: t.inputSchema
21
+ }));
22
+ const messages = params.messages.map(m => ({
23
+ role: m.role,
24
+ content: m.content
25
+ }));
26
+ const response = await this.client.messages.create({
27
+ model: this.model,
28
+ max_tokens: 4096,
29
+ system: params.systemPrompt,
30
+ messages,
31
+ ...(tools.length > 0 ? { tools } : {})
32
+ });
33
+ const textParts = [];
34
+ const toolCalls = [];
35
+ for (const block of response.content) {
36
+ if (block.type === 'text') {
37
+ textParts.push(block.text);
38
+ }
39
+ else if (block.type === 'tool_use') {
40
+ toolCalls.push({
41
+ name: block.name,
42
+ args: block.input
43
+ });
44
+ }
45
+ }
46
+ return {
47
+ content: textParts.join(''),
48
+ toolCalls
49
+ };
50
+ }
51
+ }
52
+ exports.AnthropicProvider = AnthropicProvider;
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9wcm92aWRlcnMvYW50aHJvcGljLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDREQUF5QztBQUd6QyxNQUFhLGlCQUFpQjtJQUc3QixZQUNTLEtBQWEsRUFDckIsTUFBYyxFQUNkLE9BQWdCO1FBRlIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUlyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksYUFBUyxDQUFDO1lBQzNCLE1BQU07WUFDTixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3hDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BSVY7UUFDQSxNQUFNLEtBQUssR0FBcUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztZQUMxQixZQUFZLEVBQUUsQ0FBQyxDQUFDLFdBQXlDO1NBQ3pELENBQUMsQ0FBQyxDQUFBO1FBRUgsTUFBTSxRQUFRLEdBQTZCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDWixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87U0FDbEIsQ0FBQyxDQUFDLENBQUE7UUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNsRCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsVUFBVSxFQUFFLElBQUk7WUFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQzNCLFFBQVE7WUFDUixHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN0QyxDQUFDLENBQUE7UUFFRixNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUE7UUFDOUIsTUFBTSxTQUFTLEdBQWUsRUFBRSxDQUFBO1FBRWhDLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDM0IsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3RDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQWdDO2lCQUM1QyxDQUFDLENBQUE7WUFDSCxDQUFDO1FBQ0YsQ0FBQztRQUVELE9BQU87WUFDTixPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDM0IsU0FBUztTQUNULENBQUE7SUFDRixDQUFDO0NBQ0Q7QUF6REQsOENBeURDIn0=
@@ -0,0 +1,11 @@
1
+ import type { LlmProvider, ChatMessage, ToolDefinition, LlmResponse } from '../llm-provider';
2
+ export declare class OllamaProvider implements LlmProvider {
3
+ private model;
4
+ private client;
5
+ constructor(model: string, baseUrl?: string);
6
+ chat(params: {
7
+ messages: ChatMessage[];
8
+ tools: ToolDefinition[];
9
+ systemPrompt: string;
10
+ }): Promise<LlmResponse>;
11
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OllamaProvider = void 0;
4
+ const ollama_1 = require("ollama");
5
+ class OllamaProvider {
6
+ constructor(model, baseUrl) {
7
+ this.model = model;
8
+ this.client = new ollama_1.Ollama(baseUrl ? { host: baseUrl } : undefined);
9
+ }
10
+ async chat(params) {
11
+ const messages = [
12
+ { role: 'system', content: params.systemPrompt },
13
+ ...params.messages
14
+ ];
15
+ const tools = params.tools.map(t => ({
16
+ type: 'function',
17
+ function: {
18
+ name: t.name,
19
+ description: t.description,
20
+ parameters: t.inputSchema
21
+ }
22
+ }));
23
+ const response = await this.client.chat({
24
+ model: this.model,
25
+ messages,
26
+ ...(tools.length > 0 ? { tools } : {})
27
+ });
28
+ const toolCalls = (response.message.tool_calls ?? []).map(tc => ({
29
+ name: tc.function.name,
30
+ args: tc.function.arguments
31
+ }));
32
+ return {
33
+ content: response.message.content ?? '',
34
+ toolCalls
35
+ };
36
+ }
37
+ }
38
+ exports.OllamaProvider = OllamaProvider;
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2xsYW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9wcm92aWRlcnMvb2xsYW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUErQjtBQUcvQixNQUFhLGNBQWM7SUFHMUIsWUFDUyxLQUFhLEVBQ3JCLE9BQWdCO1FBRFIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUdyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BSVY7UUFDQSxNQUFNLFFBQVEsR0FBNkM7WUFDMUQsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ2hELEdBQUcsTUFBTSxDQUFDLFFBQVE7U0FDbEIsQ0FBQTtRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQyxJQUFJLEVBQUUsVUFBbUI7WUFDekIsUUFBUSxFQUFFO2dCQUNULElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDWixXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7Z0JBQzFCLFVBQVUsRUFBRSxDQUFDLENBQUMsV0FBVzthQUN6QjtTQUNELENBQUMsQ0FBQyxDQUFBO1FBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUN2QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsUUFBUTtZQUNSLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3RDLENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RSxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQ3RCLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQW9DO1NBQ3RELENBQUMsQ0FBQyxDQUFBO1FBRUgsT0FBTztZQUNOLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFO1lBQ3ZDLFNBQVM7U0FDVCxDQUFBO0lBQ0YsQ0FBQztDQUNEO0FBN0NELHdDQTZDQyJ9
@@ -0,0 +1,12 @@
1
+ import OpenAI from 'openai';
2
+ import type { LlmProvider, ChatMessage, ToolDefinition, LlmResponse } from '../llm-provider';
3
+ export declare class OpenAiProvider implements LlmProvider {
4
+ protected model: string;
5
+ protected client: OpenAI;
6
+ constructor(model: string, apiKey: string, baseUrl?: string);
7
+ chat(params: {
8
+ messages: ChatMessage[];
9
+ tools: ToolDefinition[];
10
+ systemPrompt: string;
11
+ }): Promise<LlmResponse>;
12
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAiProvider = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ class OpenAiProvider {
9
+ constructor(model, apiKey, baseUrl) {
10
+ this.model = model;
11
+ this.client = new openai_1.default({
12
+ apiKey,
13
+ ...(baseUrl ? { baseURL: baseUrl } : {})
14
+ });
15
+ }
16
+ async chat(params) {
17
+ const tools = params.tools.map(t => ({
18
+ type: 'function',
19
+ function: {
20
+ name: t.name,
21
+ description: t.description,
22
+ parameters: t.inputSchema
23
+ }
24
+ }));
25
+ const messages = [
26
+ { role: 'system', content: params.systemPrompt },
27
+ ...params.messages.map(m => ({
28
+ role: m.role,
29
+ content: m.content
30
+ }))
31
+ ];
32
+ const response = await this.client.chat.completions.create({
33
+ model: this.model,
34
+ messages,
35
+ ...(tools.length > 0 ? { tools } : {})
36
+ });
37
+ const choice = response.choices[0];
38
+ const toolCalls = (choice.message.tool_calls ?? []).map(tc => ({
39
+ name: tc.function.name,
40
+ args: JSON.parse(tc.function.arguments)
41
+ }));
42
+ return {
43
+ content: choice.message.content ?? '',
44
+ toolCalls
45
+ };
46
+ }
47
+ }
48
+ exports.OpenAiProvider = OpenAiProvider;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9wcm92aWRlcnMvb3BlbmFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUEyQjtBQUczQixNQUFhLGNBQWM7SUFHMUIsWUFDVyxLQUFhLEVBQ3ZCLE1BQWMsRUFDZCxPQUFnQjtRQUZOLFVBQUssR0FBTCxLQUFLLENBQVE7UUFJdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGdCQUFNLENBQUM7WUFDeEIsTUFBTTtZQUNOLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDeEMsQ0FBQyxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFJVjtRQUNBLE1BQU0sS0FBSyxHQUFnQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakUsSUFBSSxFQUFFLFVBQW1CO1lBQ3pCLFFBQVEsRUFBRTtnQkFDVCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Z0JBQ1osV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO2dCQUMxQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFdBQVc7YUFDekI7U0FDRCxDQUFDLENBQUMsQ0FBQTtRQUVILE1BQU0sUUFBUSxHQUF3QztZQUNyRCxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDaEQsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBNEI7Z0JBQ3BDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTzthQUNsQixDQUFDLENBQUM7U0FDSCxDQUFBO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQzFELEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixRQUFRO1lBQ1IsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNsQyxNQUFNLFNBQVMsR0FBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSTtZQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztTQUN2QyxDQUFDLENBQUMsQ0FBQTtRQUVILE9BQU87WUFDTixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRTtZQUNyQyxTQUFTO1NBQ1QsQ0FBQTtJQUNGLENBQUM7Q0FDRDtBQXJERCx3Q0FxREMifQ==
@@ -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) => Promise<McpServer>;
@@ -0,0 +1,42 @@
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 statistics_1 = require("./tools/statistics");
11
+ const automations_1 = require("./tools/automations");
12
+ const createMcpServer = async (scope) => {
13
+ const server = new mcp_js_1.McpServer({
14
+ name: 'medusa-admin',
15
+ version: '1.0.0'
16
+ });
17
+ // Core tools — always available (only need Medusa container query API)
18
+ (0, query_1.registerQueryTool)(server, scope);
19
+ (0, orders_1.registerOrderTools)(server, scope);
20
+ (0, customers_1.registerCustomerTools)(server, scope);
21
+ (0, products_1.registerProductTools)(server, scope);
22
+ (0, inventory_1.registerInventoryTools)(server, scope);
23
+ // Statistics tools — registered if medusa-plugin-statistics is installed
24
+ try {
25
+ const { STATISTICS_MODULE } = await import('medusa-plugin-statistics');
26
+ (0, statistics_1.registerStatisticsTools)(server, scope, STATISTICS_MODULE);
27
+ }
28
+ catch {
29
+ // package not installed — skip
30
+ }
31
+ // Automation tools — registered if medusa-plugin-automation is installed
32
+ try {
33
+ const { AUTOMATION_MODULE } = await import('medusa-plugin-automation');
34
+ (0, automations_1.registerAutomationTools)(server, scope, AUTOMATION_MODULE);
35
+ }
36
+ catch {
37
+ // package not installed — skip
38
+ }
39
+ return server;
40
+ };
41
+ exports.createMcpServer = createMcpServer;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21jcC9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0VBQW1FO0FBRW5FLHlDQUFpRDtBQUNqRCwyQ0FBbUQ7QUFDbkQsaURBQXlEO0FBQ3pELCtDQUF1RDtBQUN2RCxpREFBMEQ7QUFDMUQsbURBQTREO0FBQzVELHFEQUE2RDtBQUV0RCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQUUsS0FBc0IsRUFBc0IsRUFBRTtJQUNuRixNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFTLENBQUM7UUFDNUIsSUFBSSxFQUFFLGNBQWM7UUFDcEIsT0FBTyxFQUFFLE9BQU87S0FDaEIsQ0FBQyxDQUFBO0lBRUYsdUVBQXVFO0lBQ3ZFLElBQUEseUJBQWlCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLElBQUEsMkJBQWtCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2pDLElBQUEsaUNBQXFCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLElBQUEsK0JBQW9CLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ25DLElBQUEsa0NBQXNCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRXJDLHlFQUF5RTtJQUN6RSxJQUFJLENBQUM7UUFDSixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBQ3RFLElBQUEsb0NBQXVCLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0lBQzFELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUiwrQkFBK0I7SUFDaEMsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxJQUFJLENBQUM7UUFDSixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBQ3RFLElBQUEscUNBQXVCLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0lBQzFELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUiwrQkFBK0I7SUFDaEMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2QsQ0FBQyxDQUFBO0FBOUJZLFFBQUEsZUFBZSxtQkE4QjNCIn0=
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { MedusaContainer } from '@medusajs/framework/types';
3
+ export declare function registerAutomationTools(server: McpServer, scope: MedusaContainer, moduleKey: string): void;
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerAutomationTools = registerAutomationTools;
4
+ const zod_1 = require("zod");
5
+ const dispatch_1 = require("medusa-plugin-automation/lib/dispatch");
6
+ function registerAutomationTools(server, scope, moduleKey) {
7
+ const automationService = scope.resolve(moduleKey);
8
+ server.registerTool('list_automations', {
9
+ description: 'List automation triggers with their status, type, and event configuration.',
10
+ inputSchema: {
11
+ is_active: zod_1.z.boolean().optional().describe('Filter by active status'),
12
+ limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(20)
13
+ }
14
+ }, async ({ is_active, limit }) => {
15
+ const filters = {};
16
+ if (is_active !== undefined)
17
+ filters.is_active = is_active;
18
+ const [triggers, count] = await automationService.listAndCountAutomationTriggers(filters, { take: limit, order: { created_at: 'DESC' } });
19
+ return {
20
+ content: [{
21
+ type: 'text',
22
+ text: JSON.stringify({ triggers, count }, null, 2)
23
+ }]
24
+ };
25
+ });
26
+ server.registerTool('get_automation', {
27
+ description: 'Fetch a single automation trigger by ID with its actions.',
28
+ inputSchema: {
29
+ trigger_id: zod_1.z.string().describe('The automation trigger ID')
30
+ }
31
+ }, async ({ trigger_id }) => {
32
+ const [trigger] = await automationService.listAutomationTriggers({ id: trigger_id }, { take: 1 });
33
+ if (!trigger) {
34
+ return { content: [{ type: 'text', text: 'Trigger not found.' }] };
35
+ }
36
+ const [actions] = await automationService.listAndCountAutomationActions({ trigger_id: trigger.id }, { take: 100 });
37
+ return {
38
+ content: [{
39
+ type: 'text',
40
+ text: JSON.stringify({ trigger, actions }, null, 2)
41
+ }]
42
+ };
43
+ });
44
+ server.registerTool('list_automation_deliveries', {
45
+ description: 'View delivery history for an automation action. Filter by status and date range.',
46
+ inputSchema: {
47
+ action_id: zod_1.z.string().describe('The automation action ID'),
48
+ status: zod_1.z.enum(['pending', 'success', 'failed']).optional().describe('Filter by delivery status'),
49
+ since: zod_1.z.string().optional().describe('Only include deliveries after this ISO date'),
50
+ until: zod_1.z.string().optional().describe('Only include deliveries before this ISO date'),
51
+ limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(20)
52
+ }
53
+ }, async ({ action_id, status, since, until, limit }) => {
54
+ const filters = { action_id };
55
+ if (status)
56
+ filters.status = status;
57
+ if (since || until) {
58
+ filters.created_at = {
59
+ ...(since ? { $gte: new Date(since) } : {}),
60
+ ...(until ? { $lte: new Date(until) } : {})
61
+ };
62
+ }
63
+ const [deliveries, count] = await automationService.listAndCountAutomationDeliveries(filters, { take: limit, order: { created_at: 'DESC' } });
64
+ return {
65
+ content: [{
66
+ type: 'text',
67
+ text: JSON.stringify({ deliveries, count }, null, 2)
68
+ }]
69
+ };
70
+ });
71
+ server.registerTool('trigger_automation', {
72
+ description: 'Manually fire all active actions on an automation trigger with a given payload.',
73
+ inputSchema: {
74
+ trigger_id: zod_1.z.string().describe('The automation trigger ID'),
75
+ payload: zod_1.z.record(zod_1.z.unknown()).optional().default({}).describe('The payload to dispatch')
76
+ }
77
+ }, async ({ trigger_id, payload }) => {
78
+ const [trigger] = await automationService.listAutomationTriggers({ id: trigger_id }, { take: 1 });
79
+ if (!trigger) {
80
+ return { content: [{ type: 'text', text: 'Trigger not found.' }] };
81
+ }
82
+ const [actions] = await automationService.listAndCountAutomationActions({ trigger_id: trigger.id, is_active: true }, { take: 100 });
83
+ if (actions.length === 0) {
84
+ return { content: [{ type: 'text', text: 'No active actions on this trigger.' }] };
85
+ }
86
+ const results = await Promise.allSettled(actions.map((action) => (0, dispatch_1.dispatchAndRecord)(scope, action, payload, `mcp:trigger_automation`, {
87
+ signOutgoing: true,
88
+ maxWorkflowIterations: automationService.getOptions?.()?.maxWorkflowIterations
89
+ })));
90
+ const succeeded = results.filter(r => r.status === 'fulfilled' && r.value.status === 'success').length;
91
+ const failed = results.length - succeeded;
92
+ return {
93
+ content: [{
94
+ type: 'text',
95
+ text: JSON.stringify({
96
+ triggered: actions.length,
97
+ succeeded,
98
+ failed
99
+ }, null, 2)
100
+ }]
101
+ };
102
+ });
103
+ server.registerTool('retry_deliveries', {
104
+ description: 'Replay failed deliveries using their stored request payloads. Provide specific delivery IDs or filters to select which deliveries to retry.',
105
+ inputSchema: {
106
+ delivery_ids: zod_1.z.array(zod_1.z.string()).optional().describe('Specific delivery IDs to retry'),
107
+ action_id: zod_1.z.string().optional().describe('Filter by action ID (required when not using delivery_ids)'),
108
+ status: zod_1.z.enum(['pending', 'success', 'failed']).optional().describe('Filter by delivery status'),
109
+ since: zod_1.z.string().optional().describe('Only retry deliveries after this ISO date'),
110
+ until: zod_1.z.string().optional().describe('Only retry deliveries before this ISO date')
111
+ }
112
+ }, async ({ delivery_ids, action_id, status, since, until }) => {
113
+ let deliveries;
114
+ if (delivery_ids && delivery_ids.length > 0) {
115
+ ;
116
+ [deliveries] = await automationService.listAndCountAutomationDeliveries({ id: delivery_ids }, { take: delivery_ids.length });
117
+ }
118
+ else if (action_id) {
119
+ const filters = { action_id };
120
+ if (status)
121
+ filters.status = status;
122
+ if (since || until) {
123
+ filters.created_at = {
124
+ ...(since ? { $gte: new Date(since) } : {}),
125
+ ...(until ? { $lte: new Date(until) } : {})
126
+ };
127
+ }
128
+ ;
129
+ [deliveries] = await automationService.listAndCountAutomationDeliveries(filters, { take: 1000, order: { created_at: 'ASC' } });
130
+ }
131
+ else {
132
+ return {
133
+ content: [{
134
+ type: 'text',
135
+ text: 'Provide either delivery_ids or action_id to select deliveries to retry.'
136
+ }]
137
+ };
138
+ }
139
+ if (deliveries.length === 0) {
140
+ return { content: [{ type: 'text', text: 'No matching deliveries found.' }] };
141
+ }
142
+ // Group by action_id and fetch each action once
143
+ const actionIds = [...new Set(deliveries.map((d) => d.action_id))];
144
+ const actionMap = new Map();
145
+ for (const aid of actionIds) {
146
+ const [action] = await automationService.listAutomationActions({ id: aid }, { take: 1 });
147
+ if (action)
148
+ actionMap.set(aid, action);
149
+ }
150
+ let succeeded = 0;
151
+ let failed = 0;
152
+ for (const delivery of deliveries) {
153
+ const action = actionMap.get(delivery.action_id);
154
+ if (!action) {
155
+ failed++;
156
+ continue;
157
+ }
158
+ const payload = delivery.request_payload ?? {};
159
+ const result = await (0, dispatch_1.dispatchAndRecord)(scope, action, payload, `retry:${delivery.event_name ?? 'unknown'}`, {
160
+ signOutgoing: true,
161
+ maxWorkflowIterations: automationService.getOptions?.()?.maxWorkflowIterations
162
+ });
163
+ if (result.status === 'success')
164
+ succeeded++;
165
+ else
166
+ failed++;
167
+ }
168
+ return {
169
+ content: [{
170
+ type: 'text',
171
+ text: JSON.stringify({ retried: deliveries.length, succeeded, failed }, null, 2)
172
+ }]
173
+ };
174
+ });
175
+ }
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b21hdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbWNwL3Rvb2xzL2F1dG9tYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0EsMERBbVBDO0FBdFBELDZCQUF1QjtBQUN2QixvRUFBeUU7QUFFekUsU0FBZ0IsdUJBQXVCLENBQ3RDLE1BQWlCLEVBQ2pCLEtBQXNCLEVBQ3RCLFNBQWlCO0lBRWpCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQVEsQ0FBQTtJQUV6RCxNQUFNLENBQUMsWUFBWSxDQUNsQixrQkFBa0IsRUFDbEI7UUFDQyxXQUFXLEVBQUUsNEVBQTRFO1FBQ3pGLFdBQVcsRUFBRTtZQUNaLFNBQVMsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDO1lBQ3JFLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUNyRTtLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDOUIsTUFBTSxPQUFPLEdBQTRCLEVBQUUsQ0FBQTtRQUMzQyxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFFMUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLGlCQUFpQixDQUFDLDhCQUE4QixDQUMvRSxPQUFPLEVBQ1AsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUM5QyxD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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 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;