Skip to main content
Glama

execute

Execute code in multiple languages to test hypotheses before implementation, supporting both code snippets and shell commands with auto-runtime detection.

Instructions

Execute code in JS/TS, Go, Rust, Python, C, C++, or bash with auto-runtime detection. Primary tool for testing hypotheses before implementation. Supports both code snippets and shell commands.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
workingDirectoryYesPath to working directory for execution.
codeNoCode to execute. Include timeouts for network/async operations to prevent hangs.
commandsNoBash commands (single or array for planned batch executions)
runtimeNoExecution runtime (default: auto-detect)
timeoutNoTimeout in milliseconds (default: 240000)

Implementation Reference

  • Registers the 'execute' tool by importing executionTools from executor-tool.js and spreading it into the allTools array used by the MCP server.
    import { executionTools } from '../tools/executor-tool.js';
    
    export const allTools = [
      ...executionTools
    ];
  • src/index.js:28-33 (registration)
    Sets up the MCP server request handlers for listing tools (exposes 'execute') and calling tools by name.
    const tools = allTools;
    
    server.setRequestHandler(ListToolsRequestSchema, async () => {
      return {
        tools: tools
      };
  • Input schema defining parameters for the 'execute' tool: workingDirectory (required), code, commands, runtime, timeout.
    inputSchema: {
      type: "object",
      properties: {
        workingDirectory: {
          type: "string",
          description: "Path to working directory for execution."
        },
        code: {
          type: "string",
          description: "Code to execute. Include timeouts for network/async operations to prevent hangs."
        },
        commands: {
          type: ["string", "array"],
          description: "Bash commands (single or array for planned batch executions)"
        },
        runtime: {
          type: "string",
          enum: ["nodejs", "deno", "bash", "go", "rust", "python", "c", "cpp", "auto"],
          description: "Execution runtime (default: auto-detect)"
        },
        timeout: {
          type: "number",
          description: "Timeout in milliseconds (default: 240000)"
        }
      },
      required: ["workingDirectory"]
    },
  • Main execution handler for the 'execute' tool. Validates inputs, suppresses console, executes code/commands via runtime-specific functions like executeWithRuntimeValidation, enhances results with error analysis, generates insights, and updates contexts.
    handler: withCrossToolAwareness(withConnectionManagement(async ({ code, commands, workingDirectory, runtime = "auto", timeout = 240000 }) => {
      const consoleRestore = suppressConsoleOutput();
      const effectiveWorkingDirectory = workingDirectory;
      const query = code || commands || '';
    
      try {
        // Validate required parameters
        if (!workingDirectory) {
          throw new ToolError(
            'Working directory is required',
            'MISSING_PARAMETER',
            'execute',
            false,
            ['Provide absolute path to working directory', 'Check tool documentation']
          );
        }
    
        // Start execution tracking for all operations
        const execution = executionState.startExecution({
          type: 'execute',
          code,
          commands,
          runtime,
          workingDirectory: effectiveWorkingDirectory,
          timeout
        });
    
        let result;
        if (code) {
          let targetRuntime = runtime === "auto" ? "nodejs" : runtime;
    
          if (runtime === "auto") {
            const shellCommands = ['npm ', 'npx ', 'yarn ', 'pip ', 'python ', 'go ', 'rustc ', 'gcc ', 'g++ ', 'git ', 'mkdir ', 'rm ', 'ls ', 'cd '];
            const isShellCommand = shellCommands.some(cmd => code.trim().startsWith(cmd));
            if (isShellCommand) {
              targetRuntime = 'bash';
            }
          }
    
          try {
            const executionStart = Date.now();
            result = await executeWithRuntimeValidation(code, targetRuntime, { workingDirectory, timeout });
            const executionDuration = Date.now() - executionStart;
    
            // Complete execution (duration-based logic for cross-tool sharing)
            executionState.completeExecution(execution.id, result);
          } catch (executionError) {
            if (targetRuntime === 'bash') {
              try {
                result = await executeWithRuntimeValidation(code, 'nodejs', { workingDirectory, timeout });
              } catch (fallbackError) {
                result = {
                  success: false,
                  stdout: '',
                  stderr: `Failed to execute as both bash and nodejs:\nBash error: ${executionError.message}\nNode.js error: ${fallbackError.message}`,
                  executionTimeMs: 0
                };
              }
            } else {
              result = {
                success: false,
                stdout: '',
                stderr: `Execution failed: ${executionError.message}`,
                executionTimeMs: 0
              };
            }
            executionState.failExecution(execution.id, executionError);
          }
          result = enhanceExecutionResult(result, code, targetRuntime, workingDirectory);
        } else if (commands) {
          try {
            const executionStart = Date.now();
            result = await executeWithRuntimeValidation(commands, 'bash', { workingDirectory, timeout });
            const executionDuration = Date.now() - executionStart;
    
            // Complete execution
            executionState.completeExecution(execution.id, result);
          } catch (executionError) {
            result = {
              success: false,
              stdout: '',
              stderr: `Command execution failed: ${executionError.message}`,
              executionTimeMs: 0
            };
            executionState.failExecution(execution.id, executionError);
          }
          result = enhanceExecutionResult(result, commands, 'bash', workingDirectory);
        } else {
          result = { content: [{ type: "text", text: "No code or commands provided" }] };
        }
    
    
        const insights = generateExecutionInsights(result, query, effectiveWorkingDirectory);
    
        // Format response with enhanced error information
        let responseContent = result;
    
        if (result._errorAnalysis && result._errorAnalysis.isSyntaxError) {
          // Simple error response
          responseContent = {
            ...result,
            content: [{ type: "text", text: result.error || result.stderr || 'Execution failed' }]
          };
        } else if (!result.success) {
          // Simple error format
          responseContent = {
            ...result,
            content: [{ type: "text", text: result.error || result.stderr || 'Execution failed' }]
          };
        } else if (!result.content) {
          // Format successful execution or basic error
          let outputText = '';
    
          if (result.success) {
            outputText = result.stdout || 'Execution successful';
          } else {
            outputText = result.error || result.stderr || 'Execution failed';
          }
    
          responseContent = {
            ...result,
            content: [{ type: "text", text: outputText }]
          };
        }
    
        const toolContext = createToolContext('execute', effectiveWorkingDirectory, query, {
          ...responseContent,
          duration: responseContent.executionTimeMs || 0,
          filesAccessed: responseContent.filesAccessed || [],
          patterns: responseContent.patterns || [],
          insights: insights
        });
    
        await workingDirectoryContext.updateContext(effectiveWorkingDirectory, 'execute', toolContext);
    
        // Clean up old executions
        executionState.cleanup();
    
        return responseContent;
      } catch (error) {
    
        const errorContext = createToolContext('execute', effectiveWorkingDirectory, query, {
          error: error.message,
          duration: 0
        });
        await workingDirectoryContext.updateContext(effectiveWorkingDirectory, 'execute', errorContext);
    
        return {
          content: [{ type: "text", text: `Execution error: ${error.message}` }],
          isError: true
        };
      } finally {
    
        consoleRestore.restore();
      }
    }, 'execute', {
  • Core helper function executeProcess that spawns child processes, handles timeouts, captures output, and manages errors for all executions.
    export async function executeProcess(command, args = [], options = {}) {
      const startTime = Date.now();
      const { timeout = 240000, cwd, input, encoding = 'utf8' } = options;
    
      return new Promise((resolve) => {
        const child = spawn(command, args, {
          cwd,
          stdio: input ? 'pipe' : ['pipe', 'pipe', 'pipe']
        });
    
        let stdout = '';
        let stderr = '';
        let isResolved = false;
    
        const timeoutId = setTimeout(() => {
          if (!isResolved) {
            child.kill('SIGTERM');
            isResolved = true;
            resolve(createTimeoutError(`${command} ${args.join(' ')}`, timeout, startTime));
          }
        }, timeout);
    
        if (child.stdout) {
          child.stdout.on('data', (data) => {
            if (data && typeof data === 'object' && Buffer.isBuffer(data)) {
              stdout += data.toString(encoding);
            } else if (data && typeof data === 'string') {
              stdout += data;
            }
          });
        }
    
        if (child.stderr) {
          child.stderr.on('data', (data) => {
            if (data && typeof data === 'object' && Buffer.isBuffer(data)) {
              stderr += data.toString(encoding);
            } else if (data && typeof data === 'string') {
              stderr += data;
            }
          });
        }
    
        child.on('close', (code, signal) => {
          if (!isResolved) {
            clearTimeout(timeoutId);
            isResolved = true;
    
            if (code === 0) {
              resolve(createSuccessResponse({ stdout, stderr, code, signal }, startTime));
            } else {
              resolve(createExecutionErrorResponse(
                stderr || `Process exited with code ${code}`,
                startTime,
                { stdout, stderr, code, signal }
              ));
            }
          }
        });
    
        child.on('error', (error) => {
          if (!isResolved) {
            clearTimeout(timeoutId);
            isResolved = true;
            resolve(handleProcessError(error, `${command} ${args.join(' ')}`, startTime));
          }
        });
    
        if (input && child.stdin) {
          child.stdin.write(input);
          child.stdin.end();
        }
      });
    }
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions auto-runtime detection and supports for code/shell commands, but doesn't cover critical aspects like permissions, rate limits, error handling, or output format, leaving gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, with two sentences that efficiently convey the tool's purpose and key features without unnecessary details. Every sentence adds value, making it easy to understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (executing code in multiple languages), no annotations, and no output schema, the description is incomplete. It lacks details on behavioral traits, error handling, and return values, which are crucial for safe and effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 5 parameters. The description adds minimal value beyond the schema, mentioning code snippets and shell commands which map to 'code' and 'commands' parameters, but doesn't provide additional syntax or usage details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as executing code in multiple languages with auto-runtime detection, distinguishing it as a primary tool for testing hypotheses. It specifies both code snippets and shell commands as inputs, though without sibling tools, differentiation isn't applicable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for testing hypotheses before implementation, providing some context, but lacks explicit guidance on when to use this tool versus alternatives, prerequisites, or exclusions. No sibling tools exist to compare against.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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/AnEntrypoint/mcp-repl'

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