servers / python-openstackmcp-server
python-openstackmcp-server MCP server
communitystdiolocaldestructive capablehealthy
openstack mcp server
01Tools · 75
How to read this: tool names here are observed from a live tools/list handshake. The Risk label is a heuristic inferred from the tool name (write/destructive verbs), not from executing the tool — a conservative guess, not a verified capability. We never escalate risk from a description. Found one that's wrong? Tell us — we fix on report.
| Tool | Risk | Side effects | Approval |
|---|---|---|---|
| get_server Get a specific Compute server. | read | false | unknown |
| get_servers Get the list of Compute servers.
:return: A list of Server objects. | read | false | unknown |
| delete_region Delete a region. | destructive | true | true |
| get_project Get a project. | read | false | unknown |
| delete_network Delete a Network. | destructive | true | true |
| get_port_detail Get detailed information about a specific Port. | read | false | unknown |
| get_domains Get the list of Identity domains.
:return: A list of Domain objects representing the domains. | read | false | unknown |
| delete_project Delete a project. | destructive | true | true |
| get_network_detail Get detailed information about a specific Network. | read | false | unknown |
| get_ports Get the list of Ports with optional filtering. | read | false | unknown |
| delete_port Delete a Port. | destructive | true | true |
| delete_domain Delete a domain. | destructive | true | true |
| delete_subnet Delete a Subnet. | destructive | true | true |
| delete_floating_ip Delete a Floating IP. | destructive | true | true |
| delete_router Delete a Router. | destructive | true | true |
| delete_security_group Delete a Security Group. | destructive | true | true |
| delete_volume Delete a volume. | destructive | true | true |
| get_cloud_config Provide cloud configuration with secrets masked of current user's config file.
:return: Cloud configuration dictionary with credentials masked. | read | false | unknown |
| get_router_interfaces List interfaces attached to a Router. | read | false | unknown |
| get_security_group_detail Get detailed information about a specific Security Group. | read | false | unknown |
| get_volume_details Get detailed information about a specific volume. | read | false | unknown |
| get_attachment_details Get detailed information about a specific attachment. | read | false | unknown |
| get_cloud_name Return the currently selected cloud name.
:return: current OpenStack cloud name. | read | false | unknown |
| create_region Create a new region. | write | true | unknown |
| get_port_allowed_address_pairs Get allowed address pairs configured on a port. | read | false | unknown |
| remove_router_interface Remove an interface from a Router by subnet or port.
Provide either subnet_id or port_id. | destructive | true | true |
| get_domain Get a domain. | read | false | unknown |
| 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. | read | false | unknown |
| 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. | write | true | unknown |
| 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` | read | false | unknown |
| create_subnet Create a new Subnet. | write | true | unknown |
| 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=[] | write | true | unknown |
| 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. | write | true | unknown |
| 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. | write | true | unknown |
| 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". | write | true | unknown |
| add_router_interface Add an interface to a Router by subnet or port.
Provide either subnet_id or port_id. | write | true | unknown |
| get_cloud_names List available cloud configurations.
:return: Names of OpenStack clouds from user's config file. | read | false | unknown |
| get_router_detail Get detailed information about a specific Router. | read | false | unknown |
| 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. | write | true | unknown |
| set_cloud_name Set cloud name to use for later connections. Must set name from currently valid cloud config file. | write | true | unknown |
| get_flavors Get flavors (server hardware configurations).
:return: A list of Flavor objects. | read | false | unknown |
| delete_image Delete an OpenStack image. | destructive | true | true |
| create_domain Create a new domain. | write | true | unknown |
| get_projects Get the list of Identity projects.
:return: A list of Project objects representing the projects. | read | false | unknown |
| get_volumes Get the list of Block Storage volumes.
:return: A list of Volume objects representing the volumes. | read | false | unknown |
| create_floating_ips_bulk Create multiple floating IPs on the specified external network. | write | true | unknown |
| delete_server Delete a Compute server. | destructive | true | true |
| get_image Get an OpenStack image by ID. | read | false | unknown |
| detach_volume Detach a volume from a Compute server. | unknown | unknown | unknown |
| 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. | write | true | unknown |
| update_server Update a Compute server's name, hostname, or description. | write | true | unknown |
| create_network Create a new Network. | write | true | unknown |
| update_network Update an existing Network. | write | true | unknown |
| 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"]` | write | true | unknown |
| set_port_binding Set binding attributes for a port. | write | true | unknown |
| action_server Perform an action on a Compute server. | unknown | unknown | unknown |
| attach_volume Attach a volume to a Compute server. | unknown | unknown | unknown |
| get_subnet_detail Get detailed information about a specific Subnet. | read | false | unknown |
| get_routers Get the list of Routers with optional filtering. | read | false | unknown |
| get_regions Get the list of Identity regions.
:return: A list of Region objects representing the regions. | read | false | unknown |
| update_region Update a region. | write | true | unknown |
| create_project Create a new project. | write | true | unknown |
| extend_volume Extend a volume to a new size. | unknown | unknown | unknown |
| get_attachments Get the list of attachments. | read | false | unknown |
| get_security_groups Get the list of Security Groups with optional filtering. | read | false | unknown |
| update_security_group Update an existing Security Group. | write | true | unknown |
| create_security_group Create a new Security Group. | write | true | unknown |
| create_server Create a new Compute server. | write | true | unknown |
| update_project Update a project. | write | true | unknown |
| get_floating_ips Get the list of Floating IPs with optional filtering. | read | false | unknown |
| create_port Create a new Port. | write | true | unknown |
| get_networks Get the list of Networks with optional filtering. | read | false | unknown |
| get_region Get a region. | read | false | unknown |
| update_domain Update a domain. | write | true | unknown |
| create_volume Create a new volume. | write | true | unknown |
02Install & source
uvx python-openstackmcp-server
uvx- repohttps://github.com/openstack-kr/python-openstackmcp-server
- licenseApache-2.0
- adoption20 stars · 8 forks
03Access granted
Generate images · writeMaps & location · write
The access this server can exercise, inferred from its verified tools — not a declared OAuth scope.
05Provenance & freshness
sourcesGitHub repo search [p4]
last_checked2026-08-16 11:20Z
next_check2026-08-18 11:12Z
cadenceevery 48h
verifiedtools_list:passed handshake:passed metadata:passed tools_list:passed handshake:passed metadata:passed tools_list:passed handshake:passed metadata:passed tools_list:passed
index_statusindex — 9 unique facts >= 5
06Badge
Add the “as seen on MCPExplorer” badge to your README.
[](https://mcpexplorer.com/servers/python-openstackmcp-server)
Next step
This is one server. A loadout combines the right servers, governance, and proven plays for a whole job — assembled deliberately, not tool-dumped.
Explore loadouts →