vps-ops-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@vps-ops-mcp check health and SSL status for my-vps"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
vps-ops-mcp
Don't give your AI raw root SSH. A safe, structured MCP server that lets Claude (or any MCP client) inspect and operate your VPS — nginx, PM2, SSL, UFW, fail2ban — through typed, allowlisted tools instead of free-form shell access.
Read-only by default. Mutating actions don't even exist unless you opt in with an environment variable.
You: "Is everything OK on my server? Any cert expiring soon?"
Claude → server_health(myvps) → load 0.08, disk 61%, RAM fine
→ ssl_status(myvps) → b2fest.com expires in 71 days ✓
→ security_audit(myvps) → ufw active, root login disabled ✓Why not just an SSH MCP server?
Generic SSH MCP servers hand the model a root shell and hope for the best. This server takes the opposite approach:
Raw SSH MCP | vps-ops-mcp | |
Command surface | anything | fixed command templates only |
User input in commands | interpolated | strict allowlist regex, rejected otherwise |
Credentials | often stored in config | never touched — delegates to your |
Password prompts | can hang |
|
Writes/restarts | always on | off by default, opt-in via env var |
| sure, why not | refused by design |
Related MCP server: mcp-tool-server
Quickstart
Requires Node 18+ and a working ssh <your-host> from your terminal (key-based auth).
Claude Code
claude mcp add vps-ops -- npx -y vps-ops-mcpClaude Desktop / Cursor / any MCP client — add to your MCP config:
{
"mcpServers": {
"vps-ops": {
"command": "npx",
"args": ["-y", "vps-ops-mcp"]
}
}
}Then just ask: "Check the health of myvps" (any alias from your ~/.ssh/config, or user@host).
Enabling mutations (optional)
By default the server is strictly read-only. To enable the two mutating tools (nginx_check_and_reload, pm2_restart):
{
"mcpServers": {
"vps-ops": {
"command": "npx",
"args": ["-y", "vps-ops-mcp"],
"env": { "VPS_OPS_ALLOW_MUTATIONS": "true" }
}
}
}Even then: no free-form commands, nginx -t always runs before a reload, and pm2 restart all is refused.
Tools
Tool | What it does | Needs |
| Lists aliases from your local | nothing (local) |
| Uptime, load, memory, disk, top processes | ssh |
| Enabled nginx sites, PM2 process list, running web services | ssh |
| Cert expiry for every domain found in nginx configs (or one domain) | ssh |
| Tail nginx access/error, PM2 app, or journald unit logs | ssh (some logs: sudo) |
| Listening ports, UFW, fail2ban, sshd hardening, pending security updates, recent logins | ssh (richer with sudo) |
|
| opt-in + sudo |
| Restart one named PM2 app (never | opt-in |
🔒 = only registered when VPS_OPS_ALLOW_MUTATIONS=true.
About sudo
Some checks (ufw, fail2ban, sshd -T) need root. The server always uses sudo -n (non-interactive): if passwordless sudo isn't configured for those commands, the check degrades gracefully and tells you, instead of hanging on a password prompt. You choose how much to allow in /etc/sudoers.d/.
Safety model
No credential handling. We spawn your system
sshbinary. Keys, agents,ProxyJump,known_hosts— all yours, all untouched.Fixed command templates. Remote commands are string constants. There is no
run_commandtool and there never will be one in read-only mode.Allowlist validation. Every user-supplied value (host, app name, domain, unit) must match a strict regex before it goes anywhere near a command line. No escaping heuristics — invalid input is simply rejected.
Bounded output. Every call has a timeout and an output cap, so a runaway
tailcan't flood your context window.Mutations are opt-in and minimal. Two tools, both narrow, both guarded.
Roadmap
site_provision— nginx vhost + certbot + PM2 registration in one guarded flowDocker container inventory & log tools
Caddy support
Multi-server fleet summary (
health across all hosts)Scheduled-check examples (cron + Claude Code headless)
PRs welcome — especially real-world ops workflows this doesn't cover yet.
License
MIT © Azat Akdağ
Available Tools
6 toolslist_hostsList SSH hostsA
Lists host aliases from the local ~/.ssh/config. Purely local — no connection is made. Use one of these aliases as the host argument for the other tools.
Inputs: no named parameters.
list_sitesList hosted sites & appsA
Read-only inventory of what a server hosts: enabled nginx sites (domains, ports, upstreams), PM2 process list, and running web-related systemd services.
Inputs: host (required).
read_logsRead server logsA
Read-only tail of common logs: nginx access/error, a PM2 app, or a systemd unit's journal. name is required for pm2 (app name) and journal (unit name).
Inputs: host (required), source (required), name, lines.
security_auditSecurity auditA
Read-only security posture check: listening ports, UFW firewall rules, fail2ban jails, sshd hardening flags (root login / password auth), pending security updates, recent logins. Sub-checks that need passwordless sudo degrade gracefully with a note.
Inputs: host (required).
server_healthServer health checkA
Read-only snapshot of a server: uptime, load average, memory, disk usage, and the top processes by CPU and memory.
Inputs: host (required).
ssl_statusSSL certificate statusA
Checks TLS certificate expiry dates. Without domain, auto-discovers domains from the server's nginx configs and checks each one (max 20). Read-only; runs openssl s_client on the server itself, so it also works for internal-only DNS.
Inputs: host (required), domain.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: listing SSH hosts, inventorying sites, reading logs, security auditing, health checks, and SSL status. There is no overlap in functionality.
All tool names use snake_case and follow a predictable pattern, though not all are verb_noun (e.g., security_audit, server_health, ssl_status are noun_noun). Overall consistent and readable.
Six tools is a well-scoped set for a VPS monitoring server, covering essential inspection operations without unnecessary bloat.
The tool set covers major inspection needs for a VPS (hosts, sites, logs, security, health, SSL). Missing action-oriented tools (e.g., restart, deploy), but the read-only focus is intentional and well-covered.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceA security-first MCP server that gives AI assistants controlled, safe access to manage remote servers via SSH with whitelisted operations and no generic command execution.MIT
- AlicenseNot gradedqualityDmaintenanceA secure, production-grade MCP server that provides filesystem operations, AST math evaluation, and system diagnostics for LLM agents.MIT

masaro-infra-mcpofficial
FlicenseNot gradedqualityCmaintenanceA secure MCP server providing read-only tools to interact with Cloudflare, Coolify, and other infrastructure services, enabling AI clients to safely diagnose and validate environments.-- AlicenseNot gradedqualityDmaintenanceA safe, configurable MCP server enabling AI agents to sync, deploy, diagnose, and compare remote servers via structured tools like rsync and SSH.71 npm5MIT