mcp-ssh-manager@3.1.0
CAUTIONPublisher claims: "MCP SSH Manager: Model Context Protocol server for SSH remote server management. Control SSH connections from Claude Code and OpenAI Codex - execute commands, transfer files, database operations, backups, health monitoring, and DevOps automation. NEW: Too" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Server started and answered tools/list.- Tested
- MCP initialize and tools/list · every tool description, for hidden instructions · every file read, file written and host contacted by what ran
- Not tested
- what the tools do when called with real credentials
Before you give it your token
- It will ask for
- no credential variables read in the code
- Where it talks to
- no vendor host named in the code
- What the honeypot saw
- no credential files read · no network
- What we could not test
- what the tools do when called with real credentials
Reasonable to connect. No credential asked for, no third-party host named, Server started and answered tools/list.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios) on 2026-11-10 and scored it 70/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 26 s · 2 scenarios · 0 deviationsStatic findings
echo " .env # Server definitions"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- Manages `.env` file with server configurationsFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " ~/.ssh-manager/ # Config directory"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Load servers from .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.entry: bash -c '! git ls-files | grep -q "^\.env$"'Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.SSH_MANAGER_ENV="$(dirname "$(dirname "$REAL_DIR")")/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Edit server configuration (full .env file)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.prompt_input "SSH key path" "$HOME/.ssh/id_rsa" "auth_value"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.name: Ensure .env is not trackedFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [ ! -f "$HOME/mcp/mcp-ssh-manager/.env" ] && [ ! -f "$HOME/.ssh-manager/.env" ]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Resolve .env path - handle both direct and symlinked executionFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- `ssh_execute_sudo`: Execute commands with sudo privilegesFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.2. `.env` file in project rootFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.4. **Deployment Strategy**: The deploy helper detects permission issues and automatically creates scripts for sudo execution when neededFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo " • ~/.ssh/id_rsa (default RSA key)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.1. **Environment Variables (.env)** - Traditional format for Claude CodeFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.SSH_SERVER_[NAME]_SUDO_PASSWORD=pass # Optional for automated sudoFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo " • All configurations are saved in .env file"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* User-global only: ~/.ssh-manager/tools-config.jsonFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Parse .env file for server definitionsFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.ssh-manager codex convert to-env # Convert TOML to .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- `ssh_execute_sudo`: Execute commands with sudo privilegesFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.sudo_password = "pass" # Optional for automated sudoFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.SSH_MANAGER_ENV="$(dirname "$SCRIPT_DIR")/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.ssh-manager codex convert to-toml # Convert .env to TOMLFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo -e "${YELLOW}Note: You may need sudo permissions to install to $INSTALL_DIR${NC}"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.print_info "No .env file found. You'll need to configure servers after installation."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chmod +x "$WRAPPER"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.// Execute command with sudo supportFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// Load .env file (higher priority, overwrites TOML)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* User-global only: ~/.ssh-manager/tools-config.jsonFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const result = await this.execCommand('grep "^$USER:" /etc/passwd | cut -d: -f6', {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."../.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."check-supervisor": "sudo supervisorctl status",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod +x "$TEMP_BUILD/ssh-manager"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."$HOME/mcp/mcp-ssh-manager/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Save to .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."restart-supervisor": "sudo supervisorctl restart all",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod +x "$CLI_HOME/ssh-manager"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.`echo "${sudoPassword}" | sudo -S chown ${owner} "${remotePath}"` :Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.chmod +x "$TEMP_BUILD/install.sh"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.dotenv.config({ path: path.join(__dirname, '..', '.env') });Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.logger.warn(`Failed to load .env config: ${error.message}`);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`echo "${sudoPassword}" | sudo -S cp {{tempFile}} "${remotePath}"` :Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo " • ~/.ssh/id_rsa (default RSA key)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.envPath = path.join(process.cwd(), '.env'),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.prompt_input "SSH key path" "${current_keypath:-$HOME/.ssh/id_rsa}" "auth_value"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " • ~/.ssh/custom_key (custom key)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.fullCommand = `sudo ${fullCommand}`;Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo " ✅ No .env file in git"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.kill $PID 2>/dev/nullFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.description: 'Execute command with sudo on remote server',Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* 2. .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// Method 3: Parse /etc/passwd directlyFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " ❌ WARNING: .env file is tracked in git!"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " Directly edit .env file"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// Add sudo if not already presentFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Check for .env in gitFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if (!fullCommand.startsWith('sudo ')) {Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// /etc/passwd parsing failed, try last resortFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " • ~/.ssh/id_ed25519 (modern ED25519 key)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chmod +x "$TEMP_BUILD/demo.sh" 2>/dev/null || trueFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.`echo "${sudoPassword}" | sudo -S chown ${owner} "${remotePath}"` :Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.envPath: path.join(__dirname, '..', '.env'),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`sudo cp {{tempFile}} "${remotePath}"` :Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod +x "$TEMP_BUILD/migrate.sh"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.prompt_input "SSH key path" "$HOME/.ssh/id_rsa" "auth_value"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Find .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if kill -0 $PID 2>/dev/null; thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.if git ls-files | grep -q "^\.env$"; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."../../mcp-ssh-manager/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.logger.info(`Loaded SSH configuration from .env: ${envPath}`);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`sudo chown ${owner} "${remotePath}"`;Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.// Step 2: Determine if we need sudoFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.`sudo chown ${owner} "${remotePath}"`;Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- `ssh_process_manager`: List, monitor, or kill processesFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo " • ~/.ssh/id_ed25519 (modern ED25519 key)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..describe('Action: list processes, kill process, or get process info'),Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.`sudo chmod ${permissions} "${remotePath}"`;Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts..describe('Process ID (required for kill and info actions)'),Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// Execute command with timeout - using child_process timeout for real killFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.description: 'List, monitor, or kill processes on remote server',Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.… In follow mode, output is streamed to stderr.\nTo stop tailing, you'll need to kill the session.` } ] }; } else { // Non…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.await ssh.execCommand(`echo '${escapedScript}' > "${scriptPath}" && chmod +x "${scriptPath}"`);Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.`echo "${sudoPassword}" | sudo -S chmod ${permissions} "${remotePath}"` :Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.* Build command to kill a processFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.return `kill -${signal} ${pid}`;Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// Try multiple ways to kill the streamFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- `ssh_execute_sudo` - Execute commands with sudo privilegesFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.- **🔑 Sudo Support** - Execute commands with sudo privileges securelyFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.Run commands with sudo privileges securely.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.- `ssh_execute_sudo` - Execute commands with sudo privilegesFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.Execute commands with sudo privileges.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for @iflow-mcp/mcp-ssh-manager@3.1.0 as of 4d ago. This is the package itself, not its dependencies.
What would make this Verified
10 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Reads credential paths from the home directory≈ +9 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Unclaimed publisher≈ +8 on the totalClaim iflow-mcp: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- References a credential file in the home directory≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- File permission modification command≈ +2 on the totalRequest the narrowest permission that works; replace wildcards with the exact paths or hosts.