Skip to main content
Glama
README.md
# šŸ–„ļø 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

A3.6/5.0

Scored across 9 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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.

Maintenance

ActivityInactive
ResponsivenessNo issues