OpenStack MCP server
Commit Nov 3, 2026Lets AI assistants inspect OpenStack clouds including compute, images, block storage, networking, and Keystone catalog.
Also known as oomchiller/openstack-mcp-server, openstack-mcp-server
- Stars
- 0
- Tools
- —
- Downloads, 30 days
- —
- Latest version
- 0.1.2
- Last commit
- Nov 3, 2026
- License
- Apache-2.0
What is OpenStack MCP?
OpenStack lets AI assistants inspect OpenStack clouds including compute, images, block storage, networking, and Keystone catalog.
Summary generated from the project's README
About OpenStack MCP server
Inspecting OpenStack cloud environments through an AI assistant is what this server enables for cloud administrators and developers. It provides a structured way to query compute, images, block storage, networking, and the Keystone catalog using thirty-two specialized read tools. The server operates as a local process via stdio or as a container, and it can also be configured for streamable HTTP on a loopback interface.
Users configure the connection using standard OpenStack environment variables or a clouds.yaml file. While the server is read-only by default to ensure safety, it can be switched to admin mode to enable thirty-one experimental write tools for managing resources like servers, volumes, and networks. Security is managed through the Keystone role of the configured identity, and the server includes features like project allowlists and response size limits to maintain controlled interactions with the cloud APIs.
What you can do with it
- 1Audit cloud resource inventoryAsk an AI to list all available compute flavors and network subnets within a specific OpenStack project.
- 2Troubleshoot networking configurationsRequest a summary of all routers, floating IPs, and security groups to verify network connectivity.
- 3Manage cloud infrastructure via AIEnable administrative write access to allow an AI assistant to create or modify servers and volumes.
Written from the project's README. Every use case is checked against a quote from it.
How to install OpenStack MCP
Formats verified 10 Nov 2026Add to CursorAdd to GooseInstall OpenStack MCP in Claude Code
$ claude mcp add --env 'OS_AUTH_URL=<OS_AUTH_URL>' --env 'OS_APPLICATION_CREDENTIAL_SECRET=<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>' --env 'OS_PASSWORD=<YOUR_OS_PASSWORD>' openstack-mcp-server -- docker run -i --rm ghcr.io/oomchiller/openstack-mcp-server:0.1.2Install OpenStack MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"openstack-mcp-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/oomchiller/openstack-mcp-server:0.1.2"
],
"env": {
"OS_AUTH_URL": "<OS_AUTH_URL>",
"OS_APPLICATION_CREDENTIAL_SECRET": "<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>",
"OS_PASSWORD": "<YOUR_OS_PASSWORD>"
}
}
}
}Install OpenStack MCP in VS Code
.vscode/mcp.json
{
"servers": {
"openstack-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/oomchiller/openstack-mcp-server:0.1.2"
],
"env": {
"OS_AUTH_URL": "<OS_AUTH_URL>",
"OS_APPLICATION_CREDENTIAL_SECRET": "<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>",
"OS_PASSWORD": "<YOUR_OS_PASSWORD>"
}
}
}
}Install OpenStack MCP in VS Code CLI
$ code --add-mcp '{"name":"openstack-mcp-server","type":"stdio","command":"docker","args":["run","-i","--rm","ghcr.io/oomchiller/openstack-mcp-server:0.1.2"],"env":{"OS_AUTH_URL":"<OS_AUTH_URL>","OS_APPLICATION_CREDENTIAL_SECRET":"<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>","OS_PASSWORD":"<YOUR_OS_PASSWORD>"}}'Install OpenStack MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"openstack-mcp-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/oomchiller/openstack-mcp-server:0.1.2"
],
"env": {
"OS_AUTH_URL": "<OS_AUTH_URL>",
"OS_APPLICATION_CREDENTIAL_SECRET": "<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>",
"OS_PASSWORD": "<YOUR_OS_PASSWORD>"
}
}
}
}Install OpenStack MCP in Codex
$ codex mcp add openstack-mcp-server --env 'OS_AUTH_URL=<OS_AUTH_URL>' --env 'OS_APPLICATION_CREDENTIAL_SECRET=<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>' --env 'OS_PASSWORD=<YOUR_OS_PASSWORD>' -- docker run -i --rm ghcr.io/oomchiller/openstack-mcp-server:0.1.2Install OpenStack MCP in Codex config.toml
~/.codex/config.toml
[mcp_servers.openstack-mcp-server] command = "docker" args = ["run", "-i", "--rm", "ghcr.io/oomchiller/openstack-mcp-server:0.1.2"] [mcp_servers.openstack-mcp-server.env] OS_AUTH_URL = "<OS_AUTH_URL>" OS_APPLICATION_CREDENTIAL_SECRET = "<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>" OS_PASSWORD = "<YOUR_OS_PASSWORD>"
Install OpenStack MCP in Gemini CLI
$ gemini mcp add -s user -e 'OS_AUTH_URL=<OS_AUTH_URL>' -e 'OS_APPLICATION_CREDENTIAL_SECRET=<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>' -e 'OS_PASSWORD=<YOUR_OS_PASSWORD>' openstack-mcp-server docker -- run -i --rm ghcr.io/oomchiller/openstack-mcp-server:0.1.2Install OpenStack MCP in Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"openstack-mcp-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/oomchiller/openstack-mcp-server:0.1.2"
],
"env": {
"OS_AUTH_URL": "<OS_AUTH_URL>",
"OS_APPLICATION_CREDENTIAL_SECRET": "<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>",
"OS_PASSWORD": "<YOUR_OS_PASSWORD>"
}
}
}
}Configuration
OS_AUTH_URLRequiredKeystone v3 endpoint, for example https://keystone.example.com:5000/v3
OS_APPLICATION_CREDENTIAL_SECRETSecretApplication credential secret
OS_PASSWORDSecretPassword for OS_USERNAME
OPENSTACK_MCP_CACERT_PEMCA bundle as PEM text, for a private CA
OPENSTACK_MCP_PROJECT_IDSComma-separated project IDs the server may use; the first is the default
OS_APPLICATION_CREDENTIAL_IDApplication credential ID, instead of a user name and password
OS_CLOUDOS_PROJECT_IDProject to scope the token to
OS_REGION_NAMERegion name
OS_USERNAMEUser name; omit when using an application credential
OS_USER_DOMAIN_NAMEDomain of OS_USERNAME
| Name | Description | |
|---|---|---|
| OS_AUTH_URL | Keystone v3 endpoint, for example https://keystone.example.com:5000/v3 | Required |
| OS_APPLICATION_CREDENTIAL_SECRET | Application credential secret | Secret |
| OS_PASSWORD | Password for OS_USERNAME | Secret |
| OPENSTACK_MCP_CACERT_PEM | CA bundle as PEM text, for a private CA | |
| OPENSTACK_MCP_PROJECT_IDS | Comma-separated project IDs the server may use; the first is the default | |
| OS_APPLICATION_CREDENTIAL_ID | Application credential ID, instead of a user name and password | |
| OS_CLOUD | — | |
| OS_PROJECT_ID | Project to scope the token to | |
| OS_REGION_NAME | Region name | |
| OS_USERNAME | User name; omit when using an application credential | |
| OS_USER_DOMAIN_NAME | Domain of OS_USERNAME |
Automated checks
Ran Nov 14, 2026Full report →Not verified yet. A server needs a score of 80, no serious finding, and enough data for us to check. How checks work · What to fix for more points
- Source repository linked and reachableoomchiller/openstack-mcp-server is public and reachablegithub.com/oomchiller/openstack-mcp-server ↗Pass
- Package names this repository as its sourceNot checked
- Build provenance (Sigstore attestation)Not checked
- Open source license (OSI)Apache-2.0spdx.org/licenses/Apache-2.0.html ↗Pass
- Commit or release in the last yearLast commit or release 2026-11-03github.com/oomchiller/openstack-mcp-server ↗Pass
- OpenSSF ScorecardNot checked
- Package name not close to a popular packageNot checked
- No critical advisory in the package or its dependenciesNot checked
- No hidden instructions to the model0 tool descriptions and the README read; no override phrases, credential paths or hidden charactersPass
- Destructive tools are labelledNot checked
- Remote endpoint answers the MCP handshakeNot checked
README
View on GitHubopenstack-mcp-server
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,completeandnext_marker; results are typed (outputSchema,structuredContent) and capped in size. - Errors are
isErrorresults 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:
| Variable | Default | Meaning |
|---|---|---|
OPENSTACK_MCP_MODE |
readonly |
readonly or admin. |
OPENSTACK_MCP_ENABLE_WRITE_TOOLS |
false |
With admin, registers write tools. |
OPENSTACK_MCP_PROJECT_IDS |
empty | Comma-separated project IDs the server may use; the first is the default. |
OPENSTACK_MCP_DEFAULT_LIMIT |
50 |
Items per list call when limit is omitted. |
OPENSTACK_MCP_MAX_LIMIT |
100 |
Largest accepted limit (up to 1000). |
OPENSTACK_MCP_MAX_RESPONSE_BYTES |
524288 |
Largest result; larger ones fail with response_too_large. |
OPENSTACK_MCP_API_TIMEOUT |
10 |
Seconds per OpenStack request; no retries. |
OPENSTACK_MCP_CACERT_PEM |
unset | CA bundle as PEM text; takes precedence over OS_CACERT. |
OPENSTACK_MCP_ALLOW_INSECURE |
false |
Allow verify: false or an http:// auth URL. |
OPENSTACK_MCP_ENABLE_PROMPTS |
true |
Register the prompt. |
OPENSTACK_MCP_ENABLE_RESOURCES |
true |
Register openstack://scope. |
OPENSTACK_MCP_TRANSPORT |
stdio |
stdio or streamable-http. |
OPENSTACK_MCP_HTTP_HOST / _PORT |
127.0.0.1 / 8000 |
HTTP bind; path /mcp. |
OPENSTACK_MCP_HTTP_ALLOW_REMOTE |
false |
Allow a non-loopback HTTP bind. The HTTP transport has no authentication. |
OPENSTACK_MCP_LOG_LEVEL |
WARNING |
stderr 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
| Group | Tools |
|---|---|
| Scope | get_scope |
| Compute | list_servers, get_server, list_flavors |
| Image | list_images, get_image |
| Block storage | list_volumes, get_volume, list_volume_attachments, get_volume_attachment |
| Network | list_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 |
| Identity | list_regions, list_domains, list_projects, list_services, list_endpoints |
| Service inventory | list_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.
OpenStack MCP questions
How do I add OpenStack MCP to Claude Code?
Run claude mcp add --env 'OS_AUTH_URL=<OS_AUTH_URL>' --env 'OS_APPLICATION_CREDENTIAL_SECRET=<YOUR_OS_APPLICATION_CREDENTIAL_SECRET>' --env 'OS_PASSWORD=<YOUR_OS_PASSWORD>' openstack-mcp-server -- docker run -i --rm ghcr.io/oomchiller/openstack-mcp-server:0.1.2 in your terminal. Add --scope user to make it available in every project.
How do I add OpenStack MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
Is the server read-only?
Yes, it is read-only by default, but write tools can be enabled by changing specific settings.
How can I run this server in a container?
You can run it using Docker by passing OpenStack credentials as environment variables.
What is the security boundary for the server?
The security boundary is defined by the Keystone role of the identity you configure.
Can I use a local clouds.yaml file?
Yes, you can run the server as a local process using a clouds.yaml file for configuration.