mcpField
O
OpenStack

OpenStack

Local
github.comCloud & Infra0Updated 1w ago

About OpenStack

OpenStack is an MCP server for inspecting OpenStack clouds, read-only by default with bounded results. It uses OpenStack’s own configuration through openstacksdk and runs as either a local process or a container.

Key features

  1. 01Inspect compute, images, and block storage
  2. 02View networks and Keystone catalog
  3. 03Read-only by default; writes require explicit enablement
  4. 04Create project-scoped sessions
  5. 05Paginate and cap response size
  6. 06Structured results and categorized errors

Use cases

  1. 01Inventory cloud servers and images
  2. 02Inspect volumes, networks, and security groups
  3. 03Query projects and service catalogs
  4. 04Limit cloud inspection by project

MCP support

It exposes read tools for OpenStack compute, images, block storage, networking, identity catalogs, and service inventory to MCP clients, with optional prompts and resources. Write tools are absent by default and require both admin mode and explicit enablement.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"oomchiller-openstack": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OS_AUTH_URL",
"-e",
"OS_USERNAME",
"-e",
"OS_PASSWORD",
"-e",
"OS_USER_DOMAIN_NAME",
"-e",
"OS_PROJECT_ID",
"-e",
"OS_APPLICATION_CREDENTIAL_ID",
"-e",
"OS_APPLICATION_CREDENTIAL_SECRET",
"-e",
"OS_REGION_NAME",
"-e",
"OPENSTACK_MCP_PROJECT_IDS",
"-e",
"OPENSTACK_MCP_CACERT_PEM",
"ghcr.io/oomchiller/openstack-mcp-server:0.1.2"
],
"env": {
"OS_AUTH_URL": "<OS_AUTH_URL>",
"OS_USERNAME": "<OS_USERNAME>",
"OS_PASSWORD": "<OS_PASSWORD>",
"OS_USER_DOMAIN_NAME": "<OS_USER_DOMAIN_NAME>",
"OS_PROJECT_ID": "<OS_PROJECT_ID>",
"OS_APPLICATION_CREDENTIAL_ID": "<OS_APPLICATION_CREDENTIAL_ID>",
"OS_APPLICATION_CREDENTIAL_SECRET": "<OS_APPLICATION_CREDENTIAL_SECRET>",
"OS_REGION_NAME": "<OS_REGION_NAME>",
"OPENSTACK_MCP_PROJECT_IDS": "<OPENSTACK_MCP_PROJECT_IDS>",
"OPENSTACK_MCP_CACERT_PEM": "<OPENSTACK_MCP_CACERT_PEM>"
}
}
}
}
Run commanddocker run -i --rm -e OS_AUTH_URL -e OS_USERNAME -e OS_PASSWORD -e OS_USER_DOMAIN_NAME -e OS_PROJECT_ID -e OS_APPLICATION_CREDENTIAL_ID -e OS_APPLICATION_CREDENTIAL_SECRET -e OS_REGION_NAME -e OPENSTACK_MCP_PROJECT_IDS -e OPENSTACK_MCP_CACERT_PEM ghcr.io/oomchiller/openstack-mcp-server:0.1.2
Environment variables to set
OS_AUTH_URLSecretKeystone v3 endpoint, for example https://keystone.example.com:5000/v3
OS_USERNAMEUser name; omit when using an application credential
OS_PASSWORDSecretPassword for OS_USERNAME
OS_USER_DOMAIN_NAMEDomain of OS_USERNAME
OS_PROJECT_IDProject to scope the token to
OS_APPLICATION_CREDENTIAL_IDSecretApplication credential ID, instead of a user name and password
OS_APPLICATION_CREDENTIAL_SECRETSecretApplication credential secret
OS_REGION_NAMERegion name
OPENSTACK_MCP_PROJECT_IDSComma-separated project IDs the server may use; the first is the default
OPENSTACK_MCP_CACERT_PEMCA bundle as PEM text, for a private CA

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
ocighcr.io/oomchiller/openstack-mcp-server:0.1.2

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project 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/[email protected]", "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.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.