# OpenStack MCP server

> Lets AI assistants inspect OpenStack clouds including compute, images, block storage, networking, and Keystone catalog.

- Repository: https://github.com/oomchiller/openstack-mcp-server
- Page: https://hostedmcp.org/servers/oomchiller/openstack-mcp-server
- Transport: stdio
- Stars: 0
- License: Apache-2.0
- Latest version: 0.1.2

## Install

### Claude Code

```sh
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
```

### Cursor (`~/.cursor/mcp.json`)

```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>"
      }
    }
  }
}
```

### VS Code (`.vscode/mcp.json`)

```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>"
      }
    }
  }
}
```

### VS Code CLI

```sh
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>"}}'
```

### Claude Desktop (`claude_desktop_config.json`)

```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>"
      }
    }
  }
}
```

### Codex

```sh
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.2
```

### Codex config.toml (`~/.codex/config.toml`)

```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>"
```

### Gemini CLI

```sh
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.2
```

### Gemini settings.json (`~/.gemini/settings.json`)

```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>"
      }
    }
  }
}
```

## Environment variables

| Name | Required | Secret | Description |
|---|---|---|---|
| `OS_AUTH_URL` | yes | no | Keystone v3 endpoint, for example https://keystone.example.com:5000/v3 |
| `OS_APPLICATION_CREDENTIAL_SECRET` | no | yes | Application credential secret |
| `OS_PASSWORD` | no | yes | Password for OS_USERNAME |
| `OPENSTACK_MCP_CACERT_PEM` | no | no | CA bundle as PEM text, for a private CA |
| `OPENSTACK_MCP_PROJECT_IDS` | no | no | Comma-separated project IDs the server may use; the first is the default |
| `OS_APPLICATION_CREDENTIAL_ID` | no | no | Application credential ID, instead of a user name and password |
| `OS_CLOUD` | no | no |  |
| `OS_PROJECT_ID` | no | no | Project to scope the token to |
| `OS_REGION_NAME` | no | no | Region name |
| `OS_USERNAME` | no | no | User name; omit when using an application credential |
| `OS_USER_DOMAIN_NAME` | no | no | Domain of OS_USERNAME |

## FAQ

### 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.
