容器管理服务器

Podman MCP Server 是一个通过 Model Context Protocol (MCP) 提供容器管理功能的服务器,支持容器生命周期管理、日志查看、资源监控等功能,适用于容器编排、监控调试和多服务器管理等场景。

  • by kunwarmahen
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 kunwarmahen/podman-mcp-server

使用说明

Podman MCP 服务器

通过模型上下文协议实现容器管理的便捷访问。

概述

Podman MCP服务器通过MCP(管理通信协议)暴露容器管理功能,使AI工具和应用程序能够:

  • 列出并检查正在运行的容器
  • 启动、停止和重启容器
  • 在容器内执行命令
  • 查看容器日志
  • 管理容器镜像
  • 监控容器资源使用情况

设计用于与MCP发现中心无缝集成,实现自动网络发现。

特点/功能

容器管理

  • 列出容器查看所有正在运行或已停止的容器
  • 集装箱信息检查详细的集装箱信息
  • 启动/停止/重启控制容器生命周期
  • 执行命令在容器内运行命令
  • 查看日志访问容器日志,可配置行数
  • 资源统计监控CPU、内存和I/O使用情况

形象管理

  • 列出图片查看所有可用的容器镜像
  • 拉取镜像从注册表中下载图像

网络发现

  • 自动广播通过组播在网络中宣告自身存在
  • 零配置无需手动注册
  • 多交通方式支持与HTTP和streamable-http兼容

安装

先决条件

  • Python 3.10及以上版本
  • Podman 已安装并正在运行
  • uv 包管理器(或 pip)

设置

# Clone or navigate to project
cd podman-mcp-server

# Install dependencies
uv sync

# Or with pip:
pip install -r requirements.txt

配置

环境变量

# Transport mode
MCP_TRANSPORT=http                    # http, streamable-http, or stdio (default)

# Server settings
MCP_HOST=0.0.0.0                     # Binding host
MCP_PORT=3001                         # Server port
MCP_SERVER_NAME=Podman MCP Server    # Display name

# Broadcasting (for MCP Discovery Hub)
MCP_ENABLE_BROADCAST=true            # Enable/disable broadcasting
MCP_BROADCAST_INTERVAL=30            # Seconds between announcements

.env 文件

创建一个 .env 项目根目录下的文件:

MCP_TRANSPORT=http
MCP_PORT=3001
MCP_SERVER_NAME=Podman MCP Server
MCP_ENABLE_BROADCAST=true
MCP_BROADCAST_INTERVAL=30

使用

以HTTP模式启动(带广播)

# Using environment variables
MCP_TRANSPORT=http MCP_PORT=3001 uv run main.py

# Or with .env file
uv run main.py

以Streamable-HTTP模式启动

MCP_TRANSPORT=streamable-http MCP_PORT=3001 uv run main.py

以标准控制台模式启动(适用于Claude)

# Default mode, works with Claude Desktop
uv run main.py

可用工具

集装箱

列出容器

list_containers(all: bool = False)

列出正在运行的容器(或全部如果 all=true)

示例:

{
  "method": "tools/call",
  "params": {
    "name": "list_containers",
    "arguments": { "all": true }
  }
}

集装箱信息

container_info(container: str)

获取特定容器的详细信息

启动容器

start_container(container: str)

启动已停止的容器

停止集装箱(操作/流程)

stop_container(container: str, timeout: int = 10)

优雅地停止正在运行的容器(设置秒级超时)

重启容器

restart_container(container: str)

重启一个容器

容器日志

container_logs(container: str, tail: int = 100)

从容器中获取日志(最后N行)

运行容器

run_container(
  image: str,
  name: str = None,
  detach: bool = True,
  ports: List[str] = [],
  env: List[str] = [],
  volumes: List[str] = []
)

运行一个新的容器

示例:

{
  "method": "tools/call",
  "params": {
    "name": "run_container",
    "arguments": {
      "image": "nginx:latest",
      "name": "my-webserver",
      "ports": ["8080:80"],
      "detach": true
    }
  }
}

移除容器

remove_container(container: str, force: bool = False)

移除一个容器(如果正在运行则强制移除)

在容器中执行

exec_container(container: str, command: List[str])

在容器内执行命令

集装箱统计

container_stats(container: str = None, no_stream: bool = True)

获取容器的资源使用统计信息

图片

列出图片

list_images(all: bool = False)

列出可用的容器镜像

拉取镜像

pull_image(image: str)

从注册表中拉取/下载镜像

与MCP发现中心的集成

自动发现

当广播功能启用时,此服务器会自动向MCP发现中心注册:

  1. 服务器广播每30秒,它会在(某处)宣告自己的存在 239.255.255.250:5353
  2. Hub 发现发现中心收到公告并探测服务器
  3. 已注册的工具所有12个容器管理工具已全网可用

手动注册

如果在不广播的情况下运行:

# Scan for the server manually
curl -X POST http://localhost:8000/scan \
  -H "Content-Type: application/json" \
  -d '{"ports": [3001]}'

API 端点(在 HTTP 模式下)

GET /

服务器信息端点

curl http://localhost:3001/

回答:

{
  "name": "Podman MCP Server",
  "version": "1.0.0",
  "protocol": "MCP Streamable HTTP",
  "endpoint": "/mcp"
}

POST /mcp(翻译为中文可保持原样,因为这是一个网络请求路径,直接翻译无实际意义,但可解释为:“发送POST请求至/mcp路径”)

MCP协议端点

所有MCP通信都在这里进行(初始化、工具/列表、工具/调用)

用例

1. 容器编排

使用AI工具来管理容器化应用:

"User: Start a new web server and configure it"
AI: I'll start an nginx container for you...
→ calls run_container(image="nginx", name="webserver", ports=["8080:80"])

2. 监控与调试

检查容器状态和日志:

"User: What's the status of my database container?"
AI: Let me check the logs and stats...
→ calls container_logs(container="postgres", tail=50)
→ calls container_stats(container="postgres")

3. 多服务器管理

在多个主机上部署和管理容器:

Host 1: Podman MCP Server (port 3001)
Host 2: Podman MCP Server (port 3001)
Host 3: MCP Discovery Hub (port 8000)
        ↓
        All containers managed from single AI interface

4. 开发工作流程

快速搭建开发环境:

"User: Set up a development database for testing"
AI: I'll create a PostgreSQL container for you...
→ calls run_container(
    image="postgres:15",
    name="dev-db",
    env=["POSTGRES_PASSWORD=devpass"]
  )

日志

服务器日志被写入 podman_mcp.log:

# View logs
tail -f podman_mcp.log

# Check for errors
grep ERROR podman_mcp.log

故障排除

端口已被占用

# Use a different port
MCP_PORT=3002 uv run main.py

广播功能无法正常工作

检查多播连接性:

# Verify multicast is enabled
ip route show

# Check firewall
sudo firewall-cmd --add-service=mdns --permanent

Podman 连接错误

确保 Podman 正在运行:

# Start Podman service
systemctl start podman

# Verify connection
podman ps

性能考量

  • 集装箱操作大多数操作在100-500毫秒内完成
  • 日志检索取决于日志大小和网络速度
  • 广播开销最小值(每30秒发送一个30字节的UDP数据包)
  • 连接池为提高效率,已配置为池大小=5

安全

最佳实践

  1. 在隔离网络中运行在受信任的网络环境中部署
  2. 使用防火墙规则限制对MCP端口的访问
  3. 在不可信网络中禁用广播设定 MCP_ENABLE_BROADCAST=false
  4. 监控日志定期检查未经授权的访问尝试

局限性

  • 没有内置的身份验证(依赖于网络安全)
  • 没有资源配额限制(AI 可以运行无限数量的容器)
  • 命令以与 Podman 守护进程相同的权限运行

考虑为生产环境添加一个带认证的反向代理。

要求

  • Python 3.10+
  • FastAPI
  • SQLAlchemy
  • FastMCP
  • python-dotenv

贡献;做出贡献

欢迎提出改进意见!需要改进的方面:

  • 容器网络配置
  • 形象塑造与推广
  • 卷管理
  • 集装箱健康监测
  • 网络性能指标

许可证

MIT 许可证 - 详见 LICENSE 文件

支持

  • 问题:在GitHub上报告
  • 文档:请参阅MCP发现中心的维基页面
  • 示例:请查看examples/目录