Back to Browse

Openstack MCP Server

Developer ToolsModerate7.0MCP RegistryLocal
Free

Server data from the Official MCP Registry

Read-only-first OpenStack inspection: servers, images, volumes, networks, Keystone catalog.

About

Read-only-first OpenStack inspection: servers, images, volumes, networks, Keystone catalog.

Security Report

7.0
Moderate7.0Low Risk

Valid MCP server (1 strong, 2 medium validity signals). 5 known CVEs in dependencies (0 critical, 1 high severity) Imported from the Official MCP Registry.

11 files analyzed · 5 issues found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

env_vars

Check that this permission is expected for this type of plugin.

What You'll Need

Set these up before or after installing:

Keystone v3 endpoint, for example https://keystone.example.com:5000/v3Optional

Environment variable: OS_AUTH_URL

User name; omit when using an application credentialOptional

Environment variable: OS_USERNAME

Password for OS_USERNAMERequired

Environment variable: OS_PASSWORD

Domain of OS_USERNAMEOptional

Environment variable: OS_USER_DOMAIN_NAME

Project to scope the token toOptional

Environment variable: OS_PROJECT_ID

Application credential ID, instead of a user name and passwordOptional

Environment variable: OS_APPLICATION_CREDENTIAL_ID

Application credential secretRequired

Environment variable: OS_APPLICATION_CREDENTIAL_SECRET

Region nameOptional

Environment variable: OS_REGION_NAME

Comma-separated project IDs the server may use; the first is the defaultOptional

Environment variable: OPENSTACK_MCP_PROJECT_IDS

CA bundle as PEM text, for a private CAOptional

Environment variable: OPENSTACK_MCP_CACERT_PEM

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "io-github-oomchiller-openstack-mcp-server": {
      "env": {
        "OS_AUTH_URL": "your-os-auth-url-here",
        "OS_PASSWORD": "your-os-password-here",
        "OS_USERNAME": "your-os-username-here",
        "OS_PROJECT_ID": "your-os-project-id-here",
        "OS_REGION_NAME": "your-os-region-name-here",
        "OS_USER_DOMAIN_NAME": "your-os-user-domain-name-here",
        "OPENSTACK_MCP_CACERT_PEM": "your-openstack-mcp-cacert-pem-here",
        "OPENSTACK_MCP_PROJECT_IDS": "your-openstack-mcp-project-ids-here",
        "OS_APPLICATION_CREDENTIAL_ID": "your-os-application-credential-id-here",
        "OS_APPLICATION_CREDENTIAL_SECRET": "your-os-application-credential-secret-here"
      },
      "args": [
        "openstack-mcp-server"
      ],
      "command": "uvx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

openstack-mcp-server

CI Release License

Community project, not affiliated with OpenStack/OpenInfra Foundation.

A Model Context Protocol server that lets AI assistants inspect OpenStack clouds. It is read-only by default, bounded in what it returns, and configured entirely through OpenStack's own settings and environment variables, so it runs unchanged as a local process or a container.

flowchart LR
    AI[MCP client] <-->|stdio / Streamable HTTP| Server[openstack-mcp-server]
    Server <-->|openstacksdk| Cloud[OpenStack APIs]

Features

  • 32 read tools for compute, images, block storage, networking, the Keystone catalog and service inventory, plus get_scope.
  • Write tools are not registered unless explicitly enabled by two settings.
  • Project allowlist: each allowed project gets its own project-scoped session.
  • Every list has limit, complete and next_marker; results are typed (outputSchema, structuredContent) and capped in size.
  • Errors are isError results with a category and an action, without SDK messages, URLs or tokens.
  • stdio by default; Streamable HTTP on loopback as an option.
  • Container image without credentials, running as an unprivileged user.

The read-only mode is a convenience. The security boundary is the Keystone role of the identity you configure; see SECURITY.md.

Quick start

The server is listed in the MCP Registry as io.github.oomchiller/openstack-mcp-server; registry-aware clients can install it from there. Manual setup:

Container (Docker MCP Toolkit or any MCP client)

docker run --rm -i \
  -e OS_AUTH_URL=https://keystone.example.com:5000/v3 \
  -e OS_USERNAME=mcp-reader -e OS_PASSWORD \
  -e OS_USER_DOMAIN_NAME=Default -e OS_PROJECT_ID=0123456789abcdef0123456789abcdef \
  -e OS_REGION_NAME=RegionOne \
  ghcr.io/oomchiller/openstack-mcp-server@sha256:<digest>

Pin the image by digest; release digests are listed on the releases page. For a private CA, pass the certificate text in OPENSTACK_MCP_CACERT_PEM.

Local process with clouds.yaml

{
  "mcpServers": {
    "openstack": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/oomchiller/openstack-mcp-server@v0.1.2", "openstack-mcp-server"],
      "env": { "OS_CLOUD": "mycloud" }
    }
  }
}

clouds.yaml is found the usual way (OS_CLIENT_CONFIG_FILE, ./clouds.yaml, ~/.config/openstack/clouds.yaml, /etc/openstack/).

Configuration

Credentials come from openstacksdk: OS_CLOUD with clouds.yaml, or OS_* variables (password or application credentials). Server behaviour:

VariableDefaultMeaning
OPENSTACK_MCP_MODEreadonlyreadonly or admin.
OPENSTACK_MCP_ENABLE_WRITE_TOOLSfalseWith admin, registers write tools.
OPENSTACK_MCP_PROJECT_IDSemptyComma-separated project IDs the server may use; the first is the default.
OPENSTACK_MCP_DEFAULT_LIMIT50Items per list call when limit is omitted.
OPENSTACK_MCP_MAX_LIMIT100Largest accepted limit (up to 1000).
OPENSTACK_MCP_MAX_RESPONSE_BYTES524288Largest result; larger ones fail with response_too_large.
OPENSTACK_MCP_API_TIMEOUT10Seconds per OpenStack request; no retries.
OPENSTACK_MCP_CACERT_PEMunsetCA bundle as PEM text; takes precedence over OS_CACERT.
OPENSTACK_MCP_ALLOW_INSECUREfalseAllow verify: false or an http:// auth URL.
OPENSTACK_MCP_ENABLE_PROMPTStrueRegister the prompt.
OPENSTACK_MCP_ENABLE_RESOURCEStrueRegister openstack://scope.
OPENSTACK_MCP_TRANSPORTstdiostdio or streamable-http.
OPENSTACK_MCP_HTTP_HOST / _PORT127.0.0.1 / 8000HTTP bind; path /mcp.
OPENSTACK_MCP_HTTP_ALLOW_REMOTEfalseAllow a non-loopback HTTP bind. The HTTP transport has no authentication.
OPENSTACK_MCP_LOG_LEVELWARNINGstderr log level. SDK loggers stay at CRITICAL.

An invalid OPENSTACK_MCP_* value stops the server with exit code 2 and names the variable. Missing credentials do not: the server starts, and cloud tools return [not_configured].

Gateways that run several instances of this server and do not prefix prompt names or resource URIs (Docker MCP Gateway) should set OPENSTACK_MCP_ENABLE_PROMPTS=false and OPENSTACK_MCP_ENABLE_RESOURCES=false.

Tools

GroupTools
Scopeget_scope
Computelist_servers, get_server, list_flavors
Imagelist_images, get_image
Block storagelist_volumes, get_volume, list_volume_attachments, get_volume_attachment
Networklist_networks, get_network, list_subnets, get_subnet, list_ports, get_port, list_floating_ips, list_routers, get_router, list_router_interfaces, list_security_groups, get_security_group
Identitylist_regions, list_domains, list_projects, list_services, list_endpoints
Service inventorylist_hypervisors, list_compute_services, list_aggregates, list_network_agents, list_volume_services

Identity and service inventory usually need more than a project reader role; such calls fail with [forbidden] rather than returning empty lists.

With OPENSTACK_MCP_MODE=admin and OPENSTACK_MCP_ENABLE_WRITE_TOOLS=true, 31 experimental write tools are added (servers, volumes, images, networks, subnets, ports, floating IPs, routers, security groups). See docs/SPEC.md for the full behaviour.

Development

uv sync --locked
uv run pytest --cov
uv run ruff check . && uv run ruff format --check .
uv run mypy src tests

See CONTRIBUTING.md, ARCHITECTURE.md and DECISIONS.md.

License

Apache License 2.0; see LICENSE. Parts of the code started in openstack-kr/python-openstackmcp-server; see NOTICE.

Reviews

No reviews yet

Be the first to review this server!