使用说明
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发现中心注册:
- 服务器广播每30秒,它会在(某处)宣告自己的存在
239.255.255.250:5353 - Hub 发现发现中心收到公告并探测服务器
- 已注册的工具所有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
安全
最佳实践
- 在隔离网络中运行在受信任的网络环境中部署
- 使用防火墙规则限制对MCP端口的访问
- 在不可信网络中禁用广播设定
MCP_ENABLE_BROADCAST=false - 监控日志定期检查未经授权的访问尝试
局限性
- 没有内置的身份验证(依赖于网络安全)
- 没有资源配额限制(AI 可以运行无限数量的容器)
- 命令以与 Podman 守护进程相同的权限运行
考虑为生产环境添加一个带认证的反向代理。
要求
- Python 3.10+
- FastAPI
- SQLAlchemy
- FastMCP
- python-dotenv
贡献;做出贡献
欢迎提出改进意见!需要改进的方面:
- 容器网络配置
- 形象塑造与推广
- 卷管理
- 集装箱健康监测
- 网络性能指标
许可证
MIT 许可证 - 详见 LICENSE 文件
支持
- 问题:在GitHub上报告
- 文档:请参阅MCP发现中心的维基页面
- 示例:请查看examples/目录
