proxmox-ai
proxmox-ai
Сервер MCP, который позволяет ИИ-агенту управлять Proxmox VE на естественном языке, никогда не давая ему больше власти, чем строго необходимо.
"¿Qué contenedores están ejecutándose?" → responde
"¿Cuál está consumiendo más RAM?" → responde
"Reinicia el CT 105" → propone, espera confirmación, ejecuta
"Haz rollback del snapshot pre-update" → exige una frase literal del humano
"Borra el CT 105" → no existe esa herramientaДизайн исходит из идеи: модель предлагает, движок политик решает, а журнал аудита запоминает.
Статус
Фаза 1 (только чтение) реализована и протестирована. Фазы 2–5 реализованы, но отключены по умолчанию: они включаются по одной с помощью переменных окружения, и каждая также требует своего привилегированного доступа в ACL Proxmox. См. docs/roadmap.md.
Инструменты MCP | 27 |
Тесты | 229 ( |
Зависимости |
|
Python | ≥ 3.11 |
Быстрая установка
На узле Proxmox создайте выделенного пользователя и токен:
./scripts/setup-proxmox-user.shСкопируйте секрет токена: Proxmox больше его не покажет.
В контейнере, где будет жить MCP (см. docs/instalacion.md для его создания):
git clone https://github.com/dallaswk/proxmox-ai.git
cd proxmox-ai
python3 -m venv .venv && . .venv/bin/activate
pip install -e .
cp .env.example .env && chmod 600 .env
$EDITOR .env # PROXMOX_HOST, PROXMOX_TOKEN_ID, PROXMOX_TOKEN_SECRETПроверьте, что он запускается и видит инфраструктуру:
set -a && . ./.env && set +a
proxmox-ai # habla MCP por stdin/stdout; Ctrl-C para salirПодключите его к вашему MCP-клиенту (Claude Desktop, Claude Code и т. д.):
{
"mcpServers": {
"proxmox": {
"command": "/opt/proxmox-ai/.venv/bin/proxmox-ai",
"env": {
"PROXMOX_HOST": "proxmox.midominio.local",
"PROXMOX_TOKEN_ID": "ai-agent@pve!mcp",
"PROXMOX_TOKEN_SECRET": "...",
"PROXMOX_AI_READ_ONLY": "true",
"PROXMOX_AI_AUDIT_LOG": "/var/log/proxmox-ai/audit.jsonl"
}
}
}
}Как работает безопасность
Четыре независимых уровня. Каждый работает сам по себе:
1. ACL Proxmox. Это реальная граница. Токен — это выделенный пользователь с --privsep 1, никогда не root@pam, и в Фазе 1 у него только PVEAuditor. Токен, который не может удалить ВМ, не удалит её, даже если всё остальное выйдет из строя.
2. Флаги возможностей. PROXMOX_AI_READ_ONLY=true блокирует любую запись независимо от остальной конфигурации. У каждой фазы есть свой флаг, а необратимые операции требуют дополнительного.
3. Двухэтапное подтверждение. Инструмент записи, вызванный без confirm_token, ничего не трогает: он возвращает план и одноразовый токен, привязанный к этому точному действию. Человек видит план между двумя вызовами. Для необратимых операций необходимо также отправить буквальную фразу (CONFIRMO ROLLBACK SNAPSHOT 105); простого «да» недостаточно.
4. Никакого произвольного shell. Нет execute_any_command. Команды внутри гостевых систем проходят через белый список argv, с двумя чёрными списками впереди — бинарники (rm, dd, bash…) и деструктивные опции — и отклонением метасимволов shell. Чёрный список опций существует потому, что бинарник, который выглядит как для чтения, может иметь флаг, который таковым не является: journalctl -u nginx --vacuum-time=1s удаляет архивные логи. Аргументы дополнительно экранируются с помощью shlex.quote, потому что ssh host cmd всегда переинтерпретируется удалённым shell.
А под всем этим — журнал JSONL append-only с каждой попыткой — включая отклонённые — и ни одного секрета.
Что это не решает: MCP-сервер не может отличить «человек сказал да» от «модель решила продолжить». Двухэтапное подтверждение гарантирует, что ничего необратимого не произойдёт как побочный эффект одного вызова, и оставляет след всего, но долгосрочная гарантия — это ACL. Это объяснено без прикрас в docs/modelo-de-seguridad.md.
Инструменты
Фаза 1 — чтение (активна по умолчанию, нужен только PVEAuditor)
Инструмент | Для чего |
| Что разрешено прямо сейчас |
| Узлы с CPU, RAM и корневым диском |
| LXC и ВМ с их потреблением; отсюда берутся VMID |
| Рейтинг по RAM, CPU или диску |
| Детальное состояние гостя |
| Конфигурация: ядра, память, диски, сеть |
| Исторические RRD: отличает пик от устойчивой проблемы |
| Свободное место, с предупреждениями при 85% и 92% |
| Недавние задачи и какие из них завершились с ошибкой |
| Полный журнал задачи |
| Снимки гостя |
| Доступные резервные копии |
| Полная проверка: узлы, гости, хранилище, задачи |
Фаза 2 — включение (PROXMOX_AI_ENABLE_POWER, прив. VM.PowerMgmt)
pve_guest_power — start, shutdown, reboot, stop. Обязательное подтверждение.
Фаза 3 — снимки (PROXMOX_AI_ENABLE_SNAPSHOT, прив. VM.Snapshot)
pve_create_snapshot (уровень 1) · pve_rollback_snapshot и pve_delete_snapshot (уровень 2: буквальная фраза + PROXMOX_AI_ENABLE_DESTRUCTIVE)
Фаза 4 — резервное копирование (PROXMOX_AI_ENABLE_BACKUP, прив. VM.Backup)
pve_create_backup — уровень 1. Восстановление намеренно не реализовано: это самая разрушительная операция в Proxmox. См. docs/modelo-de-seguridad.md.
Фаза 5 — диагностика внутри гостевых систем (PROXMOX_AI_ENABLE_GUEST_EXEC)
Инструмент | Для чего |
| Что может выполнять агент |
| Работает ли nginx? |
| journalctl, опционально только ошибки |
|
|
| Состояние и логи контейнеров Docker |
| Команда из белого списка |
| Полная диагностика веб-стека |
| Перезапуск службы. Уровень 1 |
Реальный пример двухэтапного подтверждения
Usuario: Reinicia el CT 105.
Agente: [pve_guest_power vmid=105 operation=reboot]
→ confirmation_required
"REBOOT CT 105 (web-production) on node pve1 — will request a
clean reboot via the guest OS."
nothing_has_changed: true
confirm_token: "kJ8x...b2"
Voy a reiniciar el CT 105 (web-production) en el nodo pve1.
Es un reinicio limpio a través del sistema operativo. ¿Confirmas?
Usuario: Sí.
Agente: [pve_guest_power vmid=105 operation=reboot confirm_token="kJ8x...b2"]
→ status: completed
Reiniciado. La tarea terminó con estado OK.Если бы агент попытался использовать тот же токен для CT 101 или для stop вместо reboot, движок отклонил бы его: токен привязан через HMAC к точному действию, гостю и параметрам.
Разработка
pip install -e ".[dev]"
pytest # 229 tests, sin red ni Proxmox real
ruff check src testsТесты используют httpx.MockTransport с фальшивым кластером (1 узел, 2 CT, 1 ВМ, 2 хранилища). Для разработки не нужен Proxmox.
Документация
docs/instalacion.md — пошаговая установка
docs/modelo-de-seguridad.md — угрозы и ограничения
docs/roadmap.md — 7 фаз, с чек-листом
docs/especificacion-original.md — исходный документ
Лицензия
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for AI dialogue using various LLM models via AceDataCloud
MCP server for Gainium — manage trading bots, deals, and balances via AI assistants
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dallaswk/proxmox-ai'
If you have feedback or need assistance with the MCP directory API, please join our Discord server