ProxmoxMCP-Plus

Servidor MCP Proxmox VE para VMs, LXCs, snapshots, backups, armazenamento e operações de cluster.

Documentação

ProxmoxMCP-Plus

ProxmoxMCP-Plus Logo

Opere o Proxmox VE a partir de clientes MCP, agentes de IA e ferramentas OpenAPI através de um plano de controle consciente de segurança para VMs, LXCs, snapshots, backups, ISOs, comandos de contêiner e trabalhos persistentes de longa duração.

PyPI GitHub Release CI GHCR License

Início Rápido | Instalação do Cliente | Demonstração | Ferramentas | Segurança | Cenários | Documentação | Wiki

ProxmoxMCP-Plus architecture

Por que ProxmoxMCP-Plus

O ProxmoxMCP-Plus fica entre clientes de IA e o Proxmox VE para que os operadores não precisem montar chamadas de API brutas, scripts shell avulsos e sondagens de trabalhos personalizadas para cada fluxo de trabalho.

Ele expõe a mesma superfície operacional de duas maneiras:

  • MCP para Claude Desktop, Cursor, VS Code, Open WebUI, Codex e outros agentes compatíveis com MCP
  • OpenAPI para automação HTTP, painéis, ferramentas internas e fluxos de trabalho sem código

O que você obtém:

  • Ações de ciclo de vida de VM e LXC
  • criação, reversão e exclusão de snapshots
  • fluxos de trabalho de backup e restauração
  • download e limpeza de ISO
  • inspeção de nós, armazenamento e cluster
  • execução de comandos em contêiner via SSH com proteções
  • rastreamento persistente de trabalhos para tarefas assíncronas do Proxmox

O Que Torna Diferente

PrioridadeComo o projeto lida com isso
Caminhos de acesso duplosMCP nativo para fluxos de trabalho de agentes e OpenAPI para automação HTTP padrão
Fluxos de trabalho orientados ao ProxmoxOperações de VM, LXC, snapshot, backup, ISO, armazenamento e cluster no dia 2
Operações de longa duraçãojob_ids estáveis, rastreamento de UPID do Proxmox, sondagem, repetição, cancelamento e histórico de auditoria
Execução mais seguraTokens de API do Proxmox, autenticação bearer OpenAPI, política de comandos, tokens de aprovação, validação TLS e controles de Host/Origem HTTP do MCP
Validação realPontos de entrada de testes unitários, de integração, Docker/OpenAPI e e2e ao vivo do Proxmox documentados no repositório

Início Rápido

1. Prepare as Credenciais do Proxmox

Crie um token de API do Proxmox com apenas as permissões que seus fluxos de trabalho precisam. Em seguida, crie o arquivo de configuração local:

cp proxmox-config/config.example.json proxmox-config/config.json

Depois edite proxmox-config/config.json com seu ambiente. No mínimo, ele precisa de:

  • proxmox.host
  • proxmox.port
  • auth.user
  • auth.token_name
  • auth.token_value

Adicione também uma seção ssh se quiser execução de comandos em contêiner. Adicione uma seção jobs se quiser que o estado dos trabalhos seja persistido em outro local que não o arquivo SQLite local padrão.

Para verificação real ao vivo, use um proxmox-config/config.live.json separado criado a partir de proxmox-config/config.live.example.json. Não aponte o e2e ao vivo para um config.json de espaço reservado ou somente local, a menos que você execute intencionalmente um túnel de API local lá.

Configuração opcional de persistência de trabalhos:

{
  "jobs": {
    "sqlite_path": "proxmox-jobs.sqlite3"
  }
}

A filtragem opcional de exposição de ferramentas pode reduzir os esquemas enviados aos clientes MCP. Ela está desabilitada por padrão, portanto as configurações existentes continuam expondo todas as ferramentas disponíveis. Configure exatamente um modo em mcp:

{
  "mcp": {
    "tool_allowlist": ["get_nodes", "get_vms", "get_containers", "get_storage"]
  }
}

Alternativamente, use tool_denylist, ou as variáveis de ambiente separadas por vírgula MCP_TOOL_ALLOWLIST e MCP_TOOL_DENYLIST. Não configure os dois modos. A seleção por ambiente substitui o modo de filtragem em nível de arquivo. Uma lista de permissões vazia não expõe nenhuma ferramenta; uma lista de bloqueios vazia não oculta nenhuma. Nomes exatos de ferramentas em minúsculas são obrigatórios, e nomes desconhecidos falham na inicialização para que um erro de digitação não amplie silenciosamente o acesso. Reinicie ou reconecte o servidor MCP após alterar o filtro.

2. Escolha um Caminho de Execução

CaminhoMelhor paraComando de inícioVerificar
MCP stdio do PyPIClaude Desktop, Cursor, VS Code, Codex, agentes locaisuvx proxmox-mcp-pluso cliente lista get_nodes, get_vms e ferramentas de trabalho
MCP HTTP nativo do Dockerclientes MCP remotos que suportam Streamable HTTPdocker compose --profile mcp-http up -d proxmox-mcp-httpconecte-se a http://localhost:8000/mcp
Ponte OpenAPI do Dockerclientes HTTP, painéis, scripts, ferramentas sem códigodocker compose up -dcurl -f http://localhost:8811/livez

MCP stdio com PyPI

uvx proxmox-mcp-plus

Ou instale primeiro:

pip install proxmox-mcp-plus
proxmox-mcp-plus

Use este caminho quando o cliente MCP iniciar um servidor stdio local.

Modo de Código (opt-in)

O Modo de Código está desabilitado por padrão para preservar o catálogo completo de ferramentas legado. Habilite-o com mcp.code_mode: true no arquivo de configuração ou MCP_CODE_MODE=true. Quando habilitado, o MCP expõe três ferramentas em vez disso: proxmox_code_search, proxmox_code_get_schema e proxmox_code_execute. A execução de código ocorre em um sandbox isolado e alcança as ferramentas de domínio através do caminho existente de validação, política e aprovação. A descoberta usa o catálogo de execução filtrado, portanto também funciona em wheels instalados. Por exemplo:

await call_tool("get_nodes", {"target": "default"})

A expressão final é retornada como data.result; os resultados das ferramentas usam blocos de conteúdo JSON do MCP (e conteúdo estruturado quando fornecido). Use proxmox_code_get_schema para argumentos, incluindo target e tokens de aprovação. Os scripts não têm acesso a sistema de arquivos ou rede, exceto chamadas de ferramentas registradas. Limites: 64.000 caracteres de código-fonte, 100 MB de memória do sandbox, 25 chamadas de ferramentas, 16 KB de JSON final e duas execuções simultâneas. A execução tem um orçamento de 30 segundos; cancelar ou falhar um script não reverte os efeitos colaterais das ferramentas. Não repita automaticamente um script de mutação com falha.

Reutilização opcional de workers: defina mcp.code_mode_pool_reuse: true ou MCP_CODE_MODE_POOL_REUSE=true. O padrão permanece um worker novo por execução. A reutilização mantém até dois workers durante a vida útil do servidor, recicla cada um após 100 checkouts e inicia uma nova sessão de sandbox por solicitação. Globais, aprovações, coletores de saída e limites de chamadas não são compartilhados entre solicitações. Clientes HTTP compartilham o pool de propriedade do servidor; desconectar um cliente não o fecha. Execute python scripts/benchmark_code_mode.py para medir a sobrecarga local de inicialização; isso é um microbenchmark, não uma estimativa da latência das operações do Proxmox.

MCP HTTP nativo com Docker

Use este caminho quando um cliente MCP remoto suportar Streamable HTTP:

export MCP_API_KEY="$(openssl rand -hex 32)"
docker run --rm -p 8000:8000 \
  -e PROXMOX_MCP_MODE=mcp-http \
  -e MCP_HOST=0.0.0.0 \
  -e MCP_PORT=8000 \
  -e MCP_TRANSPORT=STREAMABLE_HTTP \
  -e MCP_API_KEY="$MCP_API_KEY" \
  -v "$(pwd)/proxmox-config/config.json:/app/proxmox-config/config.json:ro" \
  ghcr.io/rekklesna/proxmoxmcp-plus:latest

Aponte os clientes MCP para:

http://<docker-host>:8000/mcp

Envie Authorization: Bearer <MCP_API_KEY> com cada solicitação HTTP MCP nativa. A chave é independente das credenciais do Proxmox. Streamable HTTP nativo e SSE exigem uma chave por padrão. Para um endpoint protegido por uma camada externa de controle de acesso, como ACLs do Tailscale, defina explicitamente MCP_ALLOW_UNAUTHENTICATED_HTTP=true ou mcp.allow_unauthenticated_http: true na configuração JSON. Isso permite inicialização sem chave e registra um aviso; não configura nem verifica os controles de acesso externos. Um MCP_API_KEY configurado é sempre aplicado, mesmo com a opção de exclusão. Essa configuração não altera a autenticação OpenAPI nem a proteção contra rebinding de DNS.

Portão de navegador OAuth para clientes MCP

O MCP HTTP nativo pode opcionalmente expor um fluxo de código de autorização OAuth com PKCE enquanto mantém MCP_API_KEY como a única credencial humana que um operador precisa gerenciar. O tratamento do protocolo OAuth é delegado ao SDK Python do MCP (mcp>=1.30.0,<2), enquanto o ProxmoxMCP-Plus fornece a política de consentimento de chave de API e o estado OAuth persistente.

O estado OAuth é armazenado no PostgreSQL. Isso permite que vários workers ou hosts MCP compartilhem clientes registrados, códigos de autorização, tokens de acesso, tokens de atualização, proteção contra repetição de tokens de atualização e estado de limite de taxa de login sem depender de um sistema de arquivos local.

O cliente começa no endpoint /authorize do SDK. Após o SDK validar o cliente, URI de redirecionamento, escopo, solicitação PKCE e recurso, o navegador é redirecionado para /oauth/consent na mesma origem MCP. O usuário revisa o nome do cliente, origem de redirecionamento e escopos solicitados, e então insere MCP_API_KEY. A chave de API nunca é colocada em uma URL e nunca é retornada ao cliente OAuth.

Configurações OAuth obrigatórias:

export MCP_API_KEY="$(openssl rand -hex 32)"
export MCP_OAUTH_DATABASE_URL='postgresql://proxmox_oauth:secret@postgres.example:5432/proxmox_oauth'

Exemplo de servidor:

docker run --rm -p 8000:8000 \
  -e PROXMOX_MCP_MODE=mcp-http \
  -e MCP_HOST=0.0.0.0 \
  -e MCP_PORT=8000 \
  -e MCP_TRANSPORT=STREAMABLE_HTTP \
  -e MCP_API_KEY="$MCP_API_KEY" \
  -e MCP_OAUTH_ENABLED=true \
  -e MCP_OAUTH_ISSUER=https://mcp.example.com \
  -e MCP_OAUTH_DATABASE_URL="$MCP_OAUTH_DATABASE_URL" \
  -e MCP_ALLOWED_HOSTS=mcp.example.com:*,localhost:* \
  -e MCP_ALLOWED_ORIGINS=https://mcp.example.com \
  -v "$(pwd)/proxmox-config/config.json:/app/proxmox-config/config.json:ro" \
  ghcr.io/rekklesna/proxmoxmcp-plus:latest

Em seguida, conecte o cliente compatível com OAuth a:

https://mcp.example.com/mcp

O modo OAuth expõe estes endpoints na mesma origem pública:

  • /.well-known/oauth-protected-resource/mcp - metadados de recurso protegido RFC 9728
  • /.well-known/oauth-authorization-server - metadados do servidor de autorização do SDK
  • /register - registro dinâmico de clientes (DCR) do SDK
  • /authorize - endpoint de autorização do SDK
  • /token - troca de código de autorização/token de atualização do SDK
  • /oauth/consent - página de consentimento de chave de API do ProxmoxMCP-Plus

O SDK exige PKCE S256 e protege o recurso MCP com tokens de acesso OAuth emitidos. As transações de consentimento do navegador são de curta duração, assinadas com HMAC e sem estado. Todo o estado OAuth durável é armazenado no PostgreSQL.

O consumo de códigos de autorização e a rotação de tokens de atualização usam transações PostgreSQL. Um código ou token de atualização é excluído e seus tokens substitutos são inseridos atomicamente, portanto workers concorrentes não podem reproduzir com sucesso a mesma credencial. A capacidade de registro dinâmico de clientes também é serializada com um bloqueio consultivo com escopo de transação PostgreSQL; registros inativos são podados antes que o limite configurado seja excedido.

A rotação de chaves de API é versionada para segurança multi-worker. MCP_OAUTH_KEY_VERSION padrão é 1. Ao alterar MCP_API_KEY, incremente a versão ao mesmo tempo em cada novo worker. Uma versão mais alta invalida atomicamente os registros de clientes existentes e seus códigos/tokens dependentes. Um worker com uma versão mais antiga é rejeitado, e workers usando chaves diferentes com a mesma versão são rejeitados. Isso impede que um worker desatualizado reverta uma rotação de chave distribuída.

Obrigatório quando o OAuth está habilitado:

VariávelFinalidade
MCP_API_KEYCredencial humana inserida apenas na página de consentimento
MCP_OAUTH_ISSUEROrigem HTTPS pública deste servidor de autorização MCP
MCP_OAUTH_DATABASE_URLDSN PostgreSQL usado para o estado OAuth

Variáveis de ambiente OAuth opcionais:

VariávelPadrãoFinalidade
MCP_OAUTH_KEY_VERSION1Época monotônica da chave de API; incremente sempre que MCP_API_KEY mudar
MCP_OAUTH_RESOURCE<issuer>/mcpIdentificador público do recurso MCP; deve usar a origem do emissor
MCP_OAUTH_SCOPESmcpEscopos obrigatórios separados por vírgula
MCP_OAUTH_ACCESS_TOKEN_TTL_SECONDS3600Tempo de vida do token de acesso
MCP_OAUTH_REFRESH_TOKEN_TTL_SECONDS2592000Tempo de vida do token de atualização (30 dias)
MCP_OAUTH_MAX_REGISTERED_CLIENTS4096Máximo de clientes DCR persistidos antes da poda de clientes inativos
MCP_OAUTH_DB_POOL_MIN_SIZE1Mínimo de conexões asyncpg por worker MCP
MCP_OAUTH_DB_POOL_MAX_SIZE10Máximo de conexões asyncpg por worker MCP
MCP_OAUTH_DB_COMMAND_TIMEOUT_SECONDS10Tempo limite de comando PostgreSQL usado pelo armazenamento OAuth
MCP_OAUTH_CLIENT_IP_HEADERnão definidoCabeçalho de proxy reverso confiável usado apenas para limite de taxa de login

Para rotacionar a credencial do portão do navegador, implante a nova chave com uma versão mais alta, por exemplo:

MCP_API_KEY=<new-secret>
MCP_OAUTH_KEY_VERSION=2

Não reutilize um número de versão para uma chave diferente.

A função do banco de dados deve ser capaz de criar e modificar as tabelas proxmox_mcp_oauth_* em seu banco de dados. As tabelas contêm metadados de clientes OAuth, incluindo segredos de clientes emitidos, além de códigos de autorização e tokens ativos, portanto o banco de dados PostgreSQL e os backups devem ser protegidos como armazenamento de credenciais.

Se várias instâncias MCP usarem o mesmo MCP_OAUTH_DATABASE_URL, o estado OAuth e a aplicação de tokens de uso único são compartilhados entre elas. Dimensione o pool considerando o número total de workers MCP, pois os limites de pool configurados se aplicam por processo.

Se o servidor estiver atrás de um proxy reverso confiável e a limitação de taxa de login por usuário precisar usar o endereço original do cliente, defina MCP_OAUTH_CLIENT_IP_HEADER para um cabeçalho que o proxy sobrescreve (por exemplo, CF-Connecting-IP). Deixe-o não definido, a menos que o proxy impeça os clientes de falsificar esse cabeçalho.

Quando MCP_OAUTH_ENABLED=true, uma solicitação Authorization: Bearer <MCP_API_KEY> bruta para /mcp é rejeitada intencionalmente. A chave de API é aceita apenas pela página de consentimento; solicitações MCP devem usar um token de acesso OAuth emitido.

Ao servir MCP HTTP atrás de um proxy reverso, mantenha a proteção contra rebinding de DNS habilitada e permita apenas os hostnames que você espera.

Ponte OpenAPI com Docker

O modo OpenAPI é o runtime Docker padrão e requer uma chave de API:

export PROXMOX_API_KEY="$(openssl rand -hex 32)"
docker run --rm -p 8811:8811 \
  -e PROXMOX_API_KEY="$PROXMOX_API_KEY" \
  -v "$(pwd)/proxmox-config/config.json:/app/proxmox-config/config.json:ro" \
  ghcr.io/rekklesna/proxmoxmcp-plus:latest

Verifique a superfície OpenAPI:

curl -f http://localhost:8811/livez
curl -f -H "Authorization: Bearer $PROXMOX_API_KEY" http://localhost:8811/health
curl -H "Authorization: Bearer $PROXMOX_API_KEY" http://localhost:8811/openapi.json

Para desenvolvimento local não autenticado apenas, defina PROXMOX_ALLOW_NO_AUTH=true.

Checkout do código-fonte

git clone https://github.com/RekklesNA/ProxmoxMCP-Plus.git
cd ProxmoxMCP-Plus
uv venv
uv pip install -e ".[dev]"
python main.py

O serviço 8811 é a ponte OpenAPI/REST. O serviço 8000 é o endpoint MCP HTTP nativo.

Instalação do Cliente

Use os botões de um clique quando seu cliente suportar deeplinks de instalação MCP, ou copie a configuração JSON abaixo.

Install in VS Code Install in Cursor

Configuração stdio recomendada:

{
  "mcpServers": {
    "proxmox-mcp-plus": {
      "command": "uvx",
      "args": ["proxmox-mcp-plus"],
      "env": {
        "PROXMOX_HOST": "your-proxmox-host",
        "PROXMOX_USER": "root@pam",
        "PROXMOX_TOKEN_NAME": "mcp-token",
        "PROXMOX_TOKEN_VALUE": "your-token-secret",
        "PROXMOX_PORT": "8006",
        "PROXMOX_VERIFY_SSL": "true"
      }
    }
  }
}

Use um arquivo de configuração local se preferir não manter credenciais na configuração do cliente:

{
  "mcpServers": {
    "proxmox-mcp-plus": {
      "command": "uvx",
      "args": ["proxmox-mcp-plus"],
      "env": {
        "PROXMOX_MCP_CONFIG": "/path/to/ProxmoxMCP-Plus/proxmox-config/config.json"
      }
    }
  }
}

Exemplos específicos de cliente para Claude Desktop, Cursor, VS Code, Codex, OpenCode, Open WebUI, Streamable HTTP e OpenAPI estão no Guia de Configuração do Cliente e no Guia de Integrações.

Demonstração

Esta demonstração é uma gravação direta de terminal do qwen/qwen3.6-plus dirigindo uma sessão MCP ao vivo em inglês contra um laboratório Proxmox local. Ela mostra controle em linguagem natural fluindo através das ferramentas MCP para criar e iniciar um LXC, executar um comando no contêiner e confirmar a superfície HTTP /health autenticada.

Recorded demo gif

Assista à versão MP4

Escolha a Ferramenta Certa

Comece com descoberta somente leitura, depois passe para ferramentas de mutação apenas após o nó alvo, armazenamento, VMID e permissões estarem claros.

Objetivo do operadorComece comDepois useNotas
Inspecionar o clusterget_nodes, get_cluster_statusget_storage, get_vms, get_containersMelhor primeira verificação de saúde após a instalação do cliente
Criar ou gerenciar uma VMget_nodes, get_storagecreate_vm, start_vm, stop_vm, delete_vmMutações de longa duração retornam job_id e Proxmox task_id
Gerenciar LXCsget_containers, get_storagecreate_container, start_container, stop_container, delete_containerFerramentas de comando via SSH exigem a configuração opcional ssh
Reverter mudanças arriscadaslist_snapshots com vm_type=qemu ou vm_type=lxccreate_snapshot, rollback_snapshot, delete_snapshotCrie um snapshot antes de testes de fluxo de trabalho destrutivos
Executar comandos dentro de convidadosFerramentas de status de VM ou contêinerexecute_vm_command, execute_container_commandO caminho da VM precisa do QEMU Guest Agent; o caminho LXC precisa de SSH para o nó Proxmox
Rastrear trabalho assíncronoresposta de mutação com job_idpoll_job, get_job, list_jobs, retry_job, cancel_jobUse job_id para conversas agente/usuário e task_id para rastreabilidade bruta do Proxmox
Inspecionar logsget_node_syslog, get_cluster_logget_task_log, get_node_firewall_log, get_guest_firewall_logTodas as ferramentas de log são somente leitura; get_task_log aceita qualquer UPID do Proxmox
Automatizar a partir de ferramentas HTTP/openapi.json/jobs, /health, rotas de ferramentas geradasUse autenticação bearer e mantenha CORS restrito fora do desenvolvimento local

Para o mapa completo de ferramentas, veja o Guia de Seleção de Ferramentas e a Referência de API e Ferramentas.

Modelo de Segurança

ProxmoxMCP-Plus é uma camada de acesso, não um substituto para o RBAC do Proxmox, controles de rede ou prompts de aprovação MCP do lado do cliente.

O projeto dá aos operadores vários pontos de controle:

  • Tokens de API do Proxmox decidem o que o backend pode fazer.
  • PROXMOX_API_KEY protege a ponte OpenAPI por padrão.
  • MCP_API_KEY protege Streamable HTTP nativo e SSE com autenticação Bearer; é obrigatório, a menos que MCP_ALLOW_UNAUTHENTICATED_HTTP=true delegue explicitamente o controle de acesso.
  • A verificação TLS é aplicada, a menos que o modo de desenvolvimento seja explicitamente habilitado.
  • command_policy controla a execução de comandos e operações de alto risco.
  • approval_token pode controlar a execução de comandos e ações de mutação de alto risco.
  • Implantações MCP Streamable HTTP podem usar proteção contra rebinding de DNS mais listas de permissão de Host e Origin.
  • Listas de permissão ou bloqueio opcionais de ferramentas MCP reduzem a superfície de ferramentas em runtime; elas não substituem o RBAC do Proxmox.
  • Os logs são projetados para evitar expor material de comandos e credenciais.

Leia o Guia de Segurança antes de expor o servidor fora de um ambiente local confiável.

Capacidades Principais da Plataforma

ProxmoxMCP-Plus fornece uma superfície de controle unificada para as tarefas operacionais que a maioria das equipes realmente precisa no Proxmox VE. O mesmo servidor pode expor esses fluxos de trabalho a clientes MCP para casos de uso de LLM e agentes de IA, e a consumidores HTTP através da ponte OpenAPI.

Áreas de fluxo de trabalho suportadas:

Área de CapacidadeDisponibilidade
Criar / iniciar / parar / excluir VMDisponível
Criar / reverter / excluir snapshot de VMDisponível
Criar / restaurar backupDisponível
Baixar / excluir ISODisponível
Criar / iniciar / parar / excluir LXCDisponível
Execução de comandos em contêiner via SSHDisponível
Atualização de authorized_keys em contêinerDisponível
Armazenamento persistente de jobs para tarefas longasDisponível
Ferramentas de controle de jobs MCP (list_jobs, get_job, poll_job, cancel_job, retry_job)Disponível
Endpoints OpenAPI /jobs com códigos de status explícitosDisponível
OpenAPI local /livez, /readyz, /health e schemaDisponível
Docker nativo MCP Streamable HTTP em /mcpDisponível
Build de imagem Docker e /livezDisponível

Pontos de entrada de validação e contrato neste repositório:

  • pytest -q --cov=proxmox_mcp --cov-report=term-missing --cov-fail-under=75
  • ruff check .
  • mypy src --ignore-missing-imports
  • pip-audit -r requirements.txt
  • tests/integration/test_real_contract.py
  • tests/scripts/run_real_e2e.py

tests/scripts/run_real_e2e.py agora prefere proxmox-config/config.live.json ou PROXMOX_MCP_E2E_CONFIG. Isso evita executar acidentalmente verificações ao vivo contra um config.json padrão específico da máquina.

Jobs de Longa Duração

Muitas mutações do Proxmox são assíncronas. ProxmoxMCP-Plus agora envolve essas tarefas em uma camada de jobs persistente para que clientes MCP e OpenAPI possam rastreá-las através de um Job ID estável.

Ferramentas de longa duração, como criar/iniciar/parar VM, criar/iniciar/parar contêiner, mudanças de snapshot, backup/restauração e download/exclusão de ISO, agora retornam ambos:

  • task_id: o UPID bruto do Proxmox
  • job_id: o registro de job estável no lado do servidor

O registro de job armazena:

  • status atual e progresso
  • contagem de tentativas e UPIDs anteriores
  • payload de resultado mais recente ou motivo de falha
  • histórico de auditoria para ações de criar, consultar, tentar novamente e cancelar

Por padrão, o armazenamento de jobs persiste em proxmox-jobs.sqlite3, então reiniciar não perde metadados de jobs em andamento ou concluídos.

Eventos de auditoria são anexados a uma tabela SQLite separada. O histórico existente é migrado na inicialização e o formato audit_log da API permanece inalterado. A retenção é ilimitada por padrão; defina jobs.audit_retention_days para um número positivo na configuração JSON para podar eventos expirados na inicialização e quando cada job é atualizado. Isso nunca exclui o próprio job. Pare todos os workers que compartilham o banco de dados e faça backup dele antes desta atualização. Não execute versões antigas e novas contra o mesmo banco de dados; restaure o backup pré-atualização se fizer downgrade e reter o histórico de auditoria for necessário.

Uma solicitação de cancelamento não é conclusão. Consulte até que a tarefa esteja falha/cancelada antes de chamar retry_job; cancelamento pendente não pode ser tentado novamente.

Ferramentas de Job MCP

  • list_jobs
  • get_job
  • poll_job
  • cancel_job
  • retry_job

Rotas de Job OpenAPI

Quando o proxy OpenAPI está habilitado e um JobStore local está disponível, estas rotas são expostas diretamente:

CaminhoMétodoPropósitoCódigos de Sucesso
/jobsGETlistar jobs persistidos200
/jobs/{job_id}GETbuscar um job, opcional refresh=true200
/jobs/{job_id}/pollPOSTatualizar status do Proxmox200
/jobs/{job_id}/cancelPOSTsolicitar cancelamento202
/jobs/{job_id}/retryPOSTreproduzir uma receita de tentativa armazenada202

Códigos de erro comuns:

  • 404: job_id desconhecido
  • 409: o job existe, mas essa operação não é válida agora
  • 503: o proxy OpenAPI foi iniciado sem um JobStore local

tests/scripts/run_real_e2e.py agora prefere proxmox-config/config.live.json ou PROXMOX_MCP_E2E_CONFIG. Isso evita executar acidentalmente verificações ao vivo contra um config.json padrão específico da máquina.

Posicionamento Contra Abordagens Comuns

CapacidadeAPI Oficial do ProxmoxScripts avulsosProxmoxMCP-Plus
MCP para fluxos de trabalho de LLM e agentes de IANãoNãoSim
Superfície OpenAPI para ferramentas HTTP padrãoNãoGeralmente nãoSim
Operações de VM e LXC em uma interfaceSomente baixo nívelDependeSim
Fluxos de trabalho de snapshot, backup e restauraçãoSomente baixo nívelDependeSim
Rastreamento e tentativa de jobs assíncronos persistentesNãoRaroSim
Execução de comandos em contêiner com controles de políticaNãoSomente personalizadoSim
Caminho de distribuição DockerNãoRaroSim
Verificação de ambiente ao vivo em nível de repositórioN/ARaroSim

Modelos de Cenário

Exemplos prontos para copiar estão em docs/examples/:

Estes são escritos tanto para operadores humanos quanto para uso orientado por LLM.

Documentação

O README é intencionalmente otimizado para compreensão rápida no GitHub. Documentação operacional mais longa vive em docs/wiki/ e também pode ser publicada no Wiki do GitHub.

Se você precisar...Comece aqui
Entender o projeto e o fluxo de implantaçãoPágina Inicial do Wiki
Configurar e executar contra um ambiente ProxmoxGuia do Operador
Conectar Claude Desktop, Cursor, VS Code, Codex, Open WebUI ou clientes HTTPGuia de Configuração do Cliente
Escolher a ferramenta certa para um fluxo de trabalhoGuia de Seleção de Ferramentas
Revisar metas de qualidade de docs, plano de mídia e checklist de publicaçãoPlano de Qualidade de Documentação
Revisar padrões de integração e detalhes de transporteGuia de Integrações
Instalar a partir de IDEs e agentes com suporte a MCPInstalação de Agente
Habilitar execução de comandos LXC via SSHExecução de Comandos em Contêiner
Revisar segurança e política de comandosGuia de Segurança
Inspecionar parâmetros, pré-requisitos e comportamento de ferramentasReferência de API e Ferramentas
Depurar problemas de inicialização, autenticação ou saúdeSolução de Problemas
Trabalhar no código-fonte ou lançá-loGuia do Desenvolvedor
Revisar notas de lançamento e atualizaçãoNotas de Lançamento e Atualização

Wiki publicado:

Layout do Repositório

  • src/proxmox_mcp/: servidor MCP, carregamento de configuração, segurança, ponte OpenAPI
  • main.py: ponto de entrada MCP para uso local e orientado a cliente
  • docker-compose.yml: runtime HTTP/OpenAPI
  • requirements/: fontes auxiliares de dependências e listas de instalação em runtime
  • scripts/: scripts de inicialização auxiliares para fluxos de trabalho locais
  • tests/scripts/run_real_e2e.py: caminho Proxmox e Docker/OpenAPI ao vivo
  • tests/: cobertura de testes unitários e de integração
  • docs/examples/: prompts orientados a cenários e exemplos HTTP
  • docs/wiki/: documentação de operador, integração e referência em formato mais longo

Verificações de Desenvolvimento

pytest -q --cov=proxmox_mcp --cov-report=term-missing --cov-fail-under=75
ruff check .
mypy src --ignore-missing-imports
pip-audit -r requirements.txt
python -m build

Paramiko 5.0.0 ou mais recente é necessário para que pip-audit possa ser executado sem uma exceção CVE-2026-44405.

Licença

MIT

Instalação de ISO e configuração de rede LXC

Use list_isos para encontrar um volume ISO existente (ou download_iso para obter um). create_vm aceita iso_volume="local:iso/debian.iso", monta-o em ide3 por padrão e inicializa o CD-ROM antes do disco. update_vm_config pode montar ou alterar essa ISO, ejetar com iso_volume="none", definir boot_order="scsi0;ide3" ou alterar network_bridge em net0 mantendo as configurações de MAC/VLAN/firewall. Escolha um cdrom_device livre; discos de dados existentes e unidades cloud-init nunca são substituídos. Edições de mídia e bridge leem a configuração atual e, portanto, precisam de VM.Audit bem como dos privilégios de configuração relevantes. Atualizações existentes apenas de dimensionamento/cloud-init ainda não exigem uma leitura preliminar.

LXC usa modelos de SO, não ISOs de instalador. create_container mantém DHCP por padrão e agora aceita network_bridge, ip="192.168.1.50/24", gw="192.168.1.1", ip6 e gw6. update_container_network edita esses campos em uma interface existente (padrão net0, selecionável por meio de net31) e preserva todas as opções não especificadas. Use uma string de gateway vazia para removê-lo; alterar para DHCP/manual remove o gateway antigo para aquela família de endereços. Alterações de rede podem interromper a conectividade do convidado. Ambas as ferramentas de edição seguem políticas de aprovação de alvo nomeado, somente leitura e alto risco. Adicione update_container_network às listas personalizadas de alto risco e às allowlists de ferramentas desejadas. Consulte as notas de versão v0.5.19 para detalhes de atualização.