Docker MCP server

Gerencie contêineres, volumes e serviços Docker usando comandos em linguagem natural.

Documentação

🐋 Docker MCP server

Um servidor MCP para gerenciar Docker com linguagem natural!

🪩 O que ele pode fazer?

  • 🚀 Compor contêineres com linguagem natural
  • 🔍 Inspecionar e depurar contêineres em execução
  • 📀 Gerenciar dados persistentes com volumes Docker

❓ Para quem é isso?

  • Administradores de servidores: conecte-se a mecanismos Docker remotos, por exemplo, para gerenciar um site voltado ao público.
  • Entusiastas: execute contêineres localmente e experimente aplicativos de código aberto que suportam Docker.
  • Entusiastas de IA: ultrapasse os limites do que um LLM é capaz de fazer!

Demonstração

Uma demonstração rápida mostrando uma implantação do WordPress usando linguagem natural:

https://github.com/user-attachments/assets/65e35e67-bce0-4449-af7e-9f4dd773b4b3

🏎️ Início rápido

Instalação

Claude Desktop

No MacOS: ~/Library/Application\ Support/Claude/claude_desktop_config.json

No Windows: %APPDATA%/Claude/claude_desktop_config.json

Instale do PyPi com uv

Se você não tiver o uv instalado, siga as instruções de instalação para o seu sistema: link

Em seguida, adicione o seguinte ao seu arquivo de servidores MCP:

"mcpServers": {
  "mcp-server-docker": {
    "command": "uvx",
    "args": [
      "mcp-server-docker"
    ]
  }
}
Instale com Docker

Puramente por conveniência, o servidor pode ser executado em um contêiner Docker.

Após clonar este repositório, crie a imagem Docker:

docker build -t mcp-server-docker .

E então adicione o seguinte ao seu arquivo de servidores MCP:

"mcpServers": {
  "mcp-server-docker": {
    "command": "docker",
    "args": [
      "run",
      "-i",
      "--rm",
      "-v",
      "/var/run/docker.sock:/var/run/docker.sock",
      "mcp-server-docker:latest"
    ]
  }
}

Observe que montamos o socket Docker como um volume; isso garante que o servidor MCP possa se conectar e controlar o daemon Docker local.

📝 Prompts

🎻 docker_compose

Use linguagem natural para compor contêineres. Veja acima uma demonstração.

Forneça um Nome de Projeto e uma descrição dos contêineres desejados, e deixe o LLM fazer o resto.

Este prompt instrui o LLM a entrar em um loop de plan+apply. Sua interação com o LLM envolverá as seguintes etapas:

  1. Você dá instruções ao LLM sobre quais contêineres subir
  2. O LLM calcula um plano conciso em linguagem natural e o apresenta a você
  3. Você então:
    • Aplica o plano
    • Fornece feedback ao LLM, e o LLM recalcula o plano

Exemplos

  • nome: nginx, contêineres: "implantar um contêiner nginx expondo-o na porta 9000"
  • nome: wordpress, contêineres: "implantar um contêiner WordPress e um contêiner MySQL de suporte, expondo o WordPress na porta 9000"

Retomando um Projeto

Ao iniciar um novo chat com este prompt, o LLM receberá o status de quaisquer contêineres, volumes e redes criados com o projeto name fornecido.

Isso é útil principalmente para limpeza, caso você perca um chat que era responsável por muitos contêineres.

📔 Recursos

O servidor expõe modelos de recursos em vez de enumerar contêineres atualmente em execução:

  • docker://containers/{container_id}/logs (text/plain)
  • docker://containers/{container_id}/stats (application/json)

Leia qualquer URI com um ID ou nome de contêiner Docker.

🔨 Ferramentas

Contêineres

  • list_containers
  • create_container
  • run_container
  • recreate_container
  • start_container
  • fetch_container_logs
  • stop_container
  • remove_container

Imagens

  • list_images
  • pull_image
  • push_image
  • build_image
  • remove_image

Redes

  • list_networks
  • create_network
  • remove_network

Volumes

  • list_volumes
  • create_volume
  • remove_volume

🚧 Avisos

Dados Sensíveis

NÃO CONFIGURE CONTÊINERES COM DADOS SENSÍVEIS. Isso inclui chaves de API, senhas de banco de dados, etc.

Qualquer dado sensível trocado com o LLM é inerentemente comprometido, a menos que o LLM esteja sendo executado na sua máquina local.

Se você tiver interesse em passar segredos com segurança para contêineres, abra uma issue neste repositório com seu caso de uso.

Revisando Contêineres Criados

Tenha cuidado ao revisar os contêineres que o LLM cria. O Docker não é um sandbox seguro e, portanto, o servidor MCP pode potencialmente impactar a máquina host através do Docker.

Por razões de segurança, este servidor MCP não suporta opções sensíveis do Docker como --privileged ou --cap-add/--cap-drop. Se esses recursos forem do seu interesse, abra uma issue neste repositório com seu caso de uso.

🛠️ Configuração

Este servidor usa o método from_env do SDK Python do Docker. Para detalhes de configuração, consulte a documentação.

Conectar ao Docker via SSH

Este servidor MCP pode se conectar a um daemon Docker remoto via SSH.

Basta definir uma URL de host ssh:// na definição do servidor MCP:

"mcpServers": {
  "mcp-server-docker": {
    "command": "uvx",
    "args": [
      "mcp-server-docker"
    ],
    "env": {
      "DOCKER_HOST": "ssh://myusername@myhost.example.com"
    }
  }
}

💻 Desenvolvimento

Prefira usar o Devbox para configurar seu ambiente de desenvolvimento. O servidor usa a API de alto nível MCPServer do MCP Python SDK v2 e pode ser inspecionado diretamente:

uv sync --all-groups
uv run mcp dev src/mcp_server_docker/server.py:app
# or: npx @modelcontextprotocol/inspector uv run mcp-server-docker

Execute a suíte de testes e lint hermética sem um daemon Docker:

uv run pytest
uv run ruff format --check src tests
uv run ruff check src tests

Consulte o devbox.json para comandos úteis de desenvolvimento.

Após configurar o devbox, você pode configurar seu arquivo MCP do Claude para usá-lo:

  "docker": {
    "command": "/path/to/repo/.devbox/nix/profile/default/bin/uv",
    "args": [
      "--directory",
      "/path/to/repo/",
      "run",
      "mcp-server-docker"
    ]
  },