mcp-openstack-ops 3.5.7__tar.gz → 3.5.9__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 (185) hide show
  1. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/PKG-INFO +54 -34
  2. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/README.md +52 -32
  3. mcp_openstack_ops-3.5.9/docs/integration-validation.md +64 -0
  4. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/pyproject.toml +1 -1
  5. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/connection.py +10 -2
  6. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/functions.py +68 -213
  7. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/prompt_template.md +38 -20
  8. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/services/alarms.py +107 -0
  9. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/identity.py +63 -3
  10. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/image.py +9 -15
  11. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/monitoring.py +186 -113
  12. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/network.py +140 -4
  13. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/orchestration.py +32 -1
  14. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/storage.py +165 -201
  15. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_domains.py +11 -0
  16. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_heat_stack_details.py +12 -0
  17. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_identity_groups.py +11 -0
  18. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_image_members.py +11 -0
  19. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_network_qos_policies.py +13 -0
  20. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_resource_monitoring.py +7 -5
  21. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_usage_statistics.py +7 -5
  22. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_volume_backups.py +11 -0
  23. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_volume_groups.py +11 -0
  24. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_volume_qos.py +11 -0
  25. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/get_volume_transfers.py +12 -0
  26. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_alarms.py +23 -6
  27. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_domains.py +3 -2
  28. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_floating_ip.py +1 -1
  29. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_identity_groups.py +3 -2
  30. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_metrics.py +2 -2
  31. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_network_qos_policies.py +3 -1
  32. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/set_routers.py +22 -0
  33. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/set_security_groups.py +22 -0
  34. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_service_logs.py +2 -2
  35. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/set_users.py +31 -0
  36. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_volume_backups.py +9 -5
  37. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_volume_groups.py +7 -2
  38. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops/tools/set_volume_types.py +22 -0
  39. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops.egg-info/PKG-INFO +54 -34
  40. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops.egg-info/SOURCES.txt +20 -1
  41. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops.egg-info/requires.txt +1 -1
  42. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops.egg-info/scm_file_list.json +19 -0
  43. mcp_openstack_ops-3.5.9/src/mcp_openstack_ops.egg-info/scm_version.json +8 -0
  44. mcp_openstack_ops-3.5.9/tests/test_connection.py +32 -0
  45. mcp_openstack_ops-3.5.9/tests/test_floating_ip.py +42 -0
  46. mcp_openstack_ops-3.5.9/tests/test_operational_tools.py +618 -0
  47. mcp_openstack_ops-3.5.9/tests/test_tool_registration.py +80 -0
  48. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/uv.lock +91 -59
  49. mcp_openstack_ops-3.5.7/src/mcp_openstack_ops.egg-info/scm_version.json +0 -8
  50. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.env.example +0 -0
  51. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.env.test +0 -0
  52. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.github/FUNDING.yml +0 -0
  53. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.github/copilot-instructions.md +0 -0
  54. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.github/dependabot.yml +0 -0
  55. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.github/workflows/pypi-publish.yml +0 -0
  56. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.gitignore +0 -0
  57. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.gitleaks.toml +0 -0
  58. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.pre-commit-config.yaml +0 -0
  59. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/.python-version +0 -0
  60. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/Dockerfile.MCP-Server +0 -0
  61. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/Dockerfile.MCPO-Proxy +0 -0
  62. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/LICENSE +0 -0
  63. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/MANIFEST.in +0 -0
  64. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/build-mcp-server-docker-image.sh +0 -0
  65. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/build-mcpo-server-docker-image.sh +0 -0
  66. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/diagnose_openstack.py +0 -0
  67. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/docker-compose.yml +0 -0
  68. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/img/MCP-Workflow-of-Quickstart-Tutorial.png +0 -0
  69. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/img/screenshot-claude-desktop.png +0 -0
  70. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/img/screenshot-claude-desktop.png:Zone.Identifier +0 -0
  71. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/img/screenshot-example-cluster-status.png +0 -0
  72. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/img/screenshot-openstack-dashboard.png +0 -0
  73. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/main.py +0 -0
  74. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/mcp-config.json.http +0 -0
  75. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/mcp-config.json.multi-project +0 -0
  76. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/mcp-config.json.stdio +0 -0
  77. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/scripts/check_release.py +0 -0
  78. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/scripts/mcp-server-docker-cmd.sh +0 -0
  79. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/scripts/publish_release.py +0 -0
  80. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/scripts/run-mcp-inspector-local.sh +0 -0
  81. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/scripts/run-mcp-inspector-pypi.sh +0 -0
  82. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/setup.cfg +0 -0
  83. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/__init__.py +0 -0
  84. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/__main__.py +0 -0
  85. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/mcp_main.py +0 -0
  86. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/__init__.py +0 -0
  87. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/compute.py +0 -0
  88. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/core.py +0 -0
  89. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/load_balancer/__init__.py +0 -0
  90. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/load_balancer/amphorae.py +0 -0
  91. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/load_balancer/core.py +0 -0
  92. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/load_balancer/health_monitors.py +0 -0
  93. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/load_balancer/l7_policies.py +0 -0
  94. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/load_balancer/listeners.py +0 -0
  95. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/load_balancer/management.py +0 -0
  96. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/services/load_balancer/pools.py +0 -0
  97. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/__init__.py +0 -0
  98. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_availability_zones.py +0 -0
  99. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_floating_ip_pools.py +0 -0
  100. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_floating_ips.py +0 -0
  101. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_heat_stacks.py +0 -0
  102. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_hypervisor_details.py +0 -0
  103. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_image_detail_list.py +0 -0
  104. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_instance.py +0 -0
  105. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_instance_by_name.py +0 -0
  106. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_instance_details.py +0 -0
  107. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_instances_by_status.py +0 -0
  108. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_keypair_list.py +0 -0
  109. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_amphorae.py +0 -0
  110. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_availability_zones.py +0 -0
  111. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_details.py +0 -0
  112. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_flavors.py +0 -0
  113. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_health_monitors.py +0 -0
  114. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_l7_policies.py +0 -0
  115. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_l7_rules.py +0 -0
  116. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_list.py +0 -0
  117. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_listeners.py +0 -0
  118. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_pool_members.py +0 -0
  119. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_pools.py +0 -0
  120. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_providers.py +0 -0
  121. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_load_balancer_quotas.py +0 -0
  122. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_network_details.py +0 -0
  123. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_project_details.py +0 -0
  124. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_quota.py +0 -0
  125. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_role_assignments.py +0 -0
  126. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_routers.py +0 -0
  127. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_security_groups.py +0 -0
  128. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_server_events.py +0 -0
  129. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_server_groups.py +0 -0
  130. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_server_volumes.py +0 -0
  131. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_service_status.py +0 -0
  132. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_user_list.py +0 -0
  133. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_volume_list.py +0 -0
  134. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_volume_snapshots.py +0 -0
  135. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/get_volume_types.py +0 -0
  136. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/search_instances.py +0 -0
  137. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_compute_agents.py +0 -0
  138. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_flavor.py +0 -0
  139. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_floating_ip_port_forwarding.py +0 -0
  140. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_heat_stack.py +0 -0
  141. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_image.py +0 -0
  142. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_image_members.py +0 -0
  143. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_image_metadata.py +0 -0
  144. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_image_visibility.py +0 -0
  145. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_instance.py +0 -0
  146. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_keypair.py +0 -0
  147. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer.py +0 -0
  148. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_amphora.py +0 -0
  149. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_availability_zone.py +0 -0
  150. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_flavor.py +0 -0
  151. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_health_monitor.py +0 -0
  152. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_l7_policy.py +0 -0
  153. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_l7_rule.py +0 -0
  154. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_listener.py +0 -0
  155. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_pool.py +0 -0
  156. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_pool_member.py +0 -0
  157. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_load_balancer_quota.py +0 -0
  158. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_network_agents.py +0 -0
  159. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_network_ports.py +0 -0
  160. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_networks.py +0 -0
  161. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_project.py +0 -0
  162. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_quota.py +0 -0
  163. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_roles.py +0 -0
  164. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_backup.py +0 -0
  165. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_dump.py +0 -0
  166. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_fixed_ip.py +0 -0
  167. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_floating_ip.py +0 -0
  168. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_group.py +0 -0
  169. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_migration.py +0 -0
  170. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_network.py +0 -0
  171. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_properties.py +0 -0
  172. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_security_group.py +0 -0
  173. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_server_volume.py +0 -0
  174. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_services.py +0 -0
  175. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_snapshot.py +0 -0
  176. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_subnets.py +0 -0
  177. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_volume.py +0 -0
  178. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops/tools/set_volume_qos.py +0 -0
  179. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops.egg-info/dependency_links.txt +0 -0
  180. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops.egg-info/entry_points.txt +0 -0
  181. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/src/mcp_openstack_ops.egg-info/top_level.txt +0 -0
  182. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/test_compatibility.sh +0 -0
  183. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/test_project_isolation.py +0 -0
  184. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/tests/test_publish_release.py +0 -0
  185. {mcp_openstack_ops-3.5.7 → mcp_openstack_ops-3.5.9}/tests/test_release.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-openstack-ops
3
- Version: 3.5.7
3
+ Version: 3.5.9
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.21.0,>=4.1.0
10
+ Requires-Dist: openstacksdk<=4.22.0,>=4.1.0
11
11
  Requires-Dist: python-dotenv>=1.1.1
12
12
  Requires-Dist: setuptools-scm>=10.0.5
13
13
  Requires-Dist: pre-commit>=4.6.0
@@ -20,6 +20,8 @@ Dynamic: license-file
20
20
 
21
21
  > **MCP OpenStack Operations Server**: A comprehensive MCP (Model Context Protocol) server providing OpenStack project management and monitoring capabilities with built-in safety controls and single-project scope.
22
22
 
23
+ [![MCPVault: claimed](https://mcpvault.io/badge/mcp-openstack-ops.svg?theme=dark)](https://mcpvault.io/servers/mcp-openstack-ops/health?utm_source=external_badge&utm_medium=referral&utm_campaign=mcp_health_report)
24
+
23
25
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
24
26
  ![Python](https://img.shields.io/badge/Python-3776AB?style=flat&logo=python&logoColor=white)
25
27
  ![Docker Pulls](https://img.shields.io/docker/pulls/call518/mcp-server-openstack-ops)
@@ -41,10 +43,10 @@ Dynamic: license-file
41
43
 
42
44
  - ✅ **Project-Scoped Operations**: Every tool enforces the configured `OS_PROJECT_NAME`, validating resource ownership so actions stay inside a single tenant.
43
45
  - ✅ **Safety-Gated Writes**: Modify (`set_*`) tooling only registers when `ALLOW_MODIFY_OPERATIONS=true`, keeping default deployments read-only and auditable.
44
- - ✅ **90+ Purpose-Built Tools**: Broad coverage across compute, networking, storage, images, identity, Heat, and Octavia load balancing tasks—all constrained to the current project.
46
+ - ✅ **90+ Purpose-Built Tools**: Broad coverage across compute, networking, storage, images, identity, Heat, and Octavia load balancing tasks. Project resources are scoped to the active project; cloud-wide administrative APIs remain subject to OpenStack policy.
45
47
  - ✅ **Bulk & Filtered Actions**: Instance, volume, network, image, snapshot, and keypair managers accept comma-delimited targets or filter criteria to orchestrate bulk changes intentionally.
46
48
  - ✅ **Post-Action Feedback & Async Guidance**: Mutating tools reuse a shared result handler that adds emoji status checks, asynchronous timing notes, and follow-up verification commands.
47
- - ✅ **Monitoring & Usage Insights**: `get_service_status`, `get_resource_monitoring`, `get_usage_statistics`, and quota tools surface service availability, utilization, and capacity for the active project.
49
+ - ✅ **Monitoring & Usage Insights**: `get_service_status`, `get_resource_monitoring`, `get_usage_statistics`, and quota tools report service probes, project allocations, separate quota limits, and API-backed compute allocation-hours. Live utilization and historical trends are not collected.
48
50
  - ✅ **Unified Instance Queries**: The `get_instance` tool consolidates name, ID, status, and free-form search paths with pagination plus summary/detailed modes.
49
51
  - ✅ **Server Insight & Audit Trail**: Dedicated tools expose server events, hypervisor details, availability zones, quotas, and resource ownership to speed diagnostics.
50
52
  - ✅ **Load Balancer Management**: Octavia tools cover listeners, pools, members, health monitors, flavors, quotas, and amphora operations with the same safety gates.
@@ -178,6 +180,11 @@ New consolidated `get_instance` tool replaces multiple separate tools:
178
180
 
179
181
  **Detailed Mapping by Category**
180
182
 
183
+ ✅ indicates an implemented API path, subject to cloud services and policy.
184
+ Live-validated paths and deployment limits are listed in
185
+ [integration validation](docs/integration-validation.md). Also see
186
+ [API prerequisites and result semantics](#api-prerequisites-and-result-semantics).
187
+
181
188
  ### 1. 🖥️ **Compute (Nova)**
182
189
 
183
190
  | OpenStack CLI Command | MCP Tool | Status | Notes |
@@ -242,7 +249,7 @@ New consolidated `get_instance` tool replaces multiple separate tools:
242
249
  | `openstack subnet list` | `get_network_details` (includes subnets) | ✅ | Subnet information included |
243
250
  | `openstack subnet create/delete` | `set_subnets` | ✅ | Subnet management |
244
251
  | `openstack router list` | `get_routers` | ✅ | Router listing |
245
- | `openstack router create/delete` | (Not yet implemented) | 🚧 | Router management |
252
+ | `openstack router create/delete` | `set_routers` | ✅ | Project-owned routers; attached interfaces are not removed automatically |
246
253
  | `openstack floating ip list` | `get_floating_ips` | ✅ | Floating IP listing |
247
254
  | `openstack floating ip create` | `set_floating_ip` (action="create") | ✅ | Floating IP creation |
248
255
  | `openstack floating ip delete` | `set_floating_ip` (action="delete") | ✅ | Floating IP deletion |
@@ -256,13 +263,13 @@ New consolidated `get_instance` tool replaces multiple separate tools:
256
263
  | `openstack floating ip port forwarding set` | `set_floating_ip_port_forwarding` (action="set") | ✅ | Port forwarding updates |
257
264
  | `openstack floating ip port forwarding show` | `set_floating_ip_port_forwarding` (action="show") | ✅ | Port forwarding details |
258
265
  | `openstack security group list` | `get_security_groups` | ✅ | Security group listing |
259
- | `openstack security group create/delete` | (Not yet implemented) | 🚧 | Security group management |
266
+ | `openstack security group create/delete` | `set_security_groups` | ✅ | Project-owned security groups |
260
267
  | `openstack port list` | `get_network_details` (includes ports) | ✅ | Port information included |
261
268
  | `openstack port create/delete` | `set_network_ports` | ✅ | Port management |
262
- | `openstack network qos policy list` | (Not yet implemented) | 🚧 | QoS policy listing |
263
- | `openstack network qos policy create` | `set_network_qos_policies` | ✅ | QoS policy management |
269
+ | `openstack network qos policy list` | `get_network_qos_policies` | ✅ | Current-project policy containers |
270
+ | `openstack network qos policy create` | `set_network_qos_policies` | ✅ | Create/list/delete policy containers; does not create bandwidth rules |
264
271
  | `openstack network agent list` | `get_service_status` (includes agents) | ✅ | Network agents |
265
- | `openstack network agent set` | `set_network_agents` | ✅ | Network agent management |
272
+ | `openstack network agent set` | `set_network_agents` | ✅ | Enable/disable cloud-wide agents; usually admin-only |
266
273
 
267
274
  ### 3. 💾 **Storage (Cinder)**
268
275
 
@@ -273,18 +280,18 @@ New consolidated `get_instance` tool replaces multiple separate tools:
273
280
  | `openstack volume create/delete` | `set_volume` | ✅ | Volume creation/deletion |
274
281
  | `openstack volume set` | `set_volume` (action="modify") | ✅ | Volume property modification |
275
282
  | `openstack volume type list` | `get_volume_types` | ✅ | Volume type listing |
276
- | `openstack volume type create/delete` | (Not yet implemented) | 🚧 | Volume type management |
283
+ | `openstack volume type create/delete` | `set_volume_types` | ✅ | Volume type management; usually admin-only |
277
284
  | `openstack volume snapshot list` | `get_volume_snapshots` | ✅ | Snapshot listing |
278
285
  | `openstack volume snapshot create/delete` | `set_snapshot` | ✅ | Snapshot management |
279
- | `openstack backup list` | (Not yet implemented) | 🚧 | Backup listing |
286
+ | `openstack backup list` | `get_volume_backups` | ✅ | Current-project backup listing |
280
287
  | `openstack backup create/delete` | `set_volume_backups` | ✅ | Volume backup management |
281
- | `openstack volume transfer request list` | (Not yet implemented) | 🚧 | Volume transfer |
288
+ | `openstack volume transfer request list` | `get_volume_transfers` | ✅ | Request listing only; authorization keys are excluded |
282
289
  | `openstack server volume list` | `get_server_volumes` | ✅ | Server volume listing |
283
290
  | `openstack server add/remove volume` | `set_server_volume` | ✅ | Server volume attach/detach |
284
- | `openstack volume group list` | (Not yet implemented) | 🚧 | Volume group listing |
285
- | `openstack volume group create` | `set_volume_groups` | ✅ | Volume group management |
286
- | `openstack volume qos list` | (Not yet implemented) | 🚧 | QoS listing |
287
- | `openstack volume qos create` | `set_volume_qos` | ✅ | QoS management |
291
+ | `openstack volume group list` | `get_volume_groups` | ✅ | Requires Cinder generic groups (API >= 3.13) |
292
+ | `openstack volume group create` | `set_volume_groups` | ✅ | Create/list/show/delete; create requires group_type and volume_types |
293
+ | `openstack volume qos list` | `get_volume_qos` | ✅ | Cinder QoS specifications; subject to cloud policy |
294
+ | `openstack volume qos create` | `set_volume_qos` | ✅ | Create/list/show/set/delete specifications; no automatic type association |
288
295
 
289
296
  ### 4. 🖼️ **Image (Glance)**
290
297
 
@@ -296,8 +303,8 @@ New consolidated `get_instance` tool replaces multiple separate tools:
296
303
  | `openstack image delete` | `set_image` (action="delete") | ✅ | Image deletion |
297
304
  | `openstack image set` | `set_image` (action="update") | ✅ | Image property modification |
298
305
  | `openstack image save` | `set_image` (action="save") | ✅ | Image download |
299
- | `openstack image add project` | (Not yet implemented) | 🚧 | Project sharing |
300
- | `openstack image member list` | (Not yet implemented) | 🚧 | Member listing |
306
+ | `openstack image add project` | `set_image_members` (action="add") | ✅ | Add a project to an image with shared visibility |
307
+ | `openstack image member list` | `get_image_members` | ✅ | Image member listing |
301
308
  | `openstack image member create` | `set_image_members` | ✅ | Image member management |
302
309
  | `openstack image set --property` | `set_image_metadata` | ✅ | Image metadata |
303
310
  | `openstack image set --public/private` | `set_image_visibility` | ✅ | Image visibility setting |
@@ -308,16 +315,16 @@ New consolidated `get_instance` tool replaces multiple separate tools:
308
315
  |---------------------|---------|------|------|
309
316
  | `openstack user list` | `get_user_list` | ✅ | User listing |
310
317
  | `openstack user show` | `get_user_list` (filtering) | ✅ | Specific user query |
311
- | `openstack user create/delete` | (Not yet implemented) | 🚧 | User management |
318
+ | `openstack user create/delete` | `set_users` | ✅ | Password from a server environment variable; no role grants |
312
319
  | `openstack project list` | `get_project_details` | ✅ | Project listing |
313
320
  | `openstack project show` | `get_project_details` (name param) | ✅ | Specific project query |
314
321
  | `openstack project create/delete` | `set_project` | ✅ | Project management |
315
322
  | `openstack role list` | `get_role_assignments` | ✅ | Role listing |
316
323
  | `openstack role assignment list` | `get_role_assignments` | ✅ | Role assignment listing |
317
324
  | `openstack role create/delete` | `set_roles` | ✅ | Role management |
318
- | `openstack domain list` | (Not yet implemented) | 🚧 | Domain listing |
319
- | `openstack domain create/delete` | `set_domains` | ✅ | Domain management |
320
- | `openstack group list` | (Not yet implemented) | 🚧 | Group listing |
325
+ | `openstack domain list` | `get_domains` | ✅ | Subject to Keystone policy |
326
+ | `openstack domain create/delete` | `set_domains` | ✅ | Disable explicitly with update before delete |
327
+ | `openstack group list` | `get_identity_groups` | ✅ | Subject to Keystone policy |
321
328
  | `openstack group create/delete` | `set_identity_groups` | ✅ | Group management |
322
329
  | `openstack service list` | `get_service_status` | ✅ | Service listing |
323
330
  | `openstack service create/delete` | `set_services` | ✅ | Service management |
@@ -333,10 +340,10 @@ New consolidated `get_instance` tool replaces multiple separate tools:
333
340
  | `openstack stack delete` | `set_heat_stack` (action="delete") | ✅ | Stack deletion |
334
341
  | `openstack stack update` | `set_heat_stack` (action="update") | ✅ | Stack update |
335
342
  | `openstack stack suspend/resume` | `set_heat_stack` | ✅ | Stack suspend/resume |
336
- | `openstack stack resource list` | (Not yet implemented) | 🚧 | Stack resource listing |
337
- | `openstack stack event list` | (Not yet implemented) | 🚧 | Stack event listing |
338
- | `openstack stack template show` | (Not yet implemented) | 🚧 | Template query |
339
- | `openstack stack output list` | (Not yet implemented) | 🚧 | Stack output listing |
343
+ | `openstack stack resource list` | `get_heat_stack_details` (section="resources") | ✅ | Actual Heat resources |
344
+ | `openstack stack event list` | `get_heat_stack_details` (section="events") | ✅ | Actual Heat events |
345
+ | `openstack stack template show` | `get_heat_stack_details` (section="template") | ✅ | Original template document |
346
+ | `openstack stack output list` | `get_heat_stack_details` (section="outputs") | ✅ | Resolved stack outputs |
340
347
 
341
348
  ### 7. ⚖️ **Load Balancer (Octavia)**
342
349
 
@@ -436,14 +443,14 @@ New consolidated `get_instance` tool replaces multiple separate tools:
436
443
 
437
444
  | OpenStack CLI Command | MCP Tool | Status | Notes |
438
445
  |---------------------|---------|------|------|
439
- | Resource monitoring | `get_resource_monitoring` | ✅ | Resource monitoring |
446
+ | Resource monitoring | `get_resource_monitoring` | ✅ | Project allocations, separate quotas and visible hypervisor capacity; no live utilization |
440
447
  | Service status | `get_service_status` | ✅ | Service status query |
441
- | Cluster overview | `get_cluster_status` | ✅ | Cluster overview |
442
- | Service logs | `set_service_logs` | ✅ | Service log management |
443
- | System metrics | `set_metrics` | ✅ | Metrics management |
444
- | Alarm management | `set_alarms` | ✅ | Alarm management |
448
+ | Cluster overview | `get_service_status` + `get_resource_monitoring` | ✅ | Service probes and current inventory |
449
+ | Service log metadata | `set_service_logs` | Partial | Service listing only; log retrieval is unavailable without a logging backend |
450
+ | Resource metadata | `set_metrics` | Partial | list/summary only; telemetry sample retrieval is unavailable |
451
+ | Alarm management | `set_alarms` | ✅ | Real Aodh/Gnocchi resource threshold alarms; requires services and collected metrics |
445
452
  | Compute agents | `set_compute_agents` | ✅ | Compute agent management |
446
- | Usage statistics | `get_usage_statistics` | ✅ | Usage statistics |
453
+ | Usage statistics | `get_usage_statistics` | ✅ | Period compute allocation-hours plus separately labeled current snapshots |
447
454
 
448
455
  ### 9. 📏 **Usage & Quota**
449
456
 
@@ -451,12 +458,25 @@ New consolidated `get_instance` tool replaces multiple separate tools:
451
458
  |---------------------|---------|------|------|
452
459
  | `openstack quota show` | `get_quota` | ✅ | Quota query |
453
460
  | `openstack quota set` | `set_quota` | ✅ | Quota setting |
454
- | `openstack usage show` | `get_usage_statistics` | ✅ | Usage query |
461
+ | `openstack usage show` | `get_usage_statistics` | ✅ | Current-project Nova simple tenant usage; not monetary charges |
455
462
  | `openstack limits show` | `get_quota` (includes limits) | ✅ | Limits query |
456
- | Resource utilization | `get_resource_monitoring` | ✅ | Resource utilization |
463
+ | Resource allocations | `get_resource_monitoring` | ✅ | Flavor allocations; not CPU load or resident memory samples |
457
464
 
458
465
  ---
459
466
 
467
+ ### API prerequisites and result semantics
468
+
469
+ The feature table marks implemented API paths, not verification against every OpenStack deployment. The management and query paths have local mocked API tests. Selected paths also passed live tests on a single-node Kolla Ansible deployment; see [integration validation](docs/integration-validation.md) for coverage and skipped operations. A missing service, extension, required microversion, or permission is an operation failure, not an empty successful result.
470
+
471
+ - **Modification tools:** the MCP server registers `set_*` management tools only when `ALLOW_MODIFY_OPERATIONS=true`. Existing action guards also reject writes when disabled. Dedicated read-only `get_*` tools remain available. API authorization is enforced by the target cloud; agent, user, domain, type and QoS administration may require elevated OpenStack roles.
472
+ - **Alarms:** `set_alarms` calls the Keystone catalog's `alarming` endpoint for the configured interface/region. It supports list/create/show/delete of project alarms and creates `gnocchi_resources_threshold` alarms. Aodh, Gnocchi, the specified resource and a collected metric are required. The default metric is `cpu_util`, which is not collected by every deployment. `metric`, `resource_type`, `aggregation_method`, `granularity`, `evaluation_periods`, and `alarm_actions` can be supplied. An empty action list creates an alarm without notifications. There is no simulation fallback.
473
+ - **Usage:** `get_usage_statistics` calls Nova simple tenant usage for the current project. Requires Nova API microversion 2.40 or newer for complete pagination. Date bounds are UTC midnight, start inclusive and end exclusive; start must precede end. `usage_statistics.period_compute` contains paginated Nova allocation-hours, not actual CPU load, billed currency, or network/storage history. Nova accounts using VM lifetime and the latest flavor; stop/pause/resize history is not reconstructed. Existing `compute`, `network`, and `storage` fields are current snapshots, labeled by `snapshot_fields` and `snapshot_timestamp`. An unavailable period API returns failure. A failed snapshot section is reported as partial failure.
474
+ - **Capacity:** `get_resource_monitoring` separates flavor allocations from project quota limits and the physical totals of visible hypervisors. Missing physical totals or incomplete flavor allocations return `null`, not invented capacity or zero usage. Physical totals and project allocations have different scopes. This tool does not collect live utilization or trends.
475
+ - **Floating IP pools:** `total_ips` is the exact sum of visible subnet allocation ranges; `used_ips` counts visible Floating IP objects. Global `available_ips` is `null`: other projects and non-floating ports may consume addresses that are not visible to the caller.
476
+ - **Volume groups:** the cloud must support Cinder generic groups (microversion 3.13 or newer). Create requires an existing `group_type` and comma-delimited `volume_types`. Deletion does not delete member volumes unless `delete_volumes=true` is explicitly supplied. Async creation/deletion responses mean accepted, not finished.
477
+ - **Identity and images:** `set_users` reads a new user's password from the server variable named by `password_env`; never put passwords in prompts. It does not grant project roles. Disable a domain explicitly with `set_domains(action="update", enabled=false)` before deleting it. Image member modifications require an image owned by the current project, shared visibility, and appropriate Glance policy; adding a member does not automatically accept the recipient's membership.
478
+ - **Logs and telemetry:** `set_service_logs(action="show")` and `set_metrics(action="show")` return explicit unsupported errors. No centralized logging or telemetry sample backend is implemented. Their list/summary operations expose service or resource metadata only.
479
+
460
480
  ## Quick Start
461
481
 
462
482
  > 💡 **Need an OpenStack Cluster for Testing?**
@@ -2,6 +2,8 @@
2
2
 
3
3
  > **MCP OpenStack Operations Server**: A comprehensive MCP (Model Context Protocol) server providing OpenStack project management and monitoring capabilities with built-in safety controls and single-project scope.
4
4
 
5
+ [![MCPVault: claimed](https://mcpvault.io/badge/mcp-openstack-ops.svg?theme=dark)](https://mcpvault.io/servers/mcp-openstack-ops/health?utm_source=external_badge&utm_medium=referral&utm_campaign=mcp_health_report)
6
+
5
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
6
8
  ![Python](https://img.shields.io/badge/Python-3776AB?style=flat&logo=python&logoColor=white)
7
9
  ![Docker Pulls](https://img.shields.io/docker/pulls/call518/mcp-server-openstack-ops)
@@ -23,10 +25,10 @@
23
25
 
24
26
  - ✅ **Project-Scoped Operations**: Every tool enforces the configured `OS_PROJECT_NAME`, validating resource ownership so actions stay inside a single tenant.
25
27
  - ✅ **Safety-Gated Writes**: Modify (`set_*`) tooling only registers when `ALLOW_MODIFY_OPERATIONS=true`, keeping default deployments read-only and auditable.
26
- - ✅ **90+ Purpose-Built Tools**: Broad coverage across compute, networking, storage, images, identity, Heat, and Octavia load balancing tasks—all constrained to the current project.
28
+ - ✅ **90+ Purpose-Built Tools**: Broad coverage across compute, networking, storage, images, identity, Heat, and Octavia load balancing tasks. Project resources are scoped to the active project; cloud-wide administrative APIs remain subject to OpenStack policy.
27
29
  - ✅ **Bulk & Filtered Actions**: Instance, volume, network, image, snapshot, and keypair managers accept comma-delimited targets or filter criteria to orchestrate bulk changes intentionally.
28
30
  - ✅ **Post-Action Feedback & Async Guidance**: Mutating tools reuse a shared result handler that adds emoji status checks, asynchronous timing notes, and follow-up verification commands.
29
- - ✅ **Monitoring & Usage Insights**: `get_service_status`, `get_resource_monitoring`, `get_usage_statistics`, and quota tools surface service availability, utilization, and capacity for the active project.
31
+ - ✅ **Monitoring & Usage Insights**: `get_service_status`, `get_resource_monitoring`, `get_usage_statistics`, and quota tools report service probes, project allocations, separate quota limits, and API-backed compute allocation-hours. Live utilization and historical trends are not collected.
30
32
  - ✅ **Unified Instance Queries**: The `get_instance` tool consolidates name, ID, status, and free-form search paths with pagination plus summary/detailed modes.
31
33
  - ✅ **Server Insight & Audit Trail**: Dedicated tools expose server events, hypervisor details, availability zones, quotas, and resource ownership to speed diagnostics.
32
34
  - ✅ **Load Balancer Management**: Octavia tools cover listeners, pools, members, health monitors, flavors, quotas, and amphora operations with the same safety gates.
@@ -160,6 +162,11 @@ New consolidated `get_instance` tool replaces multiple separate tools:
160
162
 
161
163
  **Detailed Mapping by Category**
162
164
 
165
+ ✅ indicates an implemented API path, subject to cloud services and policy.
166
+ Live-validated paths and deployment limits are listed in
167
+ [integration validation](docs/integration-validation.md). Also see
168
+ [API prerequisites and result semantics](#api-prerequisites-and-result-semantics).
169
+
163
170
  ### 1. 🖥️ **Compute (Nova)**
164
171
 
165
172
  | OpenStack CLI Command | MCP Tool | Status | Notes |
@@ -224,7 +231,7 @@ New consolidated `get_instance` tool replaces multiple separate tools:
224
231
  | `openstack subnet list` | `get_network_details` (includes subnets) | ✅ | Subnet information included |
225
232
  | `openstack subnet create/delete` | `set_subnets` | ✅ | Subnet management |
226
233
  | `openstack router list` | `get_routers` | ✅ | Router listing |
227
- | `openstack router create/delete` | (Not yet implemented) | 🚧 | Router management |
234
+ | `openstack router create/delete` | `set_routers` | ✅ | Project-owned routers; attached interfaces are not removed automatically |
228
235
  | `openstack floating ip list` | `get_floating_ips` | ✅ | Floating IP listing |
229
236
  | `openstack floating ip create` | `set_floating_ip` (action="create") | ✅ | Floating IP creation |
230
237
  | `openstack floating ip delete` | `set_floating_ip` (action="delete") | ✅ | Floating IP deletion |
@@ -238,13 +245,13 @@ New consolidated `get_instance` tool replaces multiple separate tools:
238
245
  | `openstack floating ip port forwarding set` | `set_floating_ip_port_forwarding` (action="set") | ✅ | Port forwarding updates |
239
246
  | `openstack floating ip port forwarding show` | `set_floating_ip_port_forwarding` (action="show") | ✅ | Port forwarding details |
240
247
  | `openstack security group list` | `get_security_groups` | ✅ | Security group listing |
241
- | `openstack security group create/delete` | (Not yet implemented) | 🚧 | Security group management |
248
+ | `openstack security group create/delete` | `set_security_groups` | ✅ | Project-owned security groups |
242
249
  | `openstack port list` | `get_network_details` (includes ports) | ✅ | Port information included |
243
250
  | `openstack port create/delete` | `set_network_ports` | ✅ | Port management |
244
- | `openstack network qos policy list` | (Not yet implemented) | 🚧 | QoS policy listing |
245
- | `openstack network qos policy create` | `set_network_qos_policies` | ✅ | QoS policy management |
251
+ | `openstack network qos policy list` | `get_network_qos_policies` | ✅ | Current-project policy containers |
252
+ | `openstack network qos policy create` | `set_network_qos_policies` | ✅ | Create/list/delete policy containers; does not create bandwidth rules |
246
253
  | `openstack network agent list` | `get_service_status` (includes agents) | ✅ | Network agents |
247
- | `openstack network agent set` | `set_network_agents` | ✅ | Network agent management |
254
+ | `openstack network agent set` | `set_network_agents` | ✅ | Enable/disable cloud-wide agents; usually admin-only |
248
255
 
249
256
  ### 3. 💾 **Storage (Cinder)**
250
257
 
@@ -255,18 +262,18 @@ New consolidated `get_instance` tool replaces multiple separate tools:
255
262
  | `openstack volume create/delete` | `set_volume` | ✅ | Volume creation/deletion |
256
263
  | `openstack volume set` | `set_volume` (action="modify") | ✅ | Volume property modification |
257
264
  | `openstack volume type list` | `get_volume_types` | ✅ | Volume type listing |
258
- | `openstack volume type create/delete` | (Not yet implemented) | 🚧 | Volume type management |
265
+ | `openstack volume type create/delete` | `set_volume_types` | ✅ | Volume type management; usually admin-only |
259
266
  | `openstack volume snapshot list` | `get_volume_snapshots` | ✅ | Snapshot listing |
260
267
  | `openstack volume snapshot create/delete` | `set_snapshot` | ✅ | Snapshot management |
261
- | `openstack backup list` | (Not yet implemented) | 🚧 | Backup listing |
268
+ | `openstack backup list` | `get_volume_backups` | ✅ | Current-project backup listing |
262
269
  | `openstack backup create/delete` | `set_volume_backups` | ✅ | Volume backup management |
263
- | `openstack volume transfer request list` | (Not yet implemented) | 🚧 | Volume transfer |
270
+ | `openstack volume transfer request list` | `get_volume_transfers` | ✅ | Request listing only; authorization keys are excluded |
264
271
  | `openstack server volume list` | `get_server_volumes` | ✅ | Server volume listing |
265
272
  | `openstack server add/remove volume` | `set_server_volume` | ✅ | Server volume attach/detach |
266
- | `openstack volume group list` | (Not yet implemented) | 🚧 | Volume group listing |
267
- | `openstack volume group create` | `set_volume_groups` | ✅ | Volume group management |
268
- | `openstack volume qos list` | (Not yet implemented) | 🚧 | QoS listing |
269
- | `openstack volume qos create` | `set_volume_qos` | ✅ | QoS management |
273
+ | `openstack volume group list` | `get_volume_groups` | ✅ | Requires Cinder generic groups (API >= 3.13) |
274
+ | `openstack volume group create` | `set_volume_groups` | ✅ | Create/list/show/delete; create requires group_type and volume_types |
275
+ | `openstack volume qos list` | `get_volume_qos` | ✅ | Cinder QoS specifications; subject to cloud policy |
276
+ | `openstack volume qos create` | `set_volume_qos` | ✅ | Create/list/show/set/delete specifications; no automatic type association |
270
277
 
271
278
  ### 4. 🖼️ **Image (Glance)**
272
279
 
@@ -278,8 +285,8 @@ New consolidated `get_instance` tool replaces multiple separate tools:
278
285
  | `openstack image delete` | `set_image` (action="delete") | ✅ | Image deletion |
279
286
  | `openstack image set` | `set_image` (action="update") | ✅ | Image property modification |
280
287
  | `openstack image save` | `set_image` (action="save") | ✅ | Image download |
281
- | `openstack image add project` | (Not yet implemented) | 🚧 | Project sharing |
282
- | `openstack image member list` | (Not yet implemented) | 🚧 | Member listing |
288
+ | `openstack image add project` | `set_image_members` (action="add") | ✅ | Add a project to an image with shared visibility |
289
+ | `openstack image member list` | `get_image_members` | ✅ | Image member listing |
283
290
  | `openstack image member create` | `set_image_members` | ✅ | Image member management |
284
291
  | `openstack image set --property` | `set_image_metadata` | ✅ | Image metadata |
285
292
  | `openstack image set --public/private` | `set_image_visibility` | ✅ | Image visibility setting |
@@ -290,16 +297,16 @@ New consolidated `get_instance` tool replaces multiple separate tools:
290
297
  |---------------------|---------|------|------|
291
298
  | `openstack user list` | `get_user_list` | ✅ | User listing |
292
299
  | `openstack user show` | `get_user_list` (filtering) | ✅ | Specific user query |
293
- | `openstack user create/delete` | (Not yet implemented) | 🚧 | User management |
300
+ | `openstack user create/delete` | `set_users` | ✅ | Password from a server environment variable; no role grants |
294
301
  | `openstack project list` | `get_project_details` | ✅ | Project listing |
295
302
  | `openstack project show` | `get_project_details` (name param) | ✅ | Specific project query |
296
303
  | `openstack project create/delete` | `set_project` | ✅ | Project management |
297
304
  | `openstack role list` | `get_role_assignments` | ✅ | Role listing |
298
305
  | `openstack role assignment list` | `get_role_assignments` | ✅ | Role assignment listing |
299
306
  | `openstack role create/delete` | `set_roles` | ✅ | Role management |
300
- | `openstack domain list` | (Not yet implemented) | 🚧 | Domain listing |
301
- | `openstack domain create/delete` | `set_domains` | ✅ | Domain management |
302
- | `openstack group list` | (Not yet implemented) | 🚧 | Group listing |
307
+ | `openstack domain list` | `get_domains` | ✅ | Subject to Keystone policy |
308
+ | `openstack domain create/delete` | `set_domains` | ✅ | Disable explicitly with update before delete |
309
+ | `openstack group list` | `get_identity_groups` | ✅ | Subject to Keystone policy |
303
310
  | `openstack group create/delete` | `set_identity_groups` | ✅ | Group management |
304
311
  | `openstack service list` | `get_service_status` | ✅ | Service listing |
305
312
  | `openstack service create/delete` | `set_services` | ✅ | Service management |
@@ -315,10 +322,10 @@ New consolidated `get_instance` tool replaces multiple separate tools:
315
322
  | `openstack stack delete` | `set_heat_stack` (action="delete") | ✅ | Stack deletion |
316
323
  | `openstack stack update` | `set_heat_stack` (action="update") | ✅ | Stack update |
317
324
  | `openstack stack suspend/resume` | `set_heat_stack` | ✅ | Stack suspend/resume |
318
- | `openstack stack resource list` | (Not yet implemented) | 🚧 | Stack resource listing |
319
- | `openstack stack event list` | (Not yet implemented) | 🚧 | Stack event listing |
320
- | `openstack stack template show` | (Not yet implemented) | 🚧 | Template query |
321
- | `openstack stack output list` | (Not yet implemented) | 🚧 | Stack output listing |
325
+ | `openstack stack resource list` | `get_heat_stack_details` (section="resources") | ✅ | Actual Heat resources |
326
+ | `openstack stack event list` | `get_heat_stack_details` (section="events") | ✅ | Actual Heat events |
327
+ | `openstack stack template show` | `get_heat_stack_details` (section="template") | ✅ | Original template document |
328
+ | `openstack stack output list` | `get_heat_stack_details` (section="outputs") | ✅ | Resolved stack outputs |
322
329
 
323
330
  ### 7. ⚖️ **Load Balancer (Octavia)**
324
331
 
@@ -418,14 +425,14 @@ New consolidated `get_instance` tool replaces multiple separate tools:
418
425
 
419
426
  | OpenStack CLI Command | MCP Tool | Status | Notes |
420
427
  |---------------------|---------|------|------|
421
- | Resource monitoring | `get_resource_monitoring` | ✅ | Resource monitoring |
428
+ | Resource monitoring | `get_resource_monitoring` | ✅ | Project allocations, separate quotas and visible hypervisor capacity; no live utilization |
422
429
  | Service status | `get_service_status` | ✅ | Service status query |
423
- | Cluster overview | `get_cluster_status` | ✅ | Cluster overview |
424
- | Service logs | `set_service_logs` | ✅ | Service log management |
425
- | System metrics | `set_metrics` | ✅ | Metrics management |
426
- | Alarm management | `set_alarms` | ✅ | Alarm management |
430
+ | Cluster overview | `get_service_status` + `get_resource_monitoring` | ✅ | Service probes and current inventory |
431
+ | Service log metadata | `set_service_logs` | Partial | Service listing only; log retrieval is unavailable without a logging backend |
432
+ | Resource metadata | `set_metrics` | Partial | list/summary only; telemetry sample retrieval is unavailable |
433
+ | Alarm management | `set_alarms` | ✅ | Real Aodh/Gnocchi resource threshold alarms; requires services and collected metrics |
427
434
  | Compute agents | `set_compute_agents` | ✅ | Compute agent management |
428
- | Usage statistics | `get_usage_statistics` | ✅ | Usage statistics |
435
+ | Usage statistics | `get_usage_statistics` | ✅ | Period compute allocation-hours plus separately labeled current snapshots |
429
436
 
430
437
  ### 9. 📏 **Usage & Quota**
431
438
 
@@ -433,12 +440,25 @@ New consolidated `get_instance` tool replaces multiple separate tools:
433
440
  |---------------------|---------|------|------|
434
441
  | `openstack quota show` | `get_quota` | ✅ | Quota query |
435
442
  | `openstack quota set` | `set_quota` | ✅ | Quota setting |
436
- | `openstack usage show` | `get_usage_statistics` | ✅ | Usage query |
443
+ | `openstack usage show` | `get_usage_statistics` | ✅ | Current-project Nova simple tenant usage; not monetary charges |
437
444
  | `openstack limits show` | `get_quota` (includes limits) | ✅ | Limits query |
438
- | Resource utilization | `get_resource_monitoring` | ✅ | Resource utilization |
445
+ | Resource allocations | `get_resource_monitoring` | ✅ | Flavor allocations; not CPU load or resident memory samples |
439
446
 
440
447
  ---
441
448
 
449
+ ### API prerequisites and result semantics
450
+
451
+ The feature table marks implemented API paths, not verification against every OpenStack deployment. The management and query paths have local mocked API tests. Selected paths also passed live tests on a single-node Kolla Ansible deployment; see [integration validation](docs/integration-validation.md) for coverage and skipped operations. A missing service, extension, required microversion, or permission is an operation failure, not an empty successful result.
452
+
453
+ - **Modification tools:** the MCP server registers `set_*` management tools only when `ALLOW_MODIFY_OPERATIONS=true`. Existing action guards also reject writes when disabled. Dedicated read-only `get_*` tools remain available. API authorization is enforced by the target cloud; agent, user, domain, type and QoS administration may require elevated OpenStack roles.
454
+ - **Alarms:** `set_alarms` calls the Keystone catalog's `alarming` endpoint for the configured interface/region. It supports list/create/show/delete of project alarms and creates `gnocchi_resources_threshold` alarms. Aodh, Gnocchi, the specified resource and a collected metric are required. The default metric is `cpu_util`, which is not collected by every deployment. `metric`, `resource_type`, `aggregation_method`, `granularity`, `evaluation_periods`, and `alarm_actions` can be supplied. An empty action list creates an alarm without notifications. There is no simulation fallback.
455
+ - **Usage:** `get_usage_statistics` calls Nova simple tenant usage for the current project. Requires Nova API microversion 2.40 or newer for complete pagination. Date bounds are UTC midnight, start inclusive and end exclusive; start must precede end. `usage_statistics.period_compute` contains paginated Nova allocation-hours, not actual CPU load, billed currency, or network/storage history. Nova accounts using VM lifetime and the latest flavor; stop/pause/resize history is not reconstructed. Existing `compute`, `network`, and `storage` fields are current snapshots, labeled by `snapshot_fields` and `snapshot_timestamp`. An unavailable period API returns failure. A failed snapshot section is reported as partial failure.
456
+ - **Capacity:** `get_resource_monitoring` separates flavor allocations from project quota limits and the physical totals of visible hypervisors. Missing physical totals or incomplete flavor allocations return `null`, not invented capacity or zero usage. Physical totals and project allocations have different scopes. This tool does not collect live utilization or trends.
457
+ - **Floating IP pools:** `total_ips` is the exact sum of visible subnet allocation ranges; `used_ips` counts visible Floating IP objects. Global `available_ips` is `null`: other projects and non-floating ports may consume addresses that are not visible to the caller.
458
+ - **Volume groups:** the cloud must support Cinder generic groups (microversion 3.13 or newer). Create requires an existing `group_type` and comma-delimited `volume_types`. Deletion does not delete member volumes unless `delete_volumes=true` is explicitly supplied. Async creation/deletion responses mean accepted, not finished.
459
+ - **Identity and images:** `set_users` reads a new user's password from the server variable named by `password_env`; never put passwords in prompts. It does not grant project roles. Disable a domain explicitly with `set_domains(action="update", enabled=false)` before deleting it. Image member modifications require an image owned by the current project, shared visibility, and appropriate Glance policy; adding a member does not automatically accept the recipient's membership.
460
+ - **Logs and telemetry:** `set_service_logs(action="show")` and `set_metrics(action="show")` return explicit unsupported errors. No centralized logging or telemetry sample backend is implemented. Their list/summary operations expose service or resource metadata only.
461
+
442
462
  ## Quick Start
443
463
 
444
464
  > 💡 **Need an OpenStack Cluster for Testing?**
@@ -0,0 +1,64 @@
1
+ # Integration validation
2
+
3
+ Validated on 2026-10-30 against a single-node Kolla Ansible test deployment,
4
+ using an administrative project. Credentials and deployment addresses are not
5
+ included in this report.
6
+
7
+ ## Results
8
+
9
+ The final live suite recorded 68 passing checks, including prerequisite creation,
10
+ API read-back, asynchronous state checks, and cleanup. Three lifecycle checks
11
+ were skipped as described below. These counts are checks, not distinct features.
12
+
13
+ | Area | Live result |
14
+ | --- | --- |
15
+ | Connection | The project's connection factory authenticated successfully |
16
+ | Inventory | Domains, identity groups, backups, volume groups, volume QoS, and volume transfers were queried through actual MCP tool handlers |
17
+ | Monitoring and usage | Current allocation reporting and date-bounded Nova usage queries succeeded; unavailable physical capacity remained null |
18
+ | Floating IP pools | Allocation ranges totaled 50 addresses; one visible Floating IP was counted; global free capacity remained unknown |
19
+ | Routers and security groups | Created disposable resources, read them back through the SDK, deleted them through MCP tools, and confirmed absence |
20
+ | Volume types | Created a disposable type and removed it after group checks |
21
+ | Cinder QoS | Created a specification, showed it, changed its limit, verified the updated value, deleted it, and confirmed absence |
22
+ | Volume groups | Created a temporary group type and empty group; group reached available; show and delete succeeded |
23
+ | Identity | Created a disposable domain, group and user; group show/update/delete and user read-back/delete succeeded; domain was disabled and deleted during cleanup |
24
+ | Image sharing | Created a disposable shared image and recipient project; member add/list/remove succeeded |
25
+ | Heat | Created an empty stack, waited for CREATE_COMPLETE, queried resources/events/template/outputs, and deleted the stack |
26
+ | Backups | Created a blank 1 GiB source volume; created and showed its backup; restored into a new 1 GiB volume; waited for available states; deleted the backup and both volumes |
27
+
28
+ All registered cleanup checks passed. A final read-only audit across 14 resource
29
+ categories found zero remaining resources with either validation run's unique
30
+ names. Only disposable resources created by the validation runs were targeted
31
+ for deletion. Backup validation covered the API
32
+ lifecycle and ready states; it did not test integrity of non-empty application
33
+ data. Heat validation used an empty template with a constant output.
34
+
35
+ ## Defect found and fixed
36
+
37
+ The existing Heat endpoint override ended at `/v1`. In the tested deployment,
38
+ SDK discovery failed with a `catalog_url` attribute error; forcing API version 1
39
+ alone instead produced a request to the invalid `/v1/stacks` path.
40
+
41
+ The connection factory now sets Heat API version 1 and, after authentication,
42
+ scopes the endpoint to `/v1/{project_id}`. The corrected connection passed live
43
+ stack creation and all four new query sections. A local regression test covers
44
+ the endpoint construction. The connection success log no longer includes token
45
+ contents.
46
+
47
+ ## Limits and skipped operations
48
+
49
+ - **Network QoS:** the deployment does not advertise the Neutron `qos` extension;
50
+ policy listing returned HTTP 404. Successful policy creation/deletion remains
51
+ covered by local mocked tests, not live validation.
52
+ - **Alarms:** no `alarming` or `metric` service was registered in the catalog.
53
+ Alarm listing returned an explicit missing-endpoint failure. The successful
54
+ Aodh/Gnocchi lifecycle remains unverified against a live service.
55
+ - **Network agents:** listing succeeded. Existing cloud-wide agents were not
56
+ enabled or disabled to avoid affecting the platform's networking.
57
+ - **Logs and telemetry:** no centralized logging or telemetry sample backend
58
+ was added. The explicit unsupported responses remain intentional.
59
+ - This deployment does not establish compatibility with every OpenStack release,
60
+ storage backend, policy configuration, or non-administrative role.
61
+
62
+ After the Heat fix, `uv run --no-sync python -m pytest -q tests` passed all 90
63
+ local tests. The SDK emitted 12 deprecated-field warnings. No commit or push
64
+ was performed as part of validation.
@@ -7,7 +7,7 @@ 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.21.0",
10
+ "openstacksdk>=4.1.0,<=4.22.0",
11
11
  "python-dotenv>=1.1.1",
12
12
  "setuptools-scm>=10.0.5",
13
13
  "pre-commit>=4.6.0",
@@ -109,13 +109,21 @@ def get_openstack_connection():
109
109
  image_endpoint=f"{os_auth_protocol}://{os_auth_host}:{image_port}",
110
110
  placement_endpoint=f"{os_auth_protocol}://{os_auth_host}:{placement_port}",
111
111
  orchestration_endpoint=f"{os_auth_protocol}://{os_auth_host}:{heat_stack_port}/v1",
112
+ orchestration_api_version="1",
112
113
  timeout=10
113
114
  )
114
115
 
115
116
  # Test the connection
116
117
  try:
117
- token = _connection_cache.identity.get_token()
118
- logger.info(f"OpenStack connection successful. Token acquired: {token[:20]}...")
118
+ _connection_cache.identity.get_token()
119
+ # Heat URLs include the project ID, available only after authentication.
120
+ project_id = _connection_cache.current_project_id
121
+ if not project_id:
122
+ raise ValueError("A project-scoped OpenStack connection is required")
123
+ _connection_cache.config.config["orchestration_endpoint_override"] = (
124
+ f"{os_auth_protocol}://{os_auth_host}:{heat_stack_port}/v1/{project_id}"
125
+ )
126
+ logger.info("OpenStack connection successful")
119
127
  except Exception as test_e:
120
128
  logger.error(f"Connection test failed: {test_e}")
121
129
  raise