{ "id": "ssh", "name": "SSH Remote Access", "version": "1.0.0", "type": "mcp_local", "launch_command": "python3 ssh_mcp_server.py", "transport": "stdio", "requires": [ "PYTHON" ], "dependencies": [ "paramiko>=3.4" ], "env": [ { "name": "SSH_MCP_POOL_TTL", "label": "Connection pool TTL (seconds)", "description": "How long an idle SSH connection stays open before being closed. Default: 300 (5 min).", "required": false, "secret": false, "default": "300", "example": "300" }, { "name": "SSH_MCP_COMMAND_TIMEOUT", "label": "Command timeout (seconds)", "description": "Max time a remote command can run before being killed. Default: 120.", "required": false, "secret": false, "default": "120", "example": "120" }, { "name": "SSH_MCP_CONNECT_TIMEOUT", "label": "Connect timeout (seconds)", "description": "Max time to wait for the SSH handshake. Default: 15.", "required": false, "secret": false, "default": "15", "example": "15" }, { "name": "SSH_MCP_LOGIN_PW_TTL", "label": "Login password cache TTL (seconds)", "description": "How long an elicited login password stays cached in RAM. Default: 300.", "required": false, "secret": false, "default": "300", "example": "300" }, { "name": "SSH_MCP_SUDO_PW_TTL", "label": "Sudo password cache TTL (seconds)", "description": "How long an elicited sudo password stays cached in RAM. Default: 300.", "required": false, "secret": false, "default": "300", "example": "300" }, { "name": "SSH_MCP_KEY_PASSPHRASE", "label": "SSH key passphrase (non-interactive override)", "description": "Passphrase for an encrypted private key. Overrides elicitation. Use only in automated environments.", "required": false, "secret": true, "example": "" } ], "setup_instructions": [ "Install dependencies: pip install -r requirements.txt", "No OAuth or API key needed: host authentication is managed at runtime via add_alias.", "Add an alias: mcp__ssh__add_alias(alias=\"my-server\", hostname=\"...\", username=\"...\", auth=\"key\")", "The server stores aliases in ~/.ssh_aliases.json (auto-managed, never hand-edit).", "Optional: tune TTLs via SSH_MCP_* environment variables (see env[] above)." ], "docs": [ { "lang": "en", "description": "Full SSH remote server access: read/write files, grep, execute commands, manage systemd services, upload/download files and directories, and probe system info — all over SFTP and SSH with the same output format as Skald's native tools. Aliases manage host config (hostname, port, user, auth method, sudo policy). Login passwords and sudo passwords are elicited on demand and kept only in RAM with configurable TTL. No OAuth, no API keys, no secrets on disk.", "llm_short_description": "SSH MCP server: 13 tools (list/add/remove_alias, read_file, list_files, grep_files, edit_file, replace_lines, exec, upload, download, sysinfo, systemd). Auth via key/agent or elicited password. Sudo via nopasswd or elicited password. Connection pooling with lazy TTL eviction." } ], "mcp_config": { "command": "python3", "args": [ "ssh_mcp_server.py" ], "env": { "SSH_MCP_POOL_TTL": "{ENV:SSH_MCP_POOL_TTL}", "SSH_MCP_COMMAND_TIMEOUT": "{ENV:SSH_MCP_COMMAND_TIMEOUT}", "SSH_MCP_CONNECT_TIMEOUT": "{ENV:SSH_MCP_CONNECT_TIMEOUT}", "SSH_MCP_LOGIN_PW_TTL": "{ENV:SSH_MCP_LOGIN_PW_TTL}", "SSH_MCP_SUDO_PW_TTL": "{ENV:SSH_MCP_SUDO_PW_TTL}", "SSH_MCP_KEY_PASSPHRASE": "{SECRET:SSH_MCP_KEY_PASSPHRASE}" } }, "homepage": "", "icon_small": "icon_sm.svg", "icon_large": "icon_lg.svg", "scope": "user", "tags": [ "ssh", "mcp", "local", "remote", "server", "terminal", "sysadmin" ], "auth": { "type": "none" } }