# openstack-kr/python-openstackmcp-server [Health: Active]

**Category:** ☁️ Cloud Platforms  
**Repository:** https://github.com/openstack-kr/python-openstackmcp-server  
**GitHub Stars:** 20  
**Views:** 3  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/openstack-kr-python-openstackmcp-server

## Description
OpenStack MCP server for cloud infrastructure management based on openstacksdk.

## Tools
Capabilities this server exposes over MCP:

- **get_servers** — Get the list of Compute servers.

:return: A list of Server objects.
- **get_server** — Get a specific Compute server.
- **create_server** — Create a new Compute server.
- **get_flavors** — Get flavors (server hardware configurations).

:return: A list of Flavor objects.
- **action_server** — Perform an action on a Compute server.
- **update_server** — Update a Compute server's name, hostname, or description.
- **delete_server** — Delete a Compute server.
- **attach_volume** — Attach a volume to a Compute server.
- **detach_volume** — Detach a volume from a Compute server.
- **get_image** — Get an OpenStack image by ID.
- **get_images** — Get the list of OpenStack images with optional filtering.

The filtering behavior is as follows:
- By default, all available images are returned without any filtering applied.
- Filters are only applied when specific values are provided by the user.
- **create_image** — Create a new Openstack image.
This method handles both cases of image creation:
1. If a volume is provided, it creates an image from the volume.
2. If no volume is provided, it creates an image using the Image imports method
    import_options field is required for this method.
Following import methods are supported:
- glance-direct: The image data is made available to the Image service via the Stage binary
- web-download: The image data is made available to the Image service by being posted to an accessible location with a URL that you know.
    - must provide a URI to the image data.
- copy-image: The image data is made available to the Image service by copying existing image
- glance-download: The image data is made available to the Image service by fetching an image accessible from another glance service specified by a region name and an image id that you know.
    - must provide a glance_region and glance_image_id.
- **delete_image** — Delete an OpenStack image.
- **get_regions** — Get the list of Identity regions.

:return: A list of Region objects representing the regions.
- **get_region** — Get a region.
- **create_region** — Create a new region.
- **delete_region** — Delete a region.
- **update_region** — Update a region.
- **get_domains** — Get the list of Identity domains.

:return: A list of Domain objects representing the domains.
- **get_domain** — Get a domain.
- **create_domain** — Create a new domain.
- **delete_domain** — Delete a domain.
- **update_domain** — Update a domain.
- **get_projects** — Get the list of Identity projects.

:return: A list of Project objects representing the projects.
- **get_project** — Get a project.
- **create_project** — Create a new project.
- **delete_project** — Delete a project.
- **update_project** — Update a project.
- **get_networks** — Get the list of Networks with optional filtering.
- **create_network** — Create a new Network.
- **get_network_detail** — Get detailed information about a specific Network.
- **update_network** — Update an existing Network.
- **delete_network** — Delete a Network.
- **get_subnets** — Get the list of Subnets with optional filtering.

Use this to narrow results by network, project, IP version, gateway presence, and
DHCP-enabled state.

Notes:
- has_gateway is applied client-side after retrieval and checks whether `gateway_ip` is set.
- `is_dhcp_enabled` maps to Neutron's `enable_dhcp` filter.
- Combining filters further restricts the result (logical AND).

Examples:
- All IPv4 subnets in a network: `network_id="net-1"`, `ip_version=4`
- Only subnets with a gateway: `has_gateway=True`
- DHCP-enabled subnets for a project: `project_id="proj-1"`, `is_dhcp_enabled=True`
- **create_subnet** — Create a new Subnet.
- **get_subnet_detail** — Get detailed information about a specific Subnet.
- **update_subnet** — Update subnet attributes atomically. Only provided parameters are changed; omitted
parameters remain untouched.

Typical use-cases:
- Set gateway: `gateway_ip="10.0.0.1"`.
- Clear gateway: `clear_gateway=True`.
- Enable/disable DHCP: `is_dhcp_enabled=True or False`.
- Batch updates: update name/description and DNS nameservers together.

Notes:
- `clear_gateway=True` explicitly clears `gateway_ip` (sets to None). If both `gateway_ip`
  and `clear_gateway=True` are provided, `clear_gateway` takes precedence.
- For list-typed fields (`dns_nameservers`, `allocation_pools`, `host_routes`), the provided
  list replaces the entire list on the server. Pass `[]` to remove all entries.
- For a DHCP toggle, read the current value via `get_subnet_detail()` and pass the inverted
  boolean to `is_dhcp_enabled`.

Examples:
- Clear the gateway and disable DHCP: `clear_gateway=True`, `is_dhcp_enabled=False`
- Replace DNS servers: `dns_nameservers=["8.8.8.8", "1.1.1.1"]`
- **delete_subnet** — Delete a Subnet.
- **get_ports** — Get the list of Ports with optional filtering.
- **create_port** — Create a new Port.
- **get_port_detail** — Get detailed information about a specific Port.
- **update_port** — Update an existing Port. Only provided parameters are changed; omitted parameters remain untouched.

Typical use-cases:
- Set admin state down: is_admin_state_up=False
- Toggle admin state: read current via get_port_detail(); pass inverted value
- Replace security groups: security_group_ids=["sg-1", "sg-2"]
- Replace allowed address pairs:
  1) current = get_port_allowed_address_pairs(port_id)
  2) edit the list (append/remove dicts)
  3) update_port(port_id, allowed_address_pairs=current)
- Replace fixed IPs:
  1) current = get_port_detail(port_id).fixed_ips
  2) edit the list
  3) update_port(port_id, fixed_ips=current)

Notes:
- List-typed fields (security groups, allowed address pairs, fixed IPs) replace the entire list
  with the provided value. Pass [] to remove all entries.
- For fixed IPs, each dict typically includes keys like "subnet_id" and/or "ip_address".

Examples:
- Add a fixed IP: read current, append a new {"subnet_id": "subnet-2", "ip_address": "10.0.1.10"},
  then pass fixed_ips=[...]
- Clear all security groups: security_group_ids=[]
- **delete_port** — Delete a Port.
- **get_port_allowed_address_pairs** — Get allowed address pairs configured on a port.
- **set_port_binding** — Set binding attributes for a port.
- **get_floating_ips** — Get the list of Floating IPs with optional filtering.
- **create_floating_ip** — Create a new Floating IP.

Typical use-cases:
- Allocate in a pool and attach immediately: provide port_id (and optionally fixed_ip_address).
- Allocate for later use: omit port_id (unassigned state).
- Add metadata: provide description.
- **delete_floating_ip** — Delete a Floating IP.
- **update_floating_ip** — Update Floating IP attributes. Only provided parameters are changed; omitted
parameters remain untouched.

Typical use-cases:
- Attach to a port: port_id="port-1" (optionally fixed_ip_address="10.0.0.10").
- Detach from its port: clear_port=True and omit port_id (sets port_id=None).
- Keep current port: clear_port=False and omit port_id.
- Update description: description="new desc" or clear with description=None.
- Reassign to another port: port_id="new-port" (optionally with fixed_ip_address).

Notes:
- Passing None for description clears it.
- clear_port controls whether to detach when no port_id is provided.
- fixed_ip_address is optional and can be provided alongside port_id.
- **create_floating_ips_bulk** — Create multiple floating IPs on the specified external network.
- **assign_first_available_floating_ip** — Assign the first available floating IP from a network to a port.
If none are available, create a new one and assign it.
- **get_routers** — Get the list of Routers with optional filtering.
- **create_router** — Create a new Router.
Typical use-cases:
- Create basic router: name="r1" (defaults to admin_state_up=True)
- Create distributed router: is_distributed=True
- Create with external gateway for north-south traffic:
  external_gateway_info={"network_id": "ext-net", "enable_snat": True,
  "external_fixed_ips": [{"subnet_id": "ext-subnet", "ip_address": "203.0.113.10"}]}
- Create with project ownership: project_id="proj-1"
Notes:
- external_gateway_info should follow Neutron schema: at minimum include
  "network_id"; optional keys include "enable_snat" and "external_fixed_ips".
- **get_router_detail** — Get detailed information about a specific Router.
- **update_router** — Update Router attributes atomically. Only provided parameters are changed;
omitted parameters remain untouched.
Typical use-cases:
- Rename and change description: name="r-new", description="d".
- Toggle admin state: read current via get_router_detail(); pass inverted bool to is_admin_state_up.
- Set distributed flag: is_distributed=True or False.
- Set external gateway: external_gateway_info={"network_id": "ext-net", "enable_snat": True, "external_fixed_ips": [...]}.
- Clear external gateway: clear_external_gateway=True (takes precedence over external_gateway_info).
- Replace static routes: routes=[{"destination": "192.0.2.0/24", "nexthop": "10.0.0.1"}]. Pass [] to remove all routes.
Notes:
- For list-typed fields (routes), the provided list replaces the entire list on the server.
- To clear external gateway, use clear_external_gateway=True. If both provided, clear_external_gateway takes precedence.
- **delete_router** — Delete a Router.
- **add_router_interface** — Add an interface to a Router by subnet or port.
Provide either subnet_id or port_id.
- **get_router_interfaces** — List interfaces attached to a Router.
- **remove_router_interface** — Remove an interface from a Router by subnet or port.
Provide either subnet_id or port_id.
- **get_security_groups** — Get the list of Security Groups with optional filtering.
- **create_security_group** — Create a new Security Group.
- **get_security_group_detail** — Get detailed information about a specific Security Group.
- **update_security_group** — Update an existing Security Group.
- **delete_security_group** — Delete a Security Group.
- **get_volumes** — Get the list of Block Storage volumes.

:return: A list of Volume objects representing the volumes.
- **get_volume_details** — Get detailed information about a specific volume.
- **create_volume** — Create a new volume.
- **delete_volume** — Delete a volume.
- **extend_volume** — Extend a volume to a new size.
- **get_attachment_details** — Get detailed information about a specific attachment.
- **get_attachments** — Get the list of attachments.
- **get_cloud_config** — Provide cloud configuration with secrets masked of current user's config file.

:return: Cloud configuration dictionary with credentials masked.
- **get_cloud_names** — List available cloud configurations.

:return: Names of OpenStack clouds from user's config file.
- **get_cloud_name** — Return the currently selected cloud name.

:return: current OpenStack cloud name.
- **set_cloud_name** — Set cloud name to use for later connections. Must set name from currently valid cloud config file.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `uvx` (confidence: high):

```json
"mcpServers": {
  "python-openstackmcp-server": {
    "command": "uvx",
    "args": ["python-openstackmcp-server"],
    "env": {
      "OS_CLIENT_CONFIG_FILE": ""
    }
  }
}
```

**Requires environment variables:** `OS_CLIENT_CONFIG_FILE` — the values above are empty placeholders; fill in real credentials before running (see the repository for what each one is for).

## Documentation

## What openstack-kr/python-openstackmcp-server MCP server does

The openstack-kr/python-openstackmcp-server MCP server exposes OpenStack infrastructure operations as MCP tools for AI assistants. It is aimed at environments where an assistant needs to inspect or change cloud resources rather than only answer questions about them.

The available operations include listing, retrieving, creating, updating, and deleting compute servers, depending on the resource and tool. Server tools also support actions, attaching and detaching volumes, and updating a server's name, hostname, or description. Flavor tools list the available server hardware configurations.

Image tools retrieve individual images, list images with optional filters, create images, and delete images. Image creation can use a volume or an OpenStack image import method. Supported import methods include glance-direct, web-download, copy-image, and glance-download; some methods require additional image location or source details.

Identity-related tools cover regions, domains, and projects. For each of these resource types, the material lists retrieval and collection operations plus create, update, and delete operations where applicable. Network support includes listing networks with optional filtering and creating networks.

## How it works

An MCP-compatible AI client communicates with the server using the Model Context Protocol. The server uses openstacksdk to communicate with the OpenStack cloud through its REST API. This separates the assistant-facing tool interface from the cloud service calls.

The server reads OpenStack connection details from a clouds.yaml file. The documented configuration includes an authentication URL, username, password, project name, domain settings, region, interface, and Identity API version. The selected cloud configuration is supplied through the OS_CLIENT_CONFIG_FILE environment variable.

Operations that change infrastructure should be treated as administrative actions: creating or deleting servers, images, regions, domains, or projects can alter the cloud state. The available tools make those operations callable by the connected MCP client, subject to the permissions of the configured OpenStack credentials.

## Setup and configuration

The documented setup requires Python 3.10 or newer, OpenStack credentials in clouds.yaml, and an installed Claude Desktop client. Configure a cloud entry with the authentication and region values appropriate for the target OpenStack deployment.

Claude Desktop can launch the server with either a Python command or uvx. The documented uvx configuration uses the `python-openstackmcp-server` package and sets `OS_CLIENT_CONFIG_FILE` to the path of the clouds.yaml file. The Python example uses the same package as an argument to the configured Python executable.

The Claude Desktop configuration file location depends on the operating system:

- macOS: `$HOME/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\\Claude\\Claude_desktop_config.json`
- Linux: `$HOME/.config/Claude/claude_desktop_config.json`

Replace the example paths and credential values with paths and values from the local environment before starting the client.

## Limitations and notes

The provided material documents a focused set of OpenStack services rather than every OpenStack API. In particular, the listed tools cover compute, images, identity resources, networks, and volume attachment operations. It does not establish support for other service families or for every operation within those services.

Image filtering is optional: all available images are returned when no filter values are provided, and filters are applied only when the caller supplies them. Image imports also have method-specific requirements. Web downloads need a reachable image URI, while glance-download needs a Glance region and image ID; the import_options field is required for image creation without a volume.

The openstack-kr/python-openstackmcp-server MCP server depends on valid OpenStack credentials and permissions. The README does not describe hosted access, OAuth, a web endpoint, or a separate managed service. It identifies the project as licensed under Apache License 2.0.

_Full upstream README: https://allmcps.com/mcp/openstack-kr-python-openstackmcp-server/readme_

