GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Descripción del creador (original en inglés)
Stdio MCP server that inspects and (with confirmation) mutates one VPS over SSH.
Estos tres nunca se combinan en una sola puntuación: las opiniones, las mediciones y la popularidad son cosas distintas.
Todavía no escribimos un resumen sencillo para este. Abajo están los datos que leímos del registro.
Elige la app de IA que usas y copia la configuración.
VPS_SSH_KEY_PATH, VPS_HOST, VPS_USER, VPS_PORT, VPS_COMPOSE_DIR, VPS_COMMAND_TIMEOUT_MS, VPS_LOG_MAX_BYTES, VPS_ALLOW_MUTATIONS, VPS_SSH_KEY_PASSPHRASELos valores marcados como secretos son llaves de tu cuenta. Nunca los compartas ni los pegues en un chat.
Necesitas
¿Qué app usas?
Elige tu app arriba. La recordamos, así que la próxima vez el botón dirá “Instalar en …”.
Abre Claude Desktop → Settings → Developer → Edit Config y pega esto en claude_desktop_config.json
{
"mcpServers": {
"vps-ops": {
"command": "npx",
"args": [
"-y",
"@koller-nexus/vps-ops-mcp"
],
"env": {
"VPS_SSH_KEY_PATH": "your-value",
"VPS_HOST": "your-value",
"VPS_USER": "your-value",
"VPS_PORT": "your-value",
"VPS_COMPOSE_DIR": "your-value",
"VPS_COMMAND_TIMEOUT_MS": "your-value",
"VPS_LOG_MAX_BYTES": "your-value",
"VPS_ALLOW_MUTATIONS": "your-value",
"VPS_SSH_KEY_PASSPHRASE": "your-value"
}
}
}
}Ejecuta esto en tu terminal
claude mcp add vps-ops --env VPS_SSH_KEY_PATH=your-value --env VPS_HOST=your-value --env VPS_USER=your-value --env VPS_PORT=your-value --env VPS_COMPOSE_DIR=your-value --env VPS_COMMAND_TIMEOUT_MS=your-value --env VPS_LOG_MAX_BYTES=your-value --env VPS_ALLOW_MUTATIONS=your-value --env VPS_SSH_KEY_PASSPHRASE=your-value -- npx -y @koller-nexus/vps-ops-mcpCompleta los valores vacíos antes de ejecutarlo.
Pégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json
{
"mcpServers": {
"vps-ops": {
"command": "npx",
"args": [
"-y",
"@koller-nexus/vps-ops-mcp"
],
"env": {
"VPS_SSH_KEY_PATH": "your-value",
"VPS_HOST": "your-value",
"VPS_USER": "your-value",
"VPS_PORT": "your-value",
"VPS_COMPOSE_DIR": "your-value",
"VPS_COMMAND_TIMEOUT_MS": "your-value",
"VPS_LOG_MAX_BYTES": "your-value",
"VPS_ALLOW_MUTATIONS": "your-value",
"VPS_SSH_KEY_PASSPHRASE": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Pégalo en .vscode/mcp.json de tu proyecto
{
"servers": {
"vps-ops": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@koller-nexus/vps-ops-mcp"
],
"env": {
"VPS_SSH_KEY_PATH": "your-value",
"VPS_HOST": "your-value",
"VPS_USER": "your-value",
"VPS_PORT": "your-value",
"VPS_COMPOSE_DIR": "your-value",
"VPS_COMMAND_TIMEOUT_MS": "your-value",
"VPS_LOG_MAX_BYTES": "your-value",
"VPS_ALLOW_MUTATIONS": "your-value",
"VPS_SSH_KEY_PASSPHRASE": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Este se ejecuta en tu computadora, y ChatGPT solo puede conectarse a servidores en internet. Elige otra app.
Tu elección se guarda en una cookie en este dispositivo; no necesitas cuenta.
VPS_HOST envVPS_USER envVPS_PORT envVPS_COMPOSE_DIR envVPS_COMMAND_TIMEOUT_MS envVPS_LOG_MAX_BYTES envVPS_ALLOW_MUTATIONS envEsta configuración se genera a partir de la ficha del creador en el registro. Si el README dice otra cosa, sigue el README.
Se ejecuta en tu computadora; la lista de herramientas aparece en tu app de IA después de instalarlo.
Revisamos información que cualquiera puede ver; no hemos leído el código. Las revisiones que no aplican no se cuentan. · Revisado el 8 nov 2026
El nombre en el registro se verificó con la cuenta de GitHub koller-nexus, dueña del repo
Todavía no hemos leído este repo en GitHub
Todavía no hemos leído este repo en GitHub
Este se ejecuta en tu computadora; no hay endpoint en internet
Se ejecuta en tu computadora y usa ajustes locales en su lugar
Se ejecuta en tu computadora; solo podemos leer listas de herramientas de endpoints en internet
Comparado con todos los servidores activos de esta categoría en el registro. Las estrellas solo cuentan cuando quien lo publica es dueño del repo.
Superó 1 de 1 revisiones básicas aplicables. No hemos leído el código. Antes de agregar una clave o un token, revisa qué acceso pide el servidor y usa una clave que tenga solo los permisos que necesitas.
Debes completar: VPS_SSH_KEY_PATH, VPS_SSH_KEY_PASSPHRASE
Se ejecuta en tu computadora. Tu app de IA lo inicia cuando hace falta, y los datos no pasan por los servidores del creador (a menos que el propio servidor llame a un servicio en línea).
El repo de GitHub cambió por última vez –, y la última versión (0.1.0) llegó al registro hace 2 meses.
Las apps compatibles con MCP, como Claude Desktop, Claude Code, Cursor y VS Code. También necesitas Node.js en tu computadora.
En la misma categoría: GitHub, Desktop Commander, Cloudflare MCP
Servidores de la misma categoría hechos por otros creadores, ordenados por estrellas.
Cómo leer una tarjeta:↓ Descargas por semanai★ Estrellas de GitHubiTres pilares: reseñas · revisiones · usoiActualizado = fecha en que se publicó la última versión en el registroi
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
Copiado tal cual del repo del creador. PopNx MCP no lo ha revisado ni lo respalda. Se quitaron HTML, imágenes y scripts. Los enlaces llevan fuera de este sitio.
A stdio MCP server that operates one VPS over SSH. Cursor and Codex start the process with bun and call read-only tools (host health, Unix debug, Docker, Compose, Swarm, firewall) plus mutation tools (restart, stop, start, prune). Mutations require an explicit confirmation.
Transport is stdio. Do not start the server as a long-lived process by hand: the client (Cursor or Codex) launches it.
See CONTRIBUTING.md (branches, pull requests, verification) and ISSUE.md (how to file an issue).
ssh on PATH)sudo -n for ufw, fail2ban, sshd -T, ss, and dmesg if you use those tools)cp .env.example .env
Edit .env. The file is gitignored.
| Variable | Required | Default | Purpose |
|---|---|---|---|
VPS_SSH_KEY_PATH | yes | — | Absolute path to the private key. The process refuses to start if the file is missing or unreadable. |
VPS_HOST | no | vps.example.invalid | SSH host (placeholder; set your own host). |
VPS_USER | no | ubuntu | SSH user. |
VPS_PORT | no | 22 | SSH port. |
VPS_COMPOSE_DIR | no | — | Absolute Compose directory on the VPS. Without it, Compose tools require the dir argument. |
VPS_COMMAND_TIMEOUT_MS | no | 30000 | Remote command timeout. Expiry returns exit_code 124. |
VPS_LOG_MAX_BYTES | no | 200000 | Cap for stdout/stderr. Overflow is cut and truncated is true. |
VPS_ALLOW_MUTATIONS | no | true | false, 0, no, or off disables every mutation. |
VPS_SSH_KEY_PASSPHRASE | no | — | Avoid. Prefer ssh-agent. Registration scripts do not copy this variable into the client. |
VPS_COMPOSE_DIR must be absolute and match /^[a-zA-Z0-9/_.-]+$/ (it must start with /).
bun install
npm package (requires Bun; the MCP Registry points at this artifact):
bunx @koller-nexus/vps-ops-mcp
MCP Registry name: io.github.koller-nexus/vps-ops-mcp. The registry publishes metadata only after the package exists on public npm.
The scripts write MCP config from variables already exported in the shell. They do not load .env themselves. If you skip the export, the scripts fall back to their defaults (host, user, port, and a local key path).
Do this once at the repository root before each script:
set -a
source .env set +a
Each run backs up the destination file (*.bak.YYYYMMDDHHMMSS) and replaces only the vps-ops server. Other MCP servers stay in place.
Optional script variables:
| Variable | Default | Purpose |
|---|---|---|
MCP_PROJECT_DIR | this repository root | Source of the src/index.ts path. |
CURSOR_MCP_JSON | ~/.cursor/mcp.json | Cursor file to update. |
CODEX_CONFIG | ~/.codex/config.toml | Codex file to update. |
VPS_COMPOSE_DIR is written into the client config only when it is set and non-empty.
Global registration (applies in every workspace):
./scripts/register-cursor-mcp.sh
The script writes ~/.cursor/mcp.json in this shape:
{
"mcpServers": { "vps-ops": { "command": "bun", "args": ["/absolute/path/vps-ops-mcp/src/index.ts"], "env": { "VPS_HOST": "your.host", "VPS_USER": "ubuntu", "VPS_PORT": "22", "VPS_SSH_KEY_PATH": "/absolute/path/to/key", "VPS_COMMAND_TIMEOUT_MS": "30000", "VPS_LOG_MAX_BYTES": "200000", "VPS_ALLOW_MUTATIONS": "true" } } } }
To scope it to one project, point the script at that project's mcp.json:
CURSOR_MCP_JSON="/absolute/path/to/project/.cursor/mcp.json" ./scripts/register-cursor-mcp.sh
Then reload the Cursor window (Command Palette → Developer: Reload Window) or restart the server under Settings → MCP. The server appears as vps-ops.
./scripts/register-codex-mcp.sh
The script writes ~/.codex/config.toml:
[mcp_servers.vps-ops]
command = "bun" args = ["/absolute/path/vps-ops-mcp/src/index.ts"]
[mcp_servers.vps-ops.env] VPS_HOST = "your.host" VPS_USER = "ubuntu" VPS_PORT = "22" VPS_SSH_KEY_PATH = "/absolute/path/to/key" VPS_COMMAND_TIMEOUT_MS = "30000" VPS_LOG_MAX_BYTES = "200000" VPS_ALLOW_MUTATIONS = "true"
Close and reopen the Codex session so it rereads config.toml. If the CLI is on PATH, codex mcp list should show vps-ops.
Test SSH outside MCP with the same flags the server uses:
ssh -i "$VPS_SSH_KEY_PATH" \
-o BatchMode=yes \ -o IdentitiesOnly=yes \ -o StrictHostKeyChecking=accept-new \ -p "${VPS_PORT:-22}" \ "${VPS_USER}@${VPS_HOST}" \ 'uname -a'
In Cursor or Codex, ask the client to call vps_ping. The response is JSON:
{
"exit_code": 0, "stdout": "...", "stderr": "", "duration_ms": 0, "truncated": false }
A non-zero exit_code is an MCP error. If the process exits immediately with VPS_SSH_KEY_PATH is required or missing or unreadable, the variable never reached the client env — rerun the registration script with .env exported.
Every call returns exit_code, stdout, stderr, duration_ms, and truncated.
| Tool | Arguments | What it does |
|---|---|---|
vps_ping | — | uname -a, uptime, hostname. |
vps_resources | — | df -h, free -h, load average. |
vps_journal | unit, n? (1–500, default 100) | journalctl -u. Unit from the allowlist (docker, sshd, fail2ban, ufw, cron, with or without .service) or a safe name ending in .service. |
docker_ps | — | docker ps -a as JSON lines. |
docker_inspect | name | docker inspect. |
docker_logs | name, n? (1–1000, default 200), since? | docker logs --tail --timestamps. |
docker_stats | — | docker stats --no-stream. |
docker_service_ls | — | docker service ls em JSON lines (Swarm). |
docker_node_ls | — | docker node ls em JSON lines (Swarm). |
compose_ps | dir?, file? | docker compose ps em dir ou VPS_COMPOSE_DIR (file, ex. stack.yml, vira -f). |
compose_config_vars | dir?, file? | Renderiza o stack (docker compose config) e devolve só os nomes das variáveis de ambiente por serviço, nunca os valores. |
host_deps | — | Versões de docker, docker compose (v2) e jq. |
host_listen | — | ss -lntup (sudo -n, senão sem sudo). |
host_failed_units | — | systemctl --failed --no-pager --full. |
host_top | — | Top 30 processes by memory (ps aux --sort=-%mem). |
host_dmesg | n? (1–200, default 100) | dmesg -T + tail (sudo -n, otherwise without sudo). |
host_firewall | — | ufw status verbose (sudo -n, otherwise without sudo). |
host_fail2ban | jail? | fail2ban-client status (sudo -n). |
ssh_hardening_check | — | Filtered sshd -T: port, password, root login, pubkey. |
Container, service, image, and jail names must match ^a-zA-Z0-9*$.
These require confirm: true. With VPS_ALLOW_MUTATIONS=false, all of them are rejected.
| Tool | Extra arguments | Remote command |
|---|---|---|
docker_restart | name | docker restart |
docker_stop | name | docker stop |
docker_start | name | docker start |
compose_up | dir?, services? | docker compose up -d |
compose_restart | dir?, services? | docker compose restart |
compose_pull_up | dir?, services? | docker compose pull then up -d |
docker_rm | name, force_name | docker rm -f. force_name must equal name. |
disk_cleanup_docker | confirm_volumes? | docker system prune -f. Volumes only with confirm_volumes: true. |
BatchMode=yes, IdentitiesOnly=yes, and StrictHostKeyChecking=accept-new.confirm: true is rejected. docker_rm asks for the name twice. Volume prune requires confirm_volumes: true.VPS_ALLOW_MUTATIONS=false.