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.
Files changed (127) hide show
  1. {mcp_openstack_ops-3.4.0/src/mcp_openstack_ops.egg-info → mcp_openstack_ops-3.4.2}/PKG-INFO +3 -3
  2. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/README.md +1 -1
  3. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/pyproject.toml +2 -2
  4. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/mcp_main.py +37 -90
  5. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2/src/mcp_openstack_ops.egg-info}/PKG-INFO +3 -3
  6. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/requires.txt +1 -1
  7. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/LICENSE +0 -0
  8. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/MANIFEST.in +0 -0
  9. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/setup.cfg +0 -0
  10. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/__init__.py +0 -0
  11. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/__main__.py +0 -0
  12. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/connection.py +0 -0
  13. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/functions.py +0 -0
  14. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/__init__.py +0 -0
  15. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/compute.py +0 -0
  16. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/core.py +0 -0
  17. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/identity.py +0 -0
  18. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/image.py +0 -0
  19. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/__init__.py +0 -0
  20. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/amphorae.py +0 -0
  21. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/core.py +0 -0
  22. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/health_monitors.py +0 -0
  23. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/l7_policies.py +0 -0
  24. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/listeners.py +0 -0
  25. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/management.py +0 -0
  26. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/load_balancer/pools.py +0 -0
  27. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/monitoring.py +0 -0
  28. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/network.py +0 -0
  29. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/orchestration.py +0 -0
  30. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/services/storage.py +0 -0
  31. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/__init__.py +0 -0
  32. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_availability_zones.py +0 -0
  33. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_floating_ip_pools.py +0 -0
  34. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_floating_ips.py +0 -0
  35. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_heat_stacks.py +0 -0
  36. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_hypervisor_details.py +0 -0
  37. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_image_detail_list.py +0 -0
  38. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instance.py +0 -0
  39. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instance_by_name.py +0 -0
  40. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instance_details.py +0 -0
  41. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_instances_by_status.py +0 -0
  42. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_keypair_list.py +0 -0
  43. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_amphorae.py +0 -0
  44. {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
  45. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_details.py +0 -0
  46. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_flavors.py +0 -0
  47. {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
  48. {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
  49. {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
  50. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_list.py +0 -0
  51. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_listeners.py +0 -0
  52. {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
  53. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_pools.py +0 -0
  54. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_providers.py +0 -0
  55. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_load_balancer_quotas.py +0 -0
  56. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_network_details.py +0 -0
  57. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_project_details.py +0 -0
  58. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_quota.py +0 -0
  59. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_resource_monitoring.py +0 -0
  60. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_role_assignments.py +0 -0
  61. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_routers.py +0 -0
  62. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_security_groups.py +0 -0
  63. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_server_events.py +0 -0
  64. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_server_groups.py +0 -0
  65. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_server_volumes.py +0 -0
  66. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_service_status.py +0 -0
  67. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_usage_statistics.py +0 -0
  68. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_user_list.py +0 -0
  69. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_volume_list.py +0 -0
  70. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_volume_snapshots.py +0 -0
  71. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/get_volume_types.py +0 -0
  72. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/search_instances.py +0 -0
  73. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_alarms.py +0 -0
  74. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_compute_agents.py +0 -0
  75. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_domains.py +0 -0
  76. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_flavor.py +0 -0
  77. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_floating_ip.py +0 -0
  78. {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
  79. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_heat_stack.py +0 -0
  80. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_identity_groups.py +0 -0
  81. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image.py +0 -0
  82. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image_members.py +0 -0
  83. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image_metadata.py +0 -0
  84. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_image_visibility.py +0 -0
  85. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_instance.py +0 -0
  86. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_keypair.py +0 -0
  87. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer.py +0 -0
  88. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_amphora.py +0 -0
  89. {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
  90. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_flavor.py +0 -0
  91. {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
  92. {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
  93. {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
  94. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_listener.py +0 -0
  95. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_pool.py +0 -0
  96. {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
  97. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_load_balancer_quota.py +0 -0
  98. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_metrics.py +0 -0
  99. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_network_agents.py +0 -0
  100. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_network_ports.py +0 -0
  101. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_network_qos_policies.py +0 -0
  102. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_networks.py +0 -0
  103. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_project.py +0 -0
  104. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_quota.py +0 -0
  105. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_roles.py +0 -0
  106. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_backup.py +0 -0
  107. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_dump.py +0 -0
  108. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_fixed_ip.py +0 -0
  109. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_floating_ip.py +0 -0
  110. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_group.py +0 -0
  111. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_migration.py +0 -0
  112. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_network.py +0 -0
  113. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_properties.py +0 -0
  114. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_security_group.py +0 -0
  115. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_server_volume.py +0 -0
  116. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_service_logs.py +0 -0
  117. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_services.py +0 -0
  118. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_snapshot.py +0 -0
  119. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_subnets.py +0 -0
  120. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume.py +0 -0
  121. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume_backups.py +0 -0
  122. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume_groups.py +0 -0
  123. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops/tools/set_volume_qos.py +0 -0
  124. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/SOURCES.txt +0 -0
  125. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/dependency_links.txt +0 -0
  126. {mcp_openstack_ops-3.4.0 → mcp_openstack_ops-3.4.2}/src/mcp_openstack_ops.egg-info/entry_points.txt +0 -0
  127. {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.0
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.9.0,>=4.1.0
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=your-secure-secret-key-here
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=your-secure-secret-key-here
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.0"
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.9.0",
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
- # Check environment variables for authentication early
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
- # Initialize the main MCP instance with authentication if configured
159
- if _auth_enable and _secret_key:
160
- logger.info("Initializing MCP instance with Bearer token authentication (from environment)")
161
-
162
- # Create token configuration
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
- _secret_key: {
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
- auth = StaticTokenVerifier(tokens=tokens)
173
- mcp = FastMCP("mcp-openstack-ops", auth=auth)
174
- logger.info("MCP instance initialized with authentication")
175
- else:
176
- logger.info("Initializing MCP instance without authentication")
177
- mcp = FastMCP("mcp-openstack-ops")
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.add_argument(
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
- help="Enable Bearer token authentication for streamable-http mode. Default: False",
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
- auth_enable = args.auth_enable or os.getenv("REMOTE_AUTH_ENABLE", "false").lower() in ("true", "1", "yes", "on")
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
- # Note: MCP instance with authentication is already initialized at module level
488
- # based on environment variables. CLI arguments will override if different.
489
- if auth_enable != _auth_enable or secret_key != _secret_key:
490
- logger.warning("CLI authentication settings differ from environment variables.")
491
- logger.warning("Environment settings take precedence during module initialization.")
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.0
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.9.0,>=4.1.0
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=your-secure-secret-key-here
1020
+ REMOTE_SECRET_KEY=my-test-secret-key-12345
1021
1021
  ```
1022
1022
 
1023
1023
  **Or via CLI:**
@@ -1,5 +1,5 @@
1
1
  fastmcp>=2.12.3
2
- openstacksdk<=4.9.0,>=4.1.0
2
+ openstacksdk<=4.10.0,>=4.1.0
3
3
  python-dotenv>=1.1.1
4
4
 
5
5
  [dev]