openstack-mcp
openstack-mcp
一个基于 MCP 的服务器,让 AI 助手能够检查和操作 OpenStack 云环境 — 列出实例、检查配额、读取卡住虚拟机的控制台日志,以及(如果你允许的话)创建和删除服务器。
适用于任何 OpenStack 部署:CloudPe、OVHcloud、Infomaniak、高校和研究云,或本地 DevStack。只要 openstacksdk 能访问到的,它都能驱动。
**默认只读。**写入需要显式开启,删除还需要另行开启一次。一个能列出你项目的助手无法把它拆除,除非你决定让它有这个能力。
快速开始
从源码安装(尚未发布到 PyPI):
pipx install git+https://github.com/abhishekambad-leapswitch/openstack-mcp把它指向一个云环境。openstacksdk 读取标准的 OpenStack 配置,因此可以使用 clouds.yaml:
# ~/.config/openstack/clouds.yaml
clouds:
cloudpe:
auth_type: v3applicationcredential
auth:
auth_url: https://<your-region>.cloudpe.com:5000/v3
application_credential_id: <id>
application_credential_secret: <secret>
region_name: RegionOne...或常见的环境变量(OS_AUTH_URL、OS_APPLICATION_CREDENTIAL_ID、OS_APPLICATION_CREDENTIAL_SECRET)。此服务器本身从不存储或传输你的凭据 — 它会把凭据交给 openstacksdk,由后者以与 openstack CLI 相同的方式解析。
Claude Code
claude mcp add openstack --env OS_CLOUD=cloudpe -- openstack-mcpClaude Desktop / Cursor / 任何 MCP 客户端
{
"mcpServers": {
"openstack": {
"command": "openstack-mcp",
"env": { "OS_CLOUD": "cloudpe" }
}
}
}然后可以问诸如此类的问题:“哪些虚拟机宕机了?”、“我还能不能配额三个 m1.large?”,或 “web-03 不接受 SSH — 检查一下它的控制台日志。”
在信任它之前,为了确认你所配置的内容,可以运行一次干检查 — 它会打印解析后的配置以及具体暴露了哪些工具,而不启动服务或建立连接:
openstack-mcp --checkopenstack-mcp 0.1.0
cloud: cloudpe
mode: read-only
max items per list: 50
12 tools: check_capacity, cloud_info, get_console_output, get_quotas, get_server,
list_flavors, list_images, list_keypairs, list_networks, list_security_groups,
list_servers, list_volumes安全模型
大多数云 MCP 服务器会把完整 API 交给助手,然后听天由命。这个则设有门禁,因为“删除测试虚拟机”这句话,模型可能会误读。
环境变量 | 效果 |
(未设置) | **只读。**12 个检查工具。写入工具根本不会被注册 — 模型无法看到或调用它们。 |
| 添加 |
| 添加 |
| 限制任何列表工具返回的条目数量。 |
| 使用哪个 |
另外两道护栏:
**
delete_server需要确认。**你必须传入与解析出的实例确切名称匹配的confirm_name。如果虚拟机实际叫web-01,让它删除web-1,它会拒绝而不是去猜。工具带有 MCP 注解(
read_only_hint、destructive_hint),这样在运行工具前向用户提示风险的客户端就能正确地做到这一点。
工具门禁在注册时强制执行,而不是靠好言相求模型 — 这一点已通过测试套件中真实的 stdio 会话得到验证。
工具
读取(始终可用)
工具 | 用途 |
| 你当前指向的云、区域和项目,以及哪些操作已启用 |
| 实例及其状态和 IP;可按状态或名称子串过滤 |
| 单个实例的完整详情:规格、镜像、密钥对、安全组、地址 |
| 实例规格,含 vCPU、内存、磁盘 |
| 可引导镜像 |
| 网络,并标出哪些是外部网络 |
| 安全组及规则数量 |
| 已注册的 SSH 密钥对 |
| 块存储卷及其挂载目标 |
| 计算配额用量与限额对比 |
| 某种规格的 N 个实例是否能放进剩余配额,若不能,是什么在阻碍 |
| 串行控制台日志 — 适用于已启动但无法访问的虚拟机 |
写入(可选开启)
工具 | 用途 |
| 创建一个或多个实例; |
| 启动 / 停止 / 重启 |
| 删除一个实例,需要名称确认 (需要 |
两个值得了解的设计选择
响应刻意保持精简。openstacksdk 对每台服务器返回 60 多个属性。把所有这些都喂给模型既慢又贵,还会埋没有用的字段,因此每个工具返回的都是裁剪后的投影 — 对服务器而言就是 id、名称、状态,以及扁平的 {network: [ips]} 映射,而不是 nova 那种嵌套的地址结构。
**check_capacity 的存在是为了让批量操作尽早失败。**要八台虚拟机,却在第五台时才撞上配额上限,会留下一堆建了一半的烂摊子。它会在创建任何东西之前,报告实例数/vCPU/内存哪一项最先触顶。create_servers 也会按实例报告部分失败,而不是把已成功的部分一并丢弃。
开发
git clone https://github.com/abhishekambad-leapswitch/openstack-mcp
cd openstack-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest && ruff check .测试套件完全离线运行,面向一个假的 openstacksdk 连接 — 不需要云、不需要凭据、不产生任何费用。它覆盖了工具门禁、字段裁剪、配额计算、部分失败报告和删除确认。
规模化部署
如果要以声明式而非对话式的方式批量创建虚拟机集群,请参阅 cloudpe-terraform-bulk-vm — 基于同一 API 使用 Terraform 进行批量 VM 部署。
许可证
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
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
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/abhishekambad-leapswitch/openstack-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server