# OpenStack (oci · ghcr.io/oomchiller/openstack-mcp-server)

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

- Trust score: 44/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-06

## Components

- oci · `ghcr.io/oomchiller/openstack-mcp-server`: 44/100 (this document), [markdown](https://verifymcp.io/servers/oomchiller-openstack-mcp-server/ghcr-io-oomchiller-openstack-mcp-server.md), [page](https://verifymcp.io/servers/oomchiller-openstack-mcp-server/ghcr-io-oomchiller-openstack-mcp-server)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/oomchiller/openstack-mcp-server`
- Version: `0.1.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-06.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 2 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 84/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3542 tokens (~107/item across 33 items; 32 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 10/100
  - Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 32 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 34 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the OpenStack MCP server?

OpenStack runs locally as a container image, launched with docker run --rm -i -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. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add oomchiller-openstack-mcp-server -- docker run --rm -i -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
```

This image reads OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_USER_DOMAIN_NAME, OS_PROJECT_ID, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET, OS_REGION_NAME, OPENSTACK_MCP_PROJECT_IDS and OPENSTACK_MCP_CACERT_PEM. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Cursor

```json
{
  "mcpServers": {
    "oomchiller-openstack-mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-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"
      ]
    }
  }
}
```

This image reads OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_USER_DOMAIN_NAME, OS_PROJECT_ID, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET, OS_REGION_NAME, OPENSTACK_MCP_PROJECT_IDS and OPENSTACK_MCP_CACERT_PEM. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### VS Code

```json
{
  "servers": {
    "oomchiller-openstack-mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-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"
      ]
    }
  }
}
```

This image reads OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_USER_DOMAIN_NAME, OS_PROJECT_ID, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET, OS_REGION_NAME, OPENSTACK_MCP_PROJECT_IDS and OPENSTACK_MCP_CACERT_PEM. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Codex

```bash
codex mcp add oomchiller-openstack-mcp-server -- docker run --rm -i -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
```

This image reads OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_USER_DOMAIN_NAME, OS_PROJECT_ID, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET, OS_REGION_NAME, OPENSTACK_MCP_PROJECT_IDS and OPENSTACK_MCP_CACERT_PEM. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "oomchiller-openstack-mcp-server": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-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"
      ],
      "enabled": true
    }
  }
}
```

This image reads OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_USER_DOMAIN_NAME, OS_PROJECT_ID, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET, OS_REGION_NAME, OPENSTACK_MCP_PROJECT_IDS and OPENSTACK_MCP_CACERT_PEM. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Hermes

```yaml
mcp_servers:
  oomchiller-openstack-mcp-server:
    command: "docker"
    args: ["run", "--rm", "-i", "-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"]
```

This image reads OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_USER_DOMAIN_NAME, OS_PROJECT_ID, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET, OS_REGION_NAME, OPENSTACK_MCP_PROJECT_IDS and OPENSTACK_MCP_CACERT_PEM. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Netclaw

```json
{
  "McpServers": {
    "oomchiller-openstack-mcp-server": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-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"
      ]
    }
  }
}
```

This image reads OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_USER_DOMAIN_NAME, OS_PROJECT_ID, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET, OS_REGION_NAME, OPENSTACK_MCP_PROJECT_IDS and OPENSTACK_MCP_CACERT_PEM. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Other

```json
{
  "mcpServers": {
    "oomchiller-openstack-mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-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"
      ]
    }
  }
}
```

This image reads OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_USER_DOMAIN_NAME, OS_PROJECT_ID, OS_APPLICATION_CREDENTIAL_ID, OS_APPLICATION_CREDENTIAL_SECRET, OS_REGION_NAME, OPENSTACK_MCP_PROJECT_IDS and OPENSTACK_MCP_CACERT_PEM. Set them in your client's env block for this server; docker run -e passes each one through to the container.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 44, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 43)

First indexed and scored.

## MCP tools (32)

### `get_scope` (~31 tokens)

Show server scope

Show mode, allowed projects, limits and whether credentials are configured.

Does not contact the cloud. Call it first.

Output parameters:

- `cloud_access_verified` (boolean): Always false: get_scope does not contact the cloud.
- `configured` (boolean)
- `credential_source` (string)
- `default_project_id`: Project used when project_id is omitted; null when the configuration names the project only by name.
- `interface`
- `limits`
- `mode` (string)
- `project_ids` (array): Allowlisted projects; empty if none.
- `reason`: Why the cloud is not usable: missing_credentials, insecure_transport or invalid_cloud_config.
- `region_name`
- `server_version` (string)
- `tls` (string)
- `write_tools_registered` (boolean)

### `list_servers` (~126 tokens)

List servers

List servers in the project with status, flavor, image, addresses and
volumes.

Paged with limit and marker. Use get_server for one server by ID.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `name`: Name regex filter.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `status`: Server status filter, for example ACTIVE or SHUTOFF.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_server` (~95 tokens)

Get server

Get one server by ID: status, flavor, image, addresses, security groups and
volumes.

Use list_servers to find IDs by name or status. Returns not_found if the
ID is not in the selected project.

Input parameters:

- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `server_id` (string, required): Server ID, as returned by list_servers.

Output parameters:

- `addresses`
- `attached_volumes`
- `availability_zone`
- `created_at`
- `description`
- `flavor`
- `hostname`
- `id` (string)
- `image`
- `key_name`
- `name` (string)
- `security_groups`
- `status`
- `updated_at`

### `list_flavors` (~107 tokens)

List flavors

List flavors visible to the project: vCPUs, RAM (MiB), disk (GiB).

Paged with limit and marker. Use it to resolve the flavor of a server.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_images` (~134 tokens)

List images

List images visible to the project with status, visibility, formats and size.

Paged with limit and marker. Use get_image for one image by ID.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `name`: Exact image name.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `status`: Image status filter, for example active.
- `visibility`: Visibility filter: public, private, shared or community.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_image` (~98 tokens)

Get image

Get one image by ID: status, visibility, formats, size, minimum disk and RAM,
tags.

Use list_images to find IDs by name. Returns not_found if the image does
not exist or is not visible to the selected project.

Input parameters:

- `image_id` (string, required): Image ID, as returned by list_images.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `checksum`
- `container_format`
- `created_at`
- `disk_format`
- `hash_algo`
- `hash_value`
- `id` (string)
- `is_hidden`
- `is_protected`
- `min_disk`
- `min_ram`
- `name`
- `owner`
- `size`
- `status`
- `tags`
- `updated_at`
- `virtual_size`
- `visibility`

### `list_volumes` (~125 tokens)

List volumes

List volumes in the project with size (GiB), type, status and attachments.

Paged with limit and marker. Use get_volume for one volume by ID.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `name`: Exact volume name.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `status`: Volume status filter, for example available or in-use.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_volume` (~98 tokens)

Get volume

Get one volume by ID: status, size (GiB), type, bootable, encrypted,
attachments.

Use list_volumes to find IDs by name or status. Returns not_found if the
ID is not in the selected project.

Input parameters:

- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `volume_id` (string, required): Volume ID, as returned by list_volumes.

Output parameters:

- `attachments` (array)
- `availability_zone`
- `created_at`
- `description`
- `id` (string)
- `is_bootable`
- `is_encrypted`
- `name`
- `size`
- `status`
- `updated_at`
- `volume_type`

### `list_volume_attachments` (~125 tokens)

List volume attachments

List Cinder attachment records (API microversion 3.27 or later).

Connection details are not returned. Paged with limit and marker.

Input parameters:

- `instance_id`: Server ID the volume is attached to.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `volume_id`: Volume ID whose attachments to list.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_volume_attachment` (~65 tokens)

Get volume attachment

Get one Cinder attachment record by ID, without connection details.

Input parameters:

- `attachment_id` (string, required): Attachment ID, as returned by list_volume_attachments.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `attach_mode`
- `attached_at`
- `detached_at`
- `id` (string)
- `instance`
- `status`
- `volume_id`

### `list_networks` (~125 tokens)

List networks

List the project's networks, or shared networks with shared=true.

Paged with limit and marker.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `shared` (boolean): List shared networks visible to the project, whatever their owner, instead of the project's own networks.
- `status`: Network status filter, for example ACTIVE.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_network` (~101 tokens)

Get network

Get one network by ID: status, sharing and external flags, MTU, subnets,
provider data.

Use list_networks to find IDs, with shared=true for shared networks.
Returns not_found if the network is not visible to the selected project.

Input parameters:

- `network_id` (string, required): Network ID, as returned by list_networks.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `availability_zones`
- `description`
- `id` (string)
- `is_admin_state_up`
- `is_router_external`
- `is_shared`
- `mtu`
- `name`
- `project_id`
- `provider_network_type`
- `provider_physical_network`
- `provider_segmentation_id`
- `status`
- `subnet_ids`

### `list_subnets` (~118 tokens)

List subnets

List the project's subnets with CIDR, gateway and DHCP settings.

Paged with limit and marker.

Input parameters:

- `ip_version`: IP version filter: 4 or 6.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `network_id`: Network ID whose subnets to list.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_subnet` (~102 tokens)

Get subnet

Get one subnet by ID: CIDR, gateway, DHCP, allocation pools, DNS servers and
routes.

Use list_subnets to find IDs, optionally for one network. Returns
not_found if the subnet is not visible to the selected project.

Input parameters:

- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `subnet_id` (string, required): Subnet ID, as returned by list_subnets.

Output parameters:

- `allocation_pools`
- `cidr`
- `description`
- `dns_nameservers`
- `gateway_ip`
- `host_routes`
- `id` (string)
- `ip_version`
- `is_dhcp_enabled`
- `name`
- `network_id`
- `project_id`

### `list_ports` (~126 tokens)

List ports

List the project's ports with fixed IPs and security groups.

Paged with limit and marker.

Input parameters:

- `device_id`: Server or router ID owning the port.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `network_id`: Network ID whose ports to list.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `status`: Port status filter, for example ACTIVE or DOWN.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_port` (~98 tokens)

Get port

Get one port by ID: network, device, MAC, fixed IPs, security groups, address
pairs.

Use list_ports to find IDs by network or device. Returns not_found if
the port is not visible to the selected project.

Input parameters:

- `port_id` (string, required): Port ID, as returned by list_ports.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `allowed_address_pairs`
- `description`
- `device_id`
- `device_owner`
- `fixed_ips`
- `id` (string)
- `is_admin_state_up`
- `mac_address`
- `name`
- `network_id`
- `project_id`
- `security_group_ids`
- `status`

### `list_floating_ips` (~161 tokens)

List floating IPs

List the project's floating IPs with the fixed IP, port and router they map
to.

Paged with limit and marker. There is no get tool: filter by port_id to
find the floating IP of one port.

Input parameters:

- `floating_network_id`: External network ID the floating IPs come from.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `port_id`: Port ID the floating IP is associated with.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `status`: Floating IP status filter, for example ACTIVE or DOWN.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_routers` (~112 tokens)

List routers

List the project's routers with external gateway and static routes.

Paged with limit and marker. Use list_router_interfaces for the subnets
a router connects.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `status`: Router status filter, for example ACTIVE.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_router` (~95 tokens)

Get router

Get one router by ID: status, external gateway, static routes, HA and
distributed flags.

Use list_router_interfaces for its internal subnets. Returns not_found if
the router is not visible to the selected project.

Input parameters:

- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `router_id` (string, required): Router ID, as returned by list_routers.

Output parameters:

- `description`
- `external_gateway_info`
- `id` (string)
- `is_admin_state_up`
- `is_distributed`
- `is_ha`
- `name`
- `project_id`
- `routes`
- `status`

### `list_router_interfaces` (~97 tokens)

List router interfaces

List a router's internal interfaces: port, subnet and IP address.

Not paged; complete=false means the router has more interfaces.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `router_id` (string, required): Router ID, as returned by list_routers.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_security_groups` (~94 tokens)

List security groups

List the project's security groups with their rules.

Paged with limit and marker.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `marker`: next_marker from the previous page; omit for the first page.
- `name`: Exact security group name.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `get_security_group` (~97 tokens)

Get security group

Get one security group by ID with all its rules: direction, protocol, ports,
remote.

Use list_security_groups to find IDs by name. Returns not_found if the
group is not visible to the selected project.

Input parameters:

- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `security_group_id` (string, required): Security group ID, as returned by list_security_groups.

Output parameters:

- `description`
- `id` (string)
- `name`
- `project_id`
- `security_group_rules`
- `stateful`

### `list_regions` (~60 tokens)

List regions

List Keystone regions. Not paged.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_domains` (~95 tokens)

List domains

List Keystone domains. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `name`: Exact domain name.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_projects` (~109 tokens)

List projects

List Keystone projects. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `domain_id`: Domain ID, as returned by list_domains.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `name`: Exact project name.
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_services` (~111 tokens)

List catalog services

List Keystone catalog entries such as compute or network, not running
daemons. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `type`: Service type, e.g. compute.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_endpoints` (~134 tokens)

List catalog endpoints

List Keystone catalog endpoints with interface and URL. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `interface`: Endpoint interface: public, internal or admin.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.
- `region_id`: Region ID, as returned by list_regions.
- `service_id`: Service ID, as returned by list_services.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_hypervisors` (~96 tokens)

List hypervisors

List Nova hypervisors with state and capacity. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_compute_services` (~120 tokens)

List compute services

List running Nova daemons such as nova-compute with host and state. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `binary`: Service binary, for example nova-compute.
- `host`: Host name filter.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_aggregates` (~95 tokens)

List host aggregates

List Nova host aggregates with availability zone and hosts. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_network_agents` (~118 tokens)

List network agents

List Neutron agents with host and liveness. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `agent_type`: Agent type, for example 'Open vSwitch agent'.
- `host`: Host name filter.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

### `list_volume_services` (~121 tokens)

List volume services

List running Cinder daemons such as cinder-volume with host and state. Usually needs more than a project reader role; forbidden means the role is missing, not that the list is empty. Not paged; narrow with filters.

Input parameters:

- `binary`: Service binary, for example cinder-volume.
- `host`: Host name filter.
- `limit` (integer): Maximum items to return (1-100, default 50).
- `project_id`: Project ID to work in; omit for the default project. Allowed values are listed by get_scope.

Output parameters:

- `complete` (boolean): True when no more items exist beyond this page.
- `items` (array)
- `limit` (integer): Maximum number of items requested.
- `next_marker`: Pass as marker to read the next page; null when complete or when the API has no marker paging.
- `observed_at` (string): UTC time the list was read.
- `project_id`: Project whose session produced the list.
- `resource` (string): Resource type of the items.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/oomchiller-openstack-mcp-server/ghcr-io-oomchiller-openstack-mcp-server#diagnostics

## Score history

- 2026-11-06: 44
- 2026-11-05: 44
- 2026-11-04: 43
- 2026-11-03: 43

## Common questions

### What is the OpenStack MCP server?

OpenStack is an MCP server listed in the public MCP registry as io.github.oomchiller/openstack-mcp-server. Read-only-first OpenStack inspection: servers, images, volumes, networks, Keystone catalog. This page covers its container image (ghcr.io/oomchiller/openstack-mcp-server).

### Is the OpenStack MCP server safe to use?

OpenStack scores 44 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the OpenStack MCP server expose?

OpenStack exposes 32 tools: get_scope, list_servers, get_server, list_flavors, list_images, and 27 more. Their descriptions and schemas cost roughly 3,389 tokens of context every time the server is loaded.

### Is the OpenStack MCP server still maintained?

OpenStack is still listed as active in the MCP registry. We last reached this channel on 6 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the OpenStack MCP server under?

OpenStack declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the OpenStack MCP server?

VerifyMCP ran 12 checks on OpenStack, covering Source repository, Provenance, License, Maintenance and 8 more. 4 items could not be completed, a gap on our side rather than a finding about OpenStack: Malware scan, Known CVEs, Install scripts and Dependency health. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to a container image, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- GitHub Container Registry: https://ghcr.io/oomchiller/openstack-mcp-server
- Repository: https://github.com/oomchiller/openstack-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/oomchiller-openstack-mcp-server/ghcr-io-oomchiller-openstack-mcp-server.xml
- Changelog JSON feed: https://verifymcp.io/servers/oomchiller-openstack-mcp-server/ghcr-io-oomchiller-openstack-mcp-server/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/oomchiller-openstack-mcp-server/ghcr-io-oomchiller-openstack-mcp-server.json
- HTML version of this page: https://verifymcp.io/servers/oomchiller-openstack-mcp-server/ghcr-io-oomchiller-openstack-mcp-server
