Skip to main content
Glama
g0t4

mcp-server-commands

by g0t4

run_command

Execute Linux commands on a machine to run scripts, manage files, or process input through STDIN from a specified working directory.

Instructions

Run a command on this linux machine

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
commandYesCommand with args
workdirNoOptional, current working directory
stdinNoOptional, text to pipe into the command's STDIN. For example, pass a python script to python3. Or, pass text for a new file to the cat command to create it!

Implementation Reference

  • The core handler function `runCommand` that parses args, executes the shell command using `execute` (which uses child_process.exec or execFileWithInput), handles workdir and stdin, catches errors, and returns formatted CallToolResult.
    export type RunCommandArgs = Record<string, unknown> | undefined;
    export async function runCommand(args: RunCommandArgs): Promise<CallToolResult> {
    
        const command = args?.command as string;
        if (!command) {
            const message = "Command is required, current value: " + command;
            return {
                isError: true,
                content: [{ type: "text", text: message }],
            };
        }
    
        const options: ObjectEncodingOptions & ExecOptions = { encoding: "utf8" };
        if (args?.workdir) {
            options.cwd = String(args.workdir);
        }
    
        const stdin = args?.stdin as string;
    
        try {
            const result = await execute(command, stdin, options);
            return {
                content: messagesFor(result),
            };
        } catch (error) {
            // PRN do I want to differentiate non-command related error (i.e. if messagesFor blows up
            //   or presumably if smth else goes wrong with the node code in exec that isn't command related
            //   if so, write a test first
    
            // console.log("ERROR_runCommand", error);
            // ExecException (error + stdout/stderr) merged
            // - IIUC this happens on uncaught failures
            // - but if you catch an exec() promise failure (or use exec's callback) => you get separated values: error, stdout, stderr
            // - which is why I mirror this response type in my reject(error) calls
            //
            // 'error' example:
            // code: 127,
            // killed: false,
            // signal: null,
            // cmd: 'nonexistentcommand',
            // stdout: '',
            // stderr: '/bin/sh: nonexistentcommand: command not found\n'
    
            const response = {
                isError: true,
                content: messagesFor(error as ExecResult),
            };
            always_log("WARN: run_command failed", response);
            return response;
        }
    }
  • The input schema definition for the run_command tool, including properties for command (required), workdir, and stdin.
        name: "run_command",
        description:
            "Run a command on this " + os.platform() + " machine",
        inputSchema: {
            type: "object",
            properties: {
                command: {
                    type: "string",
                    description: "Command with args",
                },
                workdir: {
                    // previous run_command calls can probe the filesystem and find paths to change to
                    type: "string",
                    description:
                        "Optional, current working directory",
                },
                stdin: {
                    type: "string",
                    description:
                        "Optional, text to pipe into the command's STDIN. For example, pass a python script to python3. Or, pass text for a new file to the cat command to create it!",
                },
                // args to consider:
                // - env - obscure cases where command takes a param only via an env var?
                // - timeout - lets just hard code this for now
            },
            required: ["command"],
        },
    },
  • src/tools.ts:11-62 (registration)
    The `reisterTools` function that registers the run_command tool on the MCP server by handling ListToolsRequestSchema (listing the tool with schema) and CallToolRequestSchema (dispatching calls to runCommand based on name).
    export function reisterTools(server: Server) {
        server.setRequestHandler(ListToolsRequestSchema, async () => {
            verbose_log("INFO: ListTools");
            return {
                tools: [
                    {
                        name: "run_command",
                        description:
                            "Run a command on this " + os.platform() + " machine",
                        inputSchema: {
                            type: "object",
                            properties: {
                                command: {
                                    type: "string",
                                    description: "Command with args",
                                },
                                workdir: {
                                    // previous run_command calls can probe the filesystem and find paths to change to
                                    type: "string",
                                    description:
                                        "Optional, current working directory",
                                },
                                stdin: {
                                    type: "string",
                                    description:
                                        "Optional, text to pipe into the command's STDIN. For example, pass a python script to python3. Or, pass text for a new file to the cat command to create it!",
                                },
                                // args to consider:
                                // - env - obscure cases where command takes a param only via an env var?
                                // - timeout - lets just hard code this for now
                            },
                            required: ["command"],
                        },
                    },
                ],
            };
        });
    
        server.setRequestHandler(
            CallToolRequestSchema,
            async (request): Promise<CallToolResult> => {
                verbose_log("INFO: ToolRequest", request);
                switch (request.params.name) {
                    case "run_command": {
                        return await runCommand(request.params.arguments);
                    }
                    default:
                        throw new Error("Unknown tool");
                }
            }
        );
    }
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/g0t4/mcp-server-commands'

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