UNPKG

docker-mcp

Version:

A Model Context Protocol (MCP) server that enables AI agents to interact with Docker containers locally or remotely via SSH. Provides comprehensive Docker management capabilities including container operations, logs, monitoring, and cleanup.

152 lines (145 loc) 5.62 kB
import { parseSSHConfig } from './docker-config.js'; import { readFileSync } from 'fs'; /** * Loads server configuration from environment variables * Supports only local mode and SSH mode for simplicity */ export function loadServerConfig() { const config = { name: process.env.DOCKER_MCP_SERVER_NAME || "docker-mcp-server", version: process.env.DOCKER_MCP_SERVER_VERSION || "1.0.0" }; // Determine Docker connection mode const dockerOptions = loadDockerOptions(); if (dockerOptions) { config.dockerOptions = dockerOptions; } return config; } /** * Loads Docker options based on environment variables * Simple logic: local mode or SSH mode only */ function loadDockerOptions() { // Check for explicit local mode if (process.env.DOCKER_MCP_LOCAL === 'true') { return undefined; // Use default local connection } // Check for TCP tunnel connection (e.g., SSH tunnel) const host = process.env.DOCKER_MCP_HOST; if (host && host.startsWith('tcp://')) { const url = new URL(host); return { protocol: 'http', host: url.hostname, port: parseInt(url.port, 10) || 2375, timeout: 10000 }; } // Check for SSH connection if (host && host.startsWith('ssh://')) { return createSSHDockerOptions(host); } return undefined; // Default to local } /** * Creates SSH-based Docker options */ function createSSHDockerOptions(host) { // Parse SSH config from ~/.ssh/config if available const sshConfig = parseSSHConfig(host.replace('ssh://', '')); // Merge with environment variables (env vars take precedence) const finalConfig = { host: sshConfig.host || host, port: process.env.DOCKER_MCP_PORT ? parseInt(process.env.DOCKER_MCP_PORT, 10) : (sshConfig.port || 22), username: process.env.DOCKER_MCP_USERNAME || sshConfig.username || 'root', privateKey: process.env.DOCKER_MCP_PRIVATE_KEY || sshConfig.privateKey, passphrase: process.env.DOCKER_MCP_PASSPHRASE || sshConfig.passphrase, socketPath: process.env.DOCKER_MCP_SOCKET_PATH || sshConfig.socketPath || '/var/run/docker.sock', timeout: process.env.DOCKER_MCP_TIMEOUT ? parseInt(process.env.DOCKER_MCP_TIMEOUT, 10) : 10000 }; // Read private key content if file path is provided let privateKeyContent = finalConfig.privateKey; if (privateKeyContent && !privateKeyContent.includes('BEGIN')) { try { privateKeyContent = readFileSync(privateKeyContent, 'utf-8'); } catch (error) { console.error(`Failed to read private key from ${finalConfig.privateKey}:`, error); privateKeyContent = undefined; } } return { protocol: 'ssh', host: finalConfig.host, port: finalConfig.port, username: finalConfig.username, socketPath: finalConfig.socketPath, // timeout: finalConfig.timeout, sshOptions: privateKeyContent ? { host: finalConfig.host, port: finalConfig.port, username: finalConfig.username, privateKey: privateKeyContent, passphrase: finalConfig.passphrase } : undefined }; } /** * Prints simplified configuration help */ export function printConfigHelp() { console.error(` Docker MCP Server Configuration: Environment Variables: DOCKER_MCP_LOCAL Use local Docker daemon (set to 'true') DOCKER_MCP_HOST SSH host with format: ssh://hostname or tcp://localhost:port SSH Configuration (when using ssh:// format): DOCKER_MCP_PORT SSH port (default: 22) DOCKER_MCP_USERNAME SSH username DOCKER_MCP_PRIVATE_KEY Path to SSH private key file DOCKER_MCP_PASSPHRASE SSH private key passphrase DOCKER_MCP_SOCKET_PATH Remote Docker socket path (default: /var/run/docker.sock) DOCKER_MCP_TIMEOUT Connection timeout in milliseconds (default: 10000) Examples: # Local Docker daemon DOCKER_MCP_LOCAL=true # SSH tunnel (for compatibility) DOCKER_MCP_HOST=tcp://localhost:2375 # Direct SSH connection (uses ~/.ssh/config if configured) DOCKER_MCP_HOST=ssh://my-vm # Direct SSH with explicit credentials DOCKER_MCP_HOST=ssh://192.168.1.100 DOCKER_MCP_USERNAME=ubuntu DOCKER_MCP_PRIVATE_KEY=~/.ssh/id_rsa `); } /** * Prints current configuration */ export function printCurrentConfig(config) { console.error(` Current Configuration: Server Name: ${config.name} Server Version: ${config.version} Docker Connection:`); if (!config.dockerOptions) { console.error(' Mode: Local Docker daemon'); } else if (config.dockerOptions.protocol === 'http' && config.dockerOptions.host === 'localhost') { console.error(' Mode: TCP tunnel (likely SSH tunnel)'); console.error(` Host: ${config.dockerOptions.host}:${config.dockerOptions.port}`); } else if (config.dockerOptions.protocol === 'ssh') { console.error(' Mode: Direct SSH connection'); console.error(` Host: ${config.dockerOptions.host}:${config.dockerOptions.port}`); console.error(` Username: ${config.dockerOptions.username}`); console.error(` Private Key: ${config.dockerOptions.sshOptions?.privateKey ? 'Loaded' : 'Not specified'}`); console.error(` Socket Path: ${config.dockerOptions.socketPath}`); } else { console.error(' Mode: Custom Docker options'); } console.error(''); } //# sourceMappingURL=config-loader.js.map