SSH server management with zero-token SFTP file transfer and SOCKS proxy support
Runs on your machine from its package; the steps are below.
At most: moves money, runs code or commands, deletes data, or sends messages for you.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y @nl4ever/sshmcp
MCP client config
{
"mcpServers": {
"sshmcp": {
"command": "npx",
"args": [
"-y",
"@nl4ever/sshmcp"
]
}
}
}Let AI manage your remote servers. A Model Context Protocol (MCP) server that gives AI assistants full SSH access — execute commands, transfer files, manage multiple servers simultaneously, all through natural conversation.
You: "Deploy the latest build to production server"
AI: connects → uploads build → restarts service → verifies status
server_idhost:port as temp IDnpm install -g @nl4ever/sshmcp
claude mcp add sshmcp sshmcp
Edit claude_desktop_config.json:
{
"mcpServers": {
"sshmcp": {
"command": "npx",
"args": ["-y", "@nl4ever/sshmcp"]
}
}
}
Go to Settings → MCP Servers → Add:
{
"sshmcp": {
"command": "npx",
"args": ["-y", "@nl4ever/sshmcp"]
}
}
| Tool | Description |
|---|---|
list_servers | List all configured servers and active connections |
get_server | View server config details |
add_server | Add/update server config (password, key, agent, OTP) |
update_server | Modify server config (only pass fields you want to change) |
delete_server | Remove a server |
rename_server | Rename a server ID |
connect | Manually connect (usually not needed, tools auto-connect) |
quick_connect | Temporary connection, returns host:port as ID |
disconnect | Disconnect specific server or all connections |
test_connection | Test connectivity without affecting existing connections |
| Tool | Description |
|---|---|
execute | Run shell commands on remote server (with configurable timeout) |
| Tool | Description |
|---|---|
read_file | Read remote file content (with optional line range) |
write_file | Write text content to remote file |
upload_file | Upload local file to remote (supports async mode) |
upload_directory | Upload directory with auto compress → transfer → decompress |
download_file | Download remote file to local (supports async mode) |
download_directory | Download directory with remote compress → transfer → local decompress |
transfer_status | Check progress of async transfers (size/speed/ETA) |
| Tool | Description |
|---|---|
list_proxies | List all SOCKS proxy presets |
add_proxy | Add SOCKS4/5 proxy preset |
delete_proxy | Remove a proxy preset |
All operation tools take a server_id parameter. The connection pool auto-manages connections — no manual connect/disconnect needed:
AI: execute(server_id="prod", command="nginx -s reload") ← auto-connects to prod
AI: execute(server_id="dev", command="tail -f /var/log/app.log") ← auto-connects to dev, prod stays
AI: execute(server_id="prod", command="curl localhost") ← reuses prod connection
For temporary servers, use quick_connect which returns host:port as the ID:
AI: quick_connect(host="1.2.3.4", username="root", password="***")
→ "Connected: root@1.2.3.4:22, use server_id="1.2.3.4:22""
AI: execute(server_id="1.2.3.4:22", command="df -h")
AI: disconnect(server_id="1.2.3.4:22")
For large files, enable background transfer mode to avoid blocking:
AI: upload_file(server_id="prod", local_path="big.tar.gz", remote_path="/data/", async_transfer=true)
→ "Background upload started: tf_1"
AI: transfer_status("tf_1")
→ "🔄 Uploading: 638.2 MB / 1.2 GB (53.2%) — 12.4 MB/s, ETA 46s"
AI: transfer_status("tf_1")
→ "✅ Upload complete: 1.2 GB, 98s, 12.3 MB/s"
Small files use synchronous mode by default — no config needed.
AI: add_server(server_id="prod", name="Production", host="10.0.0.1", username="deploy", password="***")
AI: execute(server_id="prod", command="systemctl status nginx")
AI: add_server(server_id="aws", name="AWS EC2", host="ec2-xx.compute.amazonaws.com", username="ubuntu", private_key="~/.ssh/id_rsa")
AI: quick_connect(host="192.168.1.100", username="root", password="***")
→ server_id="192.168.1.100:22"
AI: execute(server_id="192.168.1.100:22", command="df -h")
AI: disconnect(server_id="192.168.1.100:22")
AI: add_proxy(proxy_id="tunnel", name="SSH Tunnel", host="127.0.0.1", port=1080, type="5")
AI: add_server(server_id="internal", ..., proxy="tunnel")
AI: add_server(server_id="bastion", name="Bastion", host="bastion.example.com", username="admin", private_key="~/.ssh/id_rsa")
AI: add_server(server_id="internal", name="Internal DB", host="10.0.0.5", username="dbadmin", password="***", jump_host="bastion")
Server and proxy configurations are stored in:
~/.ssh-mcp/config.json
Passwords are stored in plaintext. For production use, prefer private key authentication.
MIT