Skip to main content
Glama

execute_command

Execute system commands and retrieve their output, supporting persistent shell sessions or new instances for isolated operations.

Instructions

Execute a command and return its output. Commands run in a persistent shell session by default. Use newSession: true to run in a new shell instance.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
commandYes
newSessionNo

Implementation Reference

  • Main handler logic for the 'execute_command' tool. Parses input arguments using the schema, determines whether to use a new shell session or the persistent shell, spawns the process, captures stdout/stderr, handles output markers for persistent sessions, and resolves with the command output and error status.
    if (name === "execute_command") {
        const parsed = ExecuteCommandArgsSchema.safeParse(args);
        if (!parsed.success) {
            throw new Error(`Invalid arguments for execute_command: ${parsed.error}`);
        }
    
        return new Promise((resolve) => {
            const useNewSession = parsed.data.newSession || false;
            const isWindows = platform() === 'win32';
            
            if (useNewSession) {
                const cmdProcess = spawn(isWindows ? 'cmd' : '/bin/sh', [], {
                    windowsHide: true,
                });
    
                let output = '';
                let errorOutput = '';
    
                cmdProcess.stdout.on('data', (data) => {
                    output += data.toString();
                });
    
                cmdProcess.stderr.on('data', (data) => {
                    errorOutput += data.toString();
                });
    
                cmdProcess.on('error', (error) => {
                    resolve({
                        content: [{ 
                            type: "text", 
                            text: `Failed to execute command: ${error.message}`
                        }],
                        isError: true,
                    });
                });
    
                cmdProcess.stdin.write(parsed.data.command + '\n');
                cmdProcess.stdin.end();
    
                cmdProcess.on('close', (code) => {
                    const finalOutput = output + (errorOutput ? `\nErrors:\n${errorOutput}` : '');
                    resolve({
                        content: [{ 
                            type: "text", 
                            text: finalOutput || `Command completed with code ${code}`
                        }],
                        isError: code !== 0,
                    });
                });
            } else {
                if (!persistentCmd) {
                    initializePersistentCmd();
                }
    
                if (!persistentCmd) {
                    throw new Error("Failed to initialize persistent CMD session");
                }
    
                let output = '';
                let errorOutput = '';
                let commandComplete = false;
    
                const outputMarker = `__CMD_OUTPUT_${Date.now()}__`;
                const markerCommand = isWindows ? `echo ${outputMarker}` : `echo "${outputMarker}"`;
    
                const dataHandler = (data: Buffer) => {
                    const str = data.toString();
                    if (str.includes(outputMarker)) {
                        commandComplete = true;
                        return;
                    }
                    if (!commandComplete) {
                        output += str;
                    }
                };
    
                const errorHandler = (data: Buffer) => {
                    errorOutput += data.toString();
                };
    
                persistentCmd.stdout?.on('data', dataHandler);
                persistentCmd.stderr?.on('data', errorHandler);
    
                persistentCmd.stdin?.write(parsed.data.command + '\n' + markerCommand + '\n');
    
                const checkInterval = setInterval(() => {
                    if (commandComplete) {
                        clearInterval(checkInterval);
                        persistentCmd?.stdout?.removeListener('data', dataHandler);
                        persistentCmd?.stderr?.removeListener('data', errorHandler);
    
                        const finalOutput = output + (errorOutput ? `\nErrors:\n${errorOutput}` : '');
                        resolve({
                            content: [{ 
                                type: "text", 
                                text: finalOutput || "Command completed"
                            }],
                            isError: false,
                        });
                    }
                }, 50);
    
                setTimeout(() => {
                    if (!commandComplete) {
                        clearInterval(checkInterval);
                        persistentCmd?.stdout?.removeListener('data', dataHandler);
                        persistentCmd?.stderr?.removeListener('data', errorHandler);
                        resolve({
                            content: [{ 
                                type: "text", 
                                text: "Command timed out"
                            }],
                            isError: true,
                        });
                    }
                }, 30000);
            }
        });
  • Zod schema defining the input parameters for the execute_command tool: 'command' (required string) and 'newSession' (optional boolean). Used for validation and JSON schema generation.
    const ExecuteCommandArgsSchema = z.object({
        command: z.string(),
        newSession: z.boolean().optional(),
    });
  • src/index.ts:163-168 (registration)
    Tool registration in the ListToolsRequestSchema handler. Specifies the tool name, description, and input schema for the MCP server.
        name: "execute_command",
        description: "Execute a command and return its output. " +
            "Commands run in a persistent shell session by default. " +
            "Use newSession: true to run in a new shell instance.",
        inputSchema: zodToJsonSchema(ExecuteCommandArgsSchema),
    },
  • Helper function to initialize the persistent shell process (cmd.exe on Windows or /bin/sh on Unix), used by the execute_command handler for non-newSession executions. Handles process events and error cleanup.
    function initializePersistentCmd() {
        const isWindows = platform() === 'win32';
        if (persistentCmd) return;
    
        const shell = isWindows ? 
            join(process.env.SystemRoot || 'C:\\Windows', 'System32', 'cmd.exe') : 
            '/bin/sh';
    
        persistentCmd = spawn(isWindows ? 'cmd.exe' : '/bin/sh', [], {
            windowsHide: true,
            shell: true  // This ensures proper path resolution
        });
    
        persistentCmd.on('error', (error) => {
            console.error('Error in persistent CMD:', error);
            persistentCmd = null;
        });
    
        persistentCmd.on('exit', () => {
            persistentCmd = null;
        });
    }
Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/PhialsBasement/CMD-MCP-Server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server