Skip to main content
Glama
Faucet94

Super Windows CLI MCP Server

by Faucet94

ssh_execute

Run commands on remote systems securely via SSH, enabling direct management and execution of tasks on connected devices without manual intervention.

Instructions

Execute a command on a remote host via SSH

Example usage:

{
  "connectionId": "raspberry-pi",
  "command": "uname -a"
}

Configuration required in config.json:

{
  "ssh": {
    "enabled": true,
    "connections": {
      "raspberry-pi": {
        "host": "raspberrypi.local",
        "port": 22,
        "username": "pi",
        "password": "raspberry"
      }
    }
  }
}

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
commandYesCommand to execute
connectionIdYesID of the SSH connection to use

Implementation Reference

  • Main MCP tool handler for 'ssh_execute': validates input, retrieves SSH connection from pool, executes command, logs to history, returns output and metadata.
    case "ssh_execute": {
      if (!this.config.ssh.enabled) {
        throw new McpError(
          ErrorCode.InvalidRequest,
          "SSH support is disabled in configuration"
        );
      }
    
      const args = z.object({
        connectionId: z.string(),
        command: z.string()
      }).parse(request.params.arguments);
    
      const connectionConfig = this.config.ssh.connections[args.connectionId];
      if (!connectionConfig) {
        throw new McpError(
          ErrorCode.InvalidRequest,
          `Unknown SSH connection ID: ${args.connectionId}`
        );
      }
    
      try {
        // Validate command
        this.validateCommand('cmd', args.command);
    
        const connection = await this.sshPool.getConnection(args.connectionId, connectionConfig);
        const { output, exitCode } = await connection.executeCommand(args.command);
    
        // Store in history if enabled
        if (this.config.security.logCommands) {
          this.commandHistory.push({
            command: args.command,
            output,
            timestamp: new Date().toISOString(),
            exitCode,
            connectionId: args.connectionId
          });
    
          if (this.commandHistory.length > this.config.security.maxHistorySize) {
            this.commandHistory = this.commandHistory.slice(-this.config.security.maxHistorySize);
          }
        }
    
        return {
          content: [{
            type: "text",
            text: output || 'Command completed successfully (no output)'
          }],
          isError: exitCode !== 0,
          metadata: {
            exitCode,
            connectionId: args.connectionId
          }
        };
      } catch (error) {
        const errorMessage = error instanceof Error ? error.message : String(error);
        if (this.config.security.logCommands) {
          this.commandHistory.push({
            command: args.command,
            output: `SSH error: ${errorMessage}`,
            timestamp: new Date().toISOString(),
            exitCode: -1,
            connectionId: args.connectionId
          });
        }
        throw new McpError(
          ErrorCode.InternalError,
          `SSH error: ${errorMessage}`
        );
      }
    }
  • Tool schema definition including name, description, and input schema for 'ssh_execute' in the ListTools response.
            {
              name: "ssh_execute",
              description: `Execute a command on a remote host via SSH
    
    Example usage:
    \`\`\`json
    {
      "connectionId": "raspberry-pi",
      "command": "uname -a"
    }
    \`\`\`
    
    Configuration required in config.json:
    \`\`\`json
    {
      "ssh": {
        "enabled": true,
        "connections": {
          "raspberry-pi": {
            "host": "raspberrypi.local",
            "port": 22,
            "username": "pi",
            "password": "raspberry"
          }
        }
      }
    }
    \`\`\``,
              inputSchema: {
                type: "object",
                properties: {
                  connectionId: {
                    type: "string",
                    description: "ID of the SSH connection to use",
                    enum: Object.keys(this.config.ssh.connections)
                  },
                  command: {
                    type: "string",
                    description: "Command to execute"
                  }
                },
                required: ["connectionId", "command"]
              }
            },
  • Core implementation of SSH command execution using ssh2 Client.exec, capturing stdout/stderr and exit code.
    async executeCommand(command: string): Promise<{ output: string; exitCode: number }> {
      this.lastActivity = Date.now();
    
      // Check connection and attempt reconnect if needed
      if (!this.isConnected) {
        await this.connect();
      }
    
      return new Promise((resolve, reject) => {
        this.client.exec(command, (err, stream) => {
          if (err) {
            reject(err);
            return;
          }
    
          let output = '';
          let errorOutput = '';
    
          stream
            .on('data', (data: Buffer) => {
              output += data.toString();
            })
            .stderr.on('data', (data: Buffer) => {
              errorOutput += data.toString();
            });
    
          stream.on('close', (code: number) => {
            this.lastActivity = Date.now();
            resolve({
              output: output || errorOutput,
              exitCode: code || 0
            });
          });
        });
      });
    }
  • SSHConnectionPool class that manages persistent SSH connections, providing getConnection for reuse and reconnection logic.
    export class SSHConnectionPool {
      private connections: Map<string, SSHConnection> = new Map();
    
      async getConnection(connectionId: string, config: SSHConnectionConfig): Promise<SSHConnection> {
        let connection = this.connections.get(connectionId);
        
        if (!connection) {
          connection = new SSHConnection(config);
          this.connections.set(connectionId, connection);
          await connection.connect();
        } else if (!connection.isActive()) {
          await connection.connect();
        }
    
        return connection;
      }
    
      async closeConnection(connectionId: string): Promise<void> {
        const connection = this.connections.get(connectionId);
        if (connection) {
          connection.disconnect();
          this.connections.delete(connectionId);
        }
      }
    
      closeAll(): void {
        for (const connection of this.connections.values()) {
          connection.disconnect();
        }
        this.connections.clear();
      }
    }

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

Related 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/Faucet94/super-win-cli-mcp-server'

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