dev-module-create
Create and register a new Magento 2 module with customizable components including blocks, helpers, models, and setup files for extending e-commerce functionality.
Instructions
Create and register a new Magento 2 module
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| addAll | No | Add blocks, helpers and models | |
| addBlocks | No | Add blocks | |
| addComposer | No | Add a composer.json file to generated module | |
| addHelpers | No | Add helpers | |
| addModels | No | Add models | |
| addReadme | No | Add a readme.md file to generated module | |
| addSetup | No | Add SQL setup | |
| addStrictTypes | No | Add strict_types declaration to generated PHP files | |
| authorEmail | No | Author email for readme.md or composer.json | |
| authorName | No | Author for readme.md or composer.json | |
| description | No | Description for readme.md or composer.json | |
| enable | No | Enable module after creation | |
| minimal | No | Create only module file | |
| modman | No | Create all files in folder with a modman file | |
| moduleName | Yes | Name of your module | |
| vendorNamespace | Yes | Namespace (your company prefix) |
Implementation Reference
- src/index.ts:489-638 (registration)Registration of the 'dev-module-create' tool with the MCP server, specifying name, metadata, input schema, and handler function.server.registerTool( "dev-module-create", { title: "Module Create", description: "Create and register a new Magento 2 module", inputSchema: { vendorNamespace: z.string() .describe("Namespace (your company prefix)"), moduleName: z.string() .describe("Name of your module"), minimal: z.boolean() .optional() .describe("Create only module file"), addBlocks: z.boolean() .optional() .describe("Add blocks"), addHelpers: z.boolean() .optional() .describe("Add helpers"), addModels: z.boolean() .optional() .describe("Add models"), addSetup: z.boolean() .optional() .describe("Add SQL setup"), addAll: z.boolean() .optional() .describe("Add blocks, helpers and models"), enable: z.boolean() .optional() .describe("Enable module after creation"), modman: z.boolean() .optional() .describe("Create all files in folder with a modman file"), addReadme: z.boolean() .optional() .describe("Add a readme.md file to generated module"), addComposer: z.boolean() .optional() .describe("Add a composer.json file to generated module"), addStrictTypes: z.boolean() .optional() .describe("Add strict_types declaration to generated PHP files"), authorName: z.string() .optional() .describe("Author for readme.md or composer.json"), authorEmail: z.string() .optional() .describe("Author email for readme.md or composer.json"), description: z.string() .optional() .describe("Description for readme.md or composer.json") } }, async ({ vendorNamespace, moduleName, minimal, addBlocks, addHelpers, addModels, addSetup, addAll, enable, modman, addReadme, addComposer, addStrictTypes, authorName, authorEmail, description }) => { let command = `magerun2 dev:module:create "${vendorNamespace}" "${moduleName}"`; if (minimal) { command += ` --minimal`; } if (addBlocks) { command += ` --add-blocks`; } if (addHelpers) { command += ` --add-helpers`; } if (addModels) { command += ` --add-models`; } if (addSetup) { command += ` --add-setup`; } if (addAll) { command += ` --add-all`; } if (enable) { command += ` --enable`; } if (modman) { command += ` --modman`; } if (addReadme) { command += ` --add-readme`; } if (addComposer) { command += ` --add-composer`; } if (addStrictTypes) { command += ` --add-strict-types`; } if (authorName) { command += ` --author-name="${authorName}"`; } if (authorEmail) { command += ` --author-email="${authorEmail}"`; } if (description) { command += ` --description="${description}"`; } const result = await executeMagerun2Command(command); if (!result.success) { return { content: [{ type: "text", text: result.error }], isError: true }; } return { content: [{ type: "text", text: `Module ${vendorNamespace}_${moduleName} created successfully:\n\n${result.data}` }] }; } );
- src/index.ts:494-541 (schema)Input schema definition using Zod for validating parameters like vendorNamespace, moduleName, and various optional flags for module creation options.inputSchema: { vendorNamespace: z.string() .describe("Namespace (your company prefix)"), moduleName: z.string() .describe("Name of your module"), minimal: z.boolean() .optional() .describe("Create only module file"), addBlocks: z.boolean() .optional() .describe("Add blocks"), addHelpers: z.boolean() .optional() .describe("Add helpers"), addModels: z.boolean() .optional() .describe("Add models"), addSetup: z.boolean() .optional() .describe("Add SQL setup"), addAll: z.boolean() .optional() .describe("Add blocks, helpers and models"), enable: z.boolean() .optional() .describe("Enable module after creation"), modman: z.boolean() .optional() .describe("Create all files in folder with a modman file"), addReadme: z.boolean() .optional() .describe("Add a readme.md file to generated module"), addComposer: z.boolean() .optional() .describe("Add a composer.json file to generated module"), addStrictTypes: z.boolean() .optional() .describe("Add strict_types declaration to generated PHP files"), authorName: z.string() .optional() .describe("Author for readme.md or composer.json"), authorEmail: z.string() .optional() .describe("Author email for readme.md or composer.json"), description: z.string() .optional() .describe("Description for readme.md or composer.json") }
- src/index.ts:543-637 (handler)Handler function that builds and executes the 'magerun2 dev:module:create' command with user-provided options, handles errors, and formats the response.async ({ vendorNamespace, moduleName, minimal, addBlocks, addHelpers, addModels, addSetup, addAll, enable, modman, addReadme, addComposer, addStrictTypes, authorName, authorEmail, description }) => { let command = `magerun2 dev:module:create "${vendorNamespace}" "${moduleName}"`; if (minimal) { command += ` --minimal`; } if (addBlocks) { command += ` --add-blocks`; } if (addHelpers) { command += ` --add-helpers`; } if (addModels) { command += ` --add-models`; } if (addSetup) { command += ` --add-setup`; } if (addAll) { command += ` --add-all`; } if (enable) { command += ` --enable`; } if (modman) { command += ` --modman`; } if (addReadme) { command += ` --add-readme`; } if (addComposer) { command += ` --add-composer`; } if (addStrictTypes) { command += ` --add-strict-types`; } if (authorName) { command += ` --author-name="${authorName}"`; } if (authorEmail) { command += ` --author-email="${authorEmail}"`; } if (description) { command += ` --description="${description}"`; } const result = await executeMagerun2Command(command); if (!result.success) { return { content: [{ type: "text", text: result.error }], isError: true }; } return { content: [{ type: "text", text: `Module ${vendorNamespace}_${moduleName} created successfully:\n\n${result.data}` }] }; }
- src/index.ts:28-88 (helper)Shared helper function used by 'dev-module-create' (and other tools) to execute magerun2 commands safely with timeout, error handling, and optional JSON parsing.async function executeMagerun2Command(command: string, parseJson: boolean = false): Promise<{ success: true; data: any; rawOutput: string; } | { success: false; error: string; isError: true; }> { try { const { stdout, stderr } = await execAsync(command, { cwd: process.cwd(), timeout: 30000 // 30 second timeout }); if (stderr && stderr.trim()) { console.error("magerun2 stderr:", stderr); } if (parseJson) { try { return { success: true, data: JSON.parse(stdout), rawOutput: stdout }; } catch (parseError) { return { success: false, error: `Error parsing magerun2 JSON output: ${parseError}\n\nRaw output:\n${stdout}`, isError: true }; } } return { success: true, data: stdout.trim(), rawOutput: stdout }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); // Check if magerun2 is not found if (errorMessage.includes("command not found") || errorMessage.includes("not recognized")) { return { success: false, error: "Error: magerun2 command not found. Please ensure n98-magerun2 is installed and available in your PATH.\n\nInstallation instructions: https://github.com/netz98/n98-magerun2", isError: true }; } // Check if not in Magento directory if (errorMessage.includes("not a Magento installation") || errorMessage.includes("app/etc/env.php")) { return { success: false, error: "Error: Current directory does not appear to be a Magento 2 installation. Please run this command from your Magento 2 root directory.", isError: true }; } return { success: false, error: `Error executing magerun2 command: ${errorMessage}`, isError: true }; } }