Skip to main content

MCP server for managing VPS via SSH - gives AI agents secure access to remote servers

Project description

PyPI Python License Downloads

🔐 SSH MCP Server

Give AI agents secure access to your VPS servers via SSH
Execute commands, transfer files, manage processes — all through Model Context Protocol

Quick StartFeaturesIDE IntegrationToolsSecurity


🚀 Quick Start

Install

# Via pip
pip install mcp-ssh-vps

# Via uvx (recommended for MCP)
uvx mcp-ssh-vps

Add Your First Server

# Interactive setup
uvx mcp-ssh-vps --help

# Or use the CLI
sshmcp-cli server add --name prod --host 192.168.1.100 --user deploy
sshmcp-cli server test prod

Connect to Your AI Agent

Add to your AI IDE config and start managing servers with natural language!

"Deploy my app to the production server"
"Check disk space on all servers"
"Restart nginx on web1 and web2"

✨ Features

Feature Description
🖥️ Execute Commands Run any shell command on remote servers
📁 File Operations Read, write, and list files via SFTP
⚙️ Process Management Control systemd, pm2, supervisor services
🏷️ Server Tags Group servers with tags for batch operations
🔄 Batch Execution Run commands on multiple servers in parallel
🔒 Security Profiles Strict, moderate, or full access levels
📝 Audit Logging Track all operations for compliance
🔑 SSH Keys & Passwords Support for both authentication methods

🔌 IDE Integration

Note: Config is auto-loaded from ~/.sshmcp/machines.json by default. No env variables required!

Claude Code

claude mcp add ssh-vps -- uvx mcp-ssh-vps

Or add to ~/.claude.json:

{
  "mcpServers": {
    "ssh-vps": {
      "command": "uvx",
      "args": ["mcp-ssh-vps"]
    }
  }
}

Factory Droid

droid mcp add ssh-vps "uvx mcp-ssh-vps"

Or add to ~/.factory/mcp.json:

{
  "mcpServers": {
    "ssh-vps": {
      "command": "uvx",
      "args": ["mcp-ssh-vps"]
    }
  }
}

Cursor

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "ssh-vps": {
      "command": "uvx",
      "args": ["mcp-ssh-vps"]
    }
  }
}

Qwen Code

qwen mcp add ssh-vps uvx mcp-ssh-vps

Or add to ~/.qwen/settings.json:

{
  "mcpServers": {
    "ssh-vps": {
      "command": "uvx",
      "args": ["mcp-ssh-vps"]
    }
  }
}

Claude Desktop

Add to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "ssh-vps": {
      "command": "uvx",
      "args": ["mcp-ssh-vps"]
    }
  }
}

VS Code + Continue

Add to .continue/config.json:

{
  "experimental": {
    "modelContextProtocolServers": [
      {
        "transport": {
          "type": "stdio",
          "command": "uvx",
          "args": ["mcp-ssh-vps"]
        }
      }
    ]
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "ssh-vps": {
      "command": "uvx",
      "args": ["mcp-ssh-vps"]
    }
  }
}

OpenAI Codex CLI

codex --mcp-config '{"ssh-vps": {"command": "uvx", "args": ["mcp-ssh-vps"]}}'

Any MCP-Compatible Client

Generic stdio configuration:

{
  "command": "uvx",
  "args": ["mcp-ssh-vps"]
}

Custom config path? Add "env": {"SSHMCP_CONFIG_PATH": "/custom/path.json"}


🛠️ Tools Reference

Command Execution

Tool Description Example
execute_command Run command on server execute_command("prod", "docker ps")
execute_on_multiple Run on multiple servers execute_on_multiple(["*"], "uptime")

Server Management

Tool Description Example
list_servers List all servers list_servers() or list_servers(tag="web")
add_server Add new server add_server("web1", "1.2.3.4", "root")
remove_server Remove server remove_server("old-server")
test_connection Test SSH connection test_connection("prod")

File Operations

Tool Description Example
read_file Read remote file read_file("prod", "/var/log/app.log")
upload_file Upload file upload_file("prod", "/tmp/script.sh", "#!/bin/bash\n...")
list_files List directory list_files("prod", "/var/log")

Process Management

Tool Description Example
manage_process Control services manage_process("prod", "restart", "nginx")

Help & Info

Tool Description Example
get_help Get documentation get_help("examples")
get_allowed_commands View security config get_allowed_commands("prod")
get_server_info Server details get_server_info("prod")

🏷️ Server Tags & Batch Operations

Add servers with tags

add_server("web1", "192.168.1.10", "deploy", tags=["production", "web"])
add_server("web2", "192.168.1.11", "deploy", tags=["production", "web"])
add_server("db1", "192.168.1.20", "deploy", tags=["production", "database"])

Filter by tag

list_servers(tag="web")           # Only web servers
list_servers(tag="production")    # All production servers

Execute on tagged servers

execute_on_multiple(["tag:web"], "nginx -t")           # All web servers
execute_on_multiple(["tag:production"], "uptime")      # All production
execute_on_multiple(["*"], "df -h")                    # ALL servers

🔒 Security

Security Profiles

Profile Allowed Commands Use Case
strict git, ls, cat, df, uptime Read-only monitoring
moderate + docker, npm, systemctl, pm2 Standard DevOps
full All commands (except rm -rf /) Full access

Set security level

add_server("prod", "1.2.3.4", "root", security_level="full")

Audit Logging

All commands are logged with timestamps, user, and results:

2024-01-15T10:30:00Z | prod | root | docker ps | exit_code=0 | 150ms

📁 Configuration

Config Location

~/.sshmcp/machines.json

Example Config

{
  "machines": [
    {
      "name": "production",
      "host": "192.168.1.100",
      "port": 22,
      "user": "deploy",
      "auth": {
        "type": "key",
        "key_path": "~/.ssh/id_rsa"
      },
      "security": {
        "allowed_commands": [".*"],
        "forbidden_commands": [".*rm\\s+-rf\\s+/$"],
        "timeout_seconds": 120
      },
      "tags": ["production", "web"],
      "description": "Main production server"
    }
  ]
}

Environment Variable

export SSHMCP_CONFIG_PATH=/custom/path/machines.json

📖 Usage Examples

Check status of all servers

User: Check the status of all my servers
AI: I'll run uptime on all configured servers...

execute_on_multiple(["*"], "uptime && df -h | head -5")

Deploy application

User: Deploy the latest code to production
AI: I'll pull the latest changes and restart the service...

execute_command("prod", "cd /app && git pull origin main")
execute_command("prod", "npm install --production")
execute_command("prod", "pm2 restart all")

Debug server issues

User: Why is the web server slow?
AI: Let me check system resources and logs...

execute_command("web1", "top -bn1 | head -20")
execute_command("web1", "tail -50 /var/log/nginx/error.log")
execute_command("web1", "free -m && df -h")

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

git clone https://github.com/LuxVTZ/sshmcp.git
cd sshmcp
pip install -e ".[dev]"
pytest

📄 License

MIT License - see LICENSE for details.


Made with ❤️ for the AI agent ecosystem
PyPIGitHubIssues

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcp_ssh_vps-0.4.0.tar.gz (88.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_ssh_vps-0.4.0-py3-none-any.whl (79.7 kB view details)

Uploaded Python 3

File details

Details for the file mcp_ssh_vps-0.4.0.tar.gz.

File metadata

  • Download URL: mcp_ssh_vps-0.4.0.tar.gz
  • Upload date:
  • Size: 88.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for mcp_ssh_vps-0.4.0.tar.gz
Algorithm Hash digest
SHA256 e60f2ac85b2392ab9b17da6815392cd40fe3fe8e60878aa0c6d186be29537c08
MD5 89a63cfeffb2e21605829c493736af3d
BLAKE2b-256 54864887bcf8e0c6d51c7673b0dd6f818c101b692fe45142d1b46678100a6e7d

See more details on using hashes here.

File details

Details for the file mcp_ssh_vps-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: mcp_ssh_vps-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 79.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for mcp_ssh_vps-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 92d1a4d6047af6cca9315d7ad911aa8f73f4702eee54c29cff9d17d0045de6ae
MD5 310ad06694dcc9214fc66fecf92a8542
BLAKE2b-256 5f7401bfa71ea361e403931f6df53aba4b3be34743b0aab56c50ef236823e95f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page