openstack-mcp
openstack-mcp
An MCP server that lets an AI assistant inspect and operate an OpenStack cloud — list instances, check quotas, read a stuck VM's console log, and (if you allow it) create and delete servers.
Works with any OpenStack deployment: CloudPe, OVHcloud, Infomaniak, university and research clouds, or a local DevStack. Anything openstacksdk can reach, this can drive.
Read-only by default. Writes require an explicit opt-in, and deletes require a second one. An assistant that can list your project cannot tear it down unless you decided it should be able to.
Quick start
Install from source (not yet on PyPI):
pipx install git+https://github.com/abhishekambad-leapswitch/openstack-mcpPoint it at a cloud. openstacksdk reads standard OpenStack config, so either a 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...or the usual environment variables (OS_AUTH_URL, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET). This server never stores or transmits your credentials itself — it hands off to openstacksdk, which resolves them the same way the openstack CLI does.
Claude Code
claude mcp add openstack --env OS_CLOUD=cloudpe -- openstack-mcpClaude Desktop / Cursor / any MCP client
{
"mcpServers": {
"openstack": {
"command": "openstack-mcp",
"env": { "OS_CLOUD": "cloudpe" }
}
}
}Then ask things like "which VMs are down?", "do I have quota for three more m1.large?", or "web-03 won't accept SSH — check its console log."
To confirm what you've wired up before trusting it, run a dry check — it prints the resolved config and exactly which tools are exposed, without serving or connecting:
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_volumesThe safety model
Most cloud MCP servers hand an assistant the full API and hope for the best. This one is gated, because "delete the test VMs" is a sentence a model can misread.
Environment variable | Effect |
(nothing set) | Read-only. 12 inspection tools. Write tools are not registered at all — the model cannot see or call them. |
| Adds |
| Adds |
| Caps how many items any list tool returns. |
| Which |
Two further guardrails:
delete_serverdemands confirmation. You must passconfirm_namematching the resolved instance's exact name. Ask it to deleteweb-1when the VM is calledweb-01and it refuses rather than guessing.Tools carry MCP annotations (
read_only_hint,destructive_hint), so clients that surface risk to the user before running a tool can do so correctly.
Tool gating is enforced at registration, not by asking the model nicely — verified over a real stdio session in the test suite.
Tools
Read (always available)
Tool | Purpose |
| Which cloud, region, and project you're pointed at, and which operations are enabled |
| Instances with status and IPs; filter by status or name substring |
| Full detail for one instance: flavor, image, key pair, security groups, addresses |
| Instance sizes with vCPU, RAM, disk |
| Bootable images |
| Networks, flagging which are external |
| Security groups and rule counts |
| Registered SSH key pairs |
| Block storage volumes and what they're attached to |
| Compute quota usage vs limits |
| Whether N instances of a flavor fit in remaining quota, and what blocks it if not |
| Serial console log — for VMs that boot but are unreachable |
Write (opt-in)
Tool | Purpose |
| Create one or many instances; |
| start / stop / reboot |
| Delete one instance, with name confirmation (needs |
Two design choices worth knowing
Responses are deliberately small. openstacksdk returns 60+ attributes per server. Feeding all of that to a model is slow, expensive, and buries the useful fields, so every tool returns a trimmed projection — for a server that's id, name, status, and a flattened {network: [ips]} map instead of nova's nested address structure.
check_capacity exists so batches fail early. Asking for eight VMs and discovering the quota ceiling on the fifth leaves a half-built mess. This reports which of instances/vCPUs/RAM binds first, before anything is created. create_servers also reports partial failures per instance rather than throwing away what succeeded.
Development
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 .The suite runs entirely offline against a fake openstacksdk connection — no cloud, no credentials, no charges. It covers the tool gating, the trimming, quota arithmetic, partial-failure reporting, and the delete confirmation.
Provisioning at scale
For standing up fleets declaratively rather than conversationally, see cloudpe-terraform-bulk-vm — Terraform for bulk VM creation on the same API.
License
MIT