rolldev_magento_cli
Execute Magento CLI commands inside a PHP-FPM container for your project. Specify the project path, command, and optional arguments or log output to a file.
Instructions
Run roll magento command inside the php-fpm container
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | Yes | Path to the project directory | |
| command | Yes | Magento CLI command (without 'bin/magento' prefix) | |
| args | No | Additional arguments for the command | |
| save_output_to_file | No | Save full output to a log file for later investigation (useful for long output) |
Implementation Reference
- server.js:205-237 (registration)Tool 'rolldev_magento_cli' registered in the ListToolsRequestSchema handler with name, description, and inputSchema (schema including project_path, command, args, save_output_to_file).
{ name: "rolldev_magento_cli", description: "Run roll magento command inside the php-fpm container", inputSchema: { type: "object", properties: { project_path: { type: "string", description: "Path to the project directory", }, command: { type: "string", description: "Magento CLI command (without 'bin/magento' prefix)", }, args: { type: "array", description: "Additional arguments for the command", items: { type: "string", }, default: [], }, save_output_to_file: { type: "boolean", description: "Save full output to a log file for later investigation (useful for long output)", default: false, }, }, required: ["project_path", "command"], }, }, - server.js:588-607 (handler)The runMagentoCli method implements the tool handler. It builds a 'roll magento <command>' CLI call via executeRollCommand with a 5-minute timeout, executing inside the php-fpm container.
async runMagentoCli(args) { const { project_path, command, args: commandArgs = [], save_output_to_file = false } = args; const rollCommand = [ "magento", command, ...commandArgs, ]; // 5 minute timeout for most Magento commands const timeoutMs = 300000; return await this.executeRollCommand( project_path, rollCommand, `Running Magento CLI: roll magento ${command}`, timeoutMs, save_output_to_file, ); } - server.js:208-236 (schema)Input schema for rolldev_magento_cli: requires project_path (string) and command (string), accepts optional args (array of strings) and save_output_to_file (boolean, default false).
inputSchema: { type: "object", properties: { project_path: { type: "string", description: "Path to the project directory", }, command: { type: "string", description: "Magento CLI command (without 'bin/magento' prefix)", }, args: { type: "array", description: "Additional arguments for the command", items: { type: "string", }, default: [], }, save_output_to_file: { type: "boolean", description: "Save full output to a log file for later investigation (useful for long output)", default: false, }, }, required: ["project_path", "command"], }, - server.js:742-857 (helper)executeRollCommand is a shared helper used by runMagentoCli and other tools. It runs 'roll <args>' via spawn, handles file-saving of output, and formats the response.
async executeRollCommand(project_path, rollArgs, description, timeoutMs = 300000, saveToFile = false) { if (!project_path) { throw new Error("project_path is required"); } const normalizedProjectPath = project_path.replace(/\/+$/, ""); const absoluteProjectPath = resolve(normalizedProjectPath); if (!existsSync(absoluteProjectPath)) { throw new Error( `Project directory does not exist: ${absoluteProjectPath}`, ); } try { const result = await this.executeCommand( "roll", rollArgs, absoluteProjectPath, timeoutMs, ); const commandStr = `roll ${rollArgs.join(" ")}`; const isSuccess = result.code === 0; // Save output to file only when explicitly requested const logFilePath = saveToFile ? this.saveOutputToFile(result.stdout, result.stderr, commandStr, absoluteProjectPath) : null; let responseText; if (logFilePath) { // Output saved to file const outputPreview = (result.stdout || "").substring(0, 500); const stderrPreview = (result.stderr || "").substring(0, 500); responseText = `${description} ${isSuccess ? "completed successfully" : "failed"}! Command: ${commandStr} Working directory: ${absoluteProjectPath} Exit Code: ${result.code}${result.timedOut ? " (TIMED OUT)" : ""} 📁 Full output saved to file: ${logFilePath} Output Preview (first 500 chars): ${outputPreview || "(no output)"}${(result.stdout || "").length > 500 ? "\n...(truncated)" : ""} Errors Preview (first 500 chars): ${stderrPreview || "(no errors)"}${(result.stderr || "").length > 500 ? "\n...(truncated)" : ""}`; } else { // Return inline output responseText = `${description} ${isSuccess ? "completed successfully" : "failed"}! Command: ${commandStr} Working directory: ${absoluteProjectPath} Exit Code: ${result.code}${result.timedOut ? " (TIMED OUT)" : ""} Output: ${result.stdout || "(no output)"} Errors: ${result.stderr || "(no errors)"}`; } return { content: [ { type: "text", text: responseText, }, ], isError: !isSuccess, }; } catch (error) { const commandStr = `roll ${rollArgs.join(" ")}`; // Save error output to file only when explicitly requested const logFilePath = saveToFile ? this.saveOutputToFile(error.stdout, error.stderr, commandStr, absoluteProjectPath) : null; let responseText; if (logFilePath) { responseText = `Failed to execute command: Command: ${commandStr} Working directory: ${absoluteProjectPath} Error: ${error.message} 📁 Full output saved to file: ${logFilePath}`; } else { responseText = `Failed to execute command: Command: ${commandStr} Working directory: ${absoluteProjectPath} Error: ${error.message} Output: ${error.stdout || "(no output)"} Errors: ${error.stderr || "(no errors)"}`; } return { content: [ { type: "text", text: responseText, }, ], isError: true, }; } } - server.js:309-310 (handler)Case statement in CallToolRequestSchema dispatching to runMagentoCli when tool name is 'rolldev_magento_cli'.
case "rolldev_magento_cli": return await this.runMagentoCli(request.params.arguments);