vps-mcp-server
# š„ļø VPS MCP Server
An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that gives AI assistants full control over a VPS via SSH. Execute commands, manage files, control services, monitor resources, manage Docker containers, and configure firewalls ā all through a secure SSH tunnel.
## ⨠Features
| Tool | Description |
|------|-------------|
| `run_command` | Execute any shell command on the VPS |
| `read_file` | Read file contents via SFTP |
| `write_file` | Create or overwrite files via SFTP |
| `list_directory` | List directory contents with detailed info |
| `manage_service` | Start, stop, restart, reload, enable, disable systemd services & view logs |
| `list_services` | List systemd services filtered by state (running, failed, enabled) |
| `system_stats` | Get CPU, memory, disk, network, uptime, and process stats |
| `docker` | Manage Docker containers ā list, start, stop, restart, logs, stats, images |
| `firewall` | Manage UFW rules ā status, allow, deny, delete, reset |
## š¦ Installation
```bash
# Clone the repository
git clone https://github.com/your-username/vps-mcp-server.git
cd vps-mcp-server
# Install dependencies
pnpm install
# Build
pnpm build
```
## āļø Configuration
Create a `.env` file from the example:
```bash
cp .env.example .env
```
Set the following environment variables:
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `VPS_HOST` | ā
| ā | Hostname or IP of your VPS |
| `VPS_USER` | ā
| ā | SSH username |
| `VPS_KEY_PATH` | ā
| ā | Absolute path to your SSH private key |
| `VPS_PORT` | ā | `22` | SSH port |
| `VPS_KEY_PASSPHRASE` | ā | ā | Passphrase for the SSH key (if encrypted) |
**Example `.env`:**
```env
VPS_HOST=203.0.113.10
VPS_USER=deploy
VPS_KEY_PATH=/Users/you/.ssh/id_ed25519
VPS_PORT=22
```
## š Usage
### With Claude Desktop / Gemini CLI / Any MCP Client
Add the server to your MCP client configuration:
```json
{
"mcpServers": {
"vps": {
"command": "node",
"args": ["/absolute/path/to/vps-mcp-server/dist/index.js"],
"env": {
"VPS_HOST": "203.0.113.10",
"VPS_USER": "deploy",
"VPS_KEY_PATH": "/Users/you/.ssh/id_ed25519"
}
}
}
}
```
### Development Mode
```bash
pnpm dev
```
### Production
```bash
pnpm build
pnpm start
```
## š ļø Tools Reference
### `run_command`
Execute a shell command on the VPS.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `command` | `string` | ā
| ā | The shell command to execute |
| `timeout` | `number` | ā | `30000` | Timeout in milliseconds |
| `working_directory` | `string` | ā | ā | Directory to run the command in |
**Returns:** JSON with `exit_code`, `stdout`, and `stderr`.
---
### `read_file`
Read the contents of a file on the VPS via SFTP.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `path` | `string` | ā
| ā | Absolute path to the file |
| `max_lines` | `number` | ā | ā | Max lines to return (omit for full file) |
---
### `write_file`
Write content to a file on the VPS via SFTP.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `path` | `string` | ā
| ā | Absolute path to the file |
| `content` | `string` | ā
| ā | Content to write |
| `create_dirs` | `boolean` | ā | `false` | Create parent directories if missing |
---
### `list_directory`
List files and directories at a given path.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `path` | `string` | ā | `/` | Directory path to list |
| `show_hidden` | `boolean` | ā | `false` | Include dotfiles |
| `long_format` | `boolean` | ā | `true` | Show permissions, size, date |
---
### `manage_service`
Manage systemd services.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `service` | `string` | ā
| ā | Service name (e.g., `nginx`) |
| `action` | `enum` | ā
| ā | `start` \| `stop` \| `restart` \| `reload` \| `status` \| `enable` \| `disable` \| `logs` |
| `log_lines` | `number` | ā | `50` | Lines to show (for `logs` action) |
---
### `list_services`
List systemd services filtered by state.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `filter` | `enum` | ā | `running` | `all` \| `running` \| `failed` \| `enabled` |
---
### `system_stats`
Get system resource usage.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `include` | `array` | ā | `["all"]` | `cpu` \| `memory` \| `disk` \| `network` \| `uptime` \| `processes` \| `all` |
---
### `docker`
Manage Docker containers.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `action` | `enum` | ā
| ā | `ps` \| `start` \| `stop` \| `restart` \| `logs` \| `stats` \| `images` |
| `container` | `string` | ā | ā | Container name/ID (required for `start`/`stop`/`restart`/`logs`) |
| `log_lines` | `number` | ā | `50` | Lines to show (for `logs` action) |
---
### `firewall`
Manage UFW firewall rules.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `action` | `enum` | ā
| ā | `status` \| `allow` \| `deny` \| `delete` \| `reset` |
| `rule` | `string` | ā | ā | Rule spec (e.g., `80/tcp`, `443`, `from 10.0.0.1`) |
## š Project Structure
```
src/
āāā index.ts # Server bootstrap & lifecycle
āāā ssh.ts # SSHManager class (connection pooling)
āāā types.ts # Shared TypeScript types
āāā helpers.ts # Response helper functions
āāā tools/
āāā index.ts # Tool registration barrel
āāā run-command.ts # Shell command execution
āāā read-file.ts # SFTP file reading
āāā write-file.ts # SFTP file writing
āāā list-directory.ts
āāā manage-service.ts
āāā list-services.ts
āāā system-stats.ts
āāā docker.ts
āāā firewall.ts
```
## š Security Notes
- The server connects via SSH using **key-based authentication** (no passwords).
- Commands run with the privileges of the configured SSH user.
- Service management and firewall tools use `sudo` ā ensure your SSH user has appropriate sudoers permissions.
- The server maintains a persistent SSH connection that is automatically reconnected if dropped.
## š License
MIT
TDQS
Scored across 9 tools
Each tool targets a distinct resource or action: file operations, directory listing, command execution, service management, system stats, Docker, and firewall. The run_command tool is a catch-all but has a clearly separate purpose as an arbitrary command executor.
Most tools follow a verb_noun pattern (e.g., read_file, manage_service), but 'docker' and 'firewall' are bare nouns, and 'system_stats' is noun_noun. These are minor deviations that don't impede comprehension.
With 9 tools, the set is well-scoped for VPS management. Each tool covers a distinct area without redundancy or bloat, fitting comfortable within the ideal range.
The set covers core operations: file read/write/list, command execution, service management, system stats, Docker, and firewall. Missing file deletion/renaming and some advanced administrative tasks, but the surface is sufficient for common VPS workflows.