mcp-openstack-ops 3.4.0__tar.gz → 3.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mcp_openstack_ops-3.4.0/src/mcp_openstack_ops.egg-info → mcp_openstack_ops-3.4.2}/PKG-INFO +3 -3
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/README.md +1 -1
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/pyproject.toml +2 -2
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/mcp_main.py +37 -90
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2/src/mcp_openstack_ops.egg-info}/PKG-INFO +3 -3
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/requires.txt +1 -1
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/LICENSE +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/MANIFEST.in +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/setup.cfg +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/__init__.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/__main__.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/connection.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/functions.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/__init__.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/compute.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/core.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/identity.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/image.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/__init__.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/amphorae.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/core.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/health_monitors.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/l7_policies.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/listeners.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/management.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/pools.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/monitoring.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/network.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/orchestration.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/storage.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/__init__.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_availability_zones.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_floating_ip_pools.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_floating_ips.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_heat_stacks.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_hypervisor_details.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_image_detail_list.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instance.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instance_by_name.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instance_details.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instances_by_status.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_keypair_list.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_amphorae.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_availability_zones.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_details.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_flavors.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_health_monitors.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_l7_policies.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_l7_rules.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_list.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_listeners.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_pool_members.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_pools.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_providers.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_quotas.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_network_details.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_project_details.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_quota.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_resource_monitoring.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_role_assignments.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_routers.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_security_groups.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_server_events.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_server_groups.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_server_volumes.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_service_status.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_usage_statistics.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_user_list.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_volume_list.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_volume_snapshots.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_volume_types.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/search_instances.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_alarms.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_compute_agents.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_domains.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_flavor.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_floating_ip.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_floating_ip_port_forwarding.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_heat_stack.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_identity_groups.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image_members.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image_metadata.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image_visibility.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_instance.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_keypair.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_amphora.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_availability_zone.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_flavor.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_health_monitor.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_l7_policy.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_l7_rule.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_listener.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_pool.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_pool_member.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_quota.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_metrics.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_network_agents.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_network_ports.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_network_qos_policies.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_networks.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_project.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_quota.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_roles.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_backup.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_dump.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_fixed_ip.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_floating_ip.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_group.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_migration.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_network.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_properties.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_security_group.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_volume.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_service_logs.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_services.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_snapshot.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_subnets.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume_backups.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume_groups.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume_qos.py +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/SOURCES.txt +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/dependency_links.txt +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/entry_points.txt +0 -0
- {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/top_level.txt +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-openstack-ops
|
|
3
|
-
Version: 3.4.
|
|
3
|
+
Version: 3.4.2
|
|
4
4
|
Summary: OpenStack operations automation MCP server
|
|
5
5
|
Author-email: JungJungIn <call518@gmail.com>
|
|
6
6
|
Requires-Python: >=3.12
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
License-File: LICENSE
|
|
9
9
|
Requires-Dist: fastmcp>=2.12.3
|
|
10
|
-
Requires-Dist: openstacksdk<=4.
|
|
10
|
+
Requires-Dist: openstacksdk<=4.10.0,>=4.1.0
|
|
11
11
|
Requires-Dist: python-dotenv>=1.1.1
|
|
12
12
|
Provides-Extra: dev
|
|
13
13
|
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
@@ -1017,7 +1017,7 @@ For `streamable-http` mode, this MCP server supports Bearer token authentication
|
|
|
1017
1017
|
```bash
|
|
1018
1018
|
# In .env file
|
|
1019
1019
|
REMOTE_AUTH_ENABLE=true
|
|
1020
|
-
REMOTE_SECRET_KEY=
|
|
1020
|
+
REMOTE_SECRET_KEY=my-test-secret-key-12345
|
|
1021
1021
|
```
|
|
1022
1022
|
|
|
1023
1023
|
**Or via CLI:**
|
|
@@ -1001,7 +1001,7 @@ For `streamable-http` mode, this MCP server supports Bearer token authentication
|
|
|
1001
1001
|
```bash
|
|
1002
1002
|
# In .env file
|
|
1003
1003
|
REMOTE_AUTH_ENABLE=true
|
|
1004
|
-
REMOTE_SECRET_KEY=
|
|
1004
|
+
REMOTE_SECRET_KEY=my-test-secret-key-12345
|
|
1005
1005
|
```
|
|
1006
1006
|
|
|
1007
1007
|
**Or via CLI:**
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mcp-openstack-ops"
|
|
3
|
-
version = "3.4.
|
|
3
|
+
version = "3.4.2"
|
|
4
4
|
description = "OpenStack operations automation MCP server"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
authors = [{ name = "JungJungIn", email = "call518@gmail.com" }]
|
|
8
8
|
dependencies = [
|
|
9
9
|
"fastmcp>=2.12.3",
|
|
10
|
-
"openstacksdk>=4.1.0,<=4.
|
|
10
|
+
"openstacksdk>=4.1.0,<=4.10.0",
|
|
11
11
|
"python-dotenv>=1.1.1",
|
|
12
12
|
]
|
|
13
13
|
|
|
@@ -151,30 +151,27 @@ logger = logging.getLogger("OpenStackService")
|
|
|
151
151
|
# Authentication Setup
|
|
152
152
|
# =============================================================================
|
|
153
153
|
|
|
154
|
-
|
|
155
|
-
_auth_enable = os.environ.get("REMOTE_AUTH_ENABLE", "false").lower() == "true"
|
|
156
|
-
_secret_key = os.environ.get("REMOTE_SECRET_KEY", "")
|
|
154
|
+
TRUTHY_VALUES = ("true", "1", "yes", "on")
|
|
157
155
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
156
|
+
|
|
157
|
+
def _parse_bool_env(value: str) -> bool:
|
|
158
|
+
return value.strip().lower() in TRUTHY_VALUES
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _build_static_token_auth(secret_key: str) -> StaticTokenVerifier:
|
|
163
162
|
tokens = {
|
|
164
|
-
|
|
163
|
+
secret_key: {
|
|
165
164
|
"client_id": "openstack-ops-client",
|
|
166
|
-
"user": "admin",
|
|
167
165
|
"scopes": ["read", "write"],
|
|
168
|
-
"description": "OpenStack operations access token"
|
|
169
166
|
}
|
|
170
167
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
168
|
+
return StaticTokenVerifier(tokens=tokens)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# Initialize MCP instance once for decorator registration.
|
|
172
|
+
# Runtime authentication is configured in main() before mcp.run().
|
|
173
|
+
logger.info("Initializing MCP instance")
|
|
174
|
+
mcp = FastMCP("mcp-openstack-ops")
|
|
178
175
|
|
|
179
176
|
# =============================================================================
|
|
180
177
|
# Safety Control Functions
|
|
@@ -413,8 +410,9 @@ def main(argv: Optional[List[str]] = None) -> None:
|
|
|
413
410
|
parser.add_argument(
|
|
414
411
|
"--type",
|
|
415
412
|
dest="transport_type",
|
|
416
|
-
help="Transport type (stdio or streamable-http). Default: stdio",
|
|
413
|
+
help="Transport type (stdio or streamable-http). Default: env FASTMCP_TYPE or stdio",
|
|
417
414
|
choices=["stdio", "streamable-http"],
|
|
415
|
+
default=None,
|
|
418
416
|
)
|
|
419
417
|
parser.add_argument(
|
|
420
418
|
"--host",
|
|
@@ -427,11 +425,20 @@ def main(argv: Optional[List[str]] = None) -> None:
|
|
|
427
425
|
type=int,
|
|
428
426
|
help="Port number for streamable-http transport. Default: 8080",
|
|
429
427
|
)
|
|
430
|
-
parser.
|
|
428
|
+
auth_group = parser.add_mutually_exclusive_group()
|
|
429
|
+
auth_group.add_argument(
|
|
431
430
|
"--auth-enable",
|
|
432
431
|
dest="auth_enable",
|
|
433
432
|
action="store_true",
|
|
434
|
-
|
|
433
|
+
default=None,
|
|
434
|
+
help="Enable Bearer token authentication for streamable-http mode.",
|
|
435
|
+
)
|
|
436
|
+
auth_group.add_argument(
|
|
437
|
+
"--auth-disable",
|
|
438
|
+
dest="auth_enable",
|
|
439
|
+
action="store_false",
|
|
440
|
+
default=None,
|
|
441
|
+
help="Disable Bearer token authentication for streamable-http mode.",
|
|
435
442
|
)
|
|
436
443
|
parser.add_argument(
|
|
437
444
|
"--secret-key",
|
|
@@ -468,7 +475,10 @@ def main(argv: Optional[List[str]] = None) -> None:
|
|
|
468
475
|
port = args.port or int(os.getenv("FASTMCP_PORT", 8080))
|
|
469
476
|
|
|
470
477
|
# Authentication setting determination
|
|
471
|
-
|
|
478
|
+
if args.auth_enable is None:
|
|
479
|
+
auth_enable = _parse_bool_env(os.getenv("REMOTE_AUTH_ENABLE", "false"))
|
|
480
|
+
else:
|
|
481
|
+
auth_enable = args.auth_enable
|
|
472
482
|
secret_key = args.secret_key or os.getenv("REMOTE_SECRET_KEY", "")
|
|
473
483
|
|
|
474
484
|
# Validation for streamable-http mode with authentication
|
|
@@ -484,11 +494,11 @@ def main(argv: Optional[List[str]] = None) -> None:
|
|
|
484
494
|
logger.warning("This server will accept requests without Bearer token verification.")
|
|
485
495
|
logger.warning("Set REMOTE_AUTH_ENABLE=true and REMOTE_SECRET_KEY to enable authentication.")
|
|
486
496
|
|
|
487
|
-
#
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
497
|
+
# Configure authentication provider before server startup.
|
|
498
|
+
if auth_enable:
|
|
499
|
+
mcp.auth = _build_static_token_auth(secret_key)
|
|
500
|
+
else:
|
|
501
|
+
mcp.auth = None
|
|
492
502
|
|
|
493
503
|
# Execution based on transport mode
|
|
494
504
|
if transport_type == "streamable-http":
|
|
@@ -512,66 +522,3 @@ if __name__ == "__main__":
|
|
|
512
522
|
except Exception as e:
|
|
513
523
|
logger.error(f"Failed to start server: {e}")
|
|
514
524
|
sys.exit(1)
|
|
515
|
-
|
|
516
|
-
if __name__ == "__main__":
|
|
517
|
-
import asyncio
|
|
518
|
-
|
|
519
|
-
parser = argparse.ArgumentParser(description="OpenStack MCP Server")
|
|
520
|
-
parser.add_argument("--log-level", choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
|
|
521
|
-
default=os.environ.get("MCP_LOG_LEVEL", "INFO"), help="Logging level")
|
|
522
|
-
parser.add_argument("--type", choices=["stdio", "streamable-http"], default="stdio",
|
|
523
|
-
help="Transport type (default: stdio)")
|
|
524
|
-
parser.add_argument("--host", default="127.0.0.1", help="Host address for HTTP transport (default: 127.0.0.1)")
|
|
525
|
-
parser.add_argument("--port", type=int, default=8080, help="Port number for HTTP transport (default: 8080)")
|
|
526
|
-
parser.add_argument("--auth-enable", action="store_true",
|
|
527
|
-
help="Enable Bearer token authentication for streamable-http mode")
|
|
528
|
-
parser.add_argument("--secret-key", help="Secret key for Bearer token authentication")
|
|
529
|
-
|
|
530
|
-
args = parser.parse_args()
|
|
531
|
-
|
|
532
|
-
# Set log level (CLI overrides environment)
|
|
533
|
-
logger.setLevel(args.log_level)
|
|
534
|
-
|
|
535
|
-
# Update authentication if provided via CLI
|
|
536
|
-
if args.auth_enable and args.secret_key:
|
|
537
|
-
logger.info("Authentication enabled via CLI arguments")
|
|
538
|
-
|
|
539
|
-
tokens = {
|
|
540
|
-
args.secret_key: {
|
|
541
|
-
"client_id": "openstack-ops-client",
|
|
542
|
-
"user": "admin",
|
|
543
|
-
"scopes": ["read", "write"],
|
|
544
|
-
"description": "CLI-provided access token"
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
auth = StaticTokenVerifier(tokens=tokens)
|
|
549
|
-
# Note: CLI auth override requires server restart to take full effect
|
|
550
|
-
logger.warning("CLI auth override requires server restart to take full effect")
|
|
551
|
-
|
|
552
|
-
# Validate OpenStack connection early
|
|
553
|
-
try:
|
|
554
|
-
conn = get_openstack_connection()
|
|
555
|
-
logger.info("✓ OpenStack connection validated successfully")
|
|
556
|
-
except Exception as e:
|
|
557
|
-
logger.error(f"✗ Failed to connect to OpenStack: {e}")
|
|
558
|
-
logger.error("Please check your OpenStack credentials in .env file")
|
|
559
|
-
sys.exit(1)
|
|
560
|
-
|
|
561
|
-
logger.info(f"Starting MCP server with {args.type} transport")
|
|
562
|
-
logger.info(f"Log level set via {'CLI' if 'log-level' in sys.argv else 'environment'} to {args.log_level}")
|
|
563
|
-
logger.info(f"Modify operations allowed: {_is_modify_operation_allowed()}")
|
|
564
|
-
|
|
565
|
-
# Get auth status for logging
|
|
566
|
-
auth_enabled = _auth_enable or (args.auth_enable and args.secret_key)
|
|
567
|
-
logger.info(f"Authentication: {'Enabled' if auth_enabled else 'Disabled'}")
|
|
568
|
-
|
|
569
|
-
if args.type == "stdio":
|
|
570
|
-
logger.info("MCP server running with stdio transport")
|
|
571
|
-
mcp.run()
|
|
572
|
-
elif args.type == "streamable-http":
|
|
573
|
-
logger.info(f"MCP server running with HTTP transport on {args.host}:{args.port}")
|
|
574
|
-
mcp.run(transport="streamable-http", host=args.host, port=args.port)
|
|
575
|
-
else:
|
|
576
|
-
logger.error(f"Unknown transport type: {args.type}")
|
|
577
|
-
sys.exit(1)
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-openstack-ops
|
|
3
|
-
Version: 3.4.
|
|
3
|
+
Version: 3.4.2
|
|
4
4
|
Summary: OpenStack operations automation MCP server
|
|
5
5
|
Author-email: JungJungIn <call518@gmail.com>
|
|
6
6
|
Requires-Python: >=3.12
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
License-File: LICENSE
|
|
9
9
|
Requires-Dist: fastmcp>=2.12.3
|
|
10
|
-
Requires-Dist: openstacksdk<=4.
|
|
10
|
+
Requires-Dist: openstacksdk<=4.10.0,>=4.1.0
|
|
11
11
|
Requires-Dist: python-dotenv>=1.1.1
|
|
12
12
|
Provides-Extra: dev
|
|
13
13
|
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
@@ -1017,7 +1017,7 @@ For `streamable-http` mode, this MCP server supports Bearer token authentication
|
|
|
1017
1017
|
```bash
|
|
1018
1018
|
# In .env file
|
|
1019
1019
|
REMOTE_AUTH_ENABLE=true
|
|
1020
|
-
REMOTE_SECRET_KEY=
|
|
1020
|
+
REMOTE_SECRET_KEY=my-test-secret-key-12345
|
|
1021
1021
|
```
|
|
1022
1022
|
|
|
1023
1023
|
**Or via CLI:**
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/__init__.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/compute.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/identity.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/monitoring.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/network.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/orchestration.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/storage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_floating_ips.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_heat_stacks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instance.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_keypair_list.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_quota.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_routers.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_server_events.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_server_groups.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_user_list.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_volume_list.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_volume_types.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/search_instances.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_alarms.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_domains.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_flavor.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_floating_ip.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_heat_stack.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image_members.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_instance.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_keypair.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_metrics.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_network_ports.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_networks.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_project.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_quota.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_roles.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_backup.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_dump.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_group.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_volume.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_service_logs.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_services.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_snapshot.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_subnets.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume_groups.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume_qos.py
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/top_level.txt
RENAMED
|
File without changes
|