mcp-openstack-ops 3.6.0__tar.gz → 3.6.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 (197) hide show
  1. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/AGENTS.md +6 -4
  2. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/PKG-INFO +49 -78
  3. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/README.md +48 -77
  4. mcp_openstack_ops-3.6.0/docs/multi-user-phase1.md → mcp_openstack_ops-3.6.2/docs/multi-user-guide.md +27 -133
  5. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/prompt_template.md +22 -22
  6. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/compute.py +93 -26
  7. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/identity.py +2 -7
  8. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/network.py +25 -20
  9. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/storage.py +47 -81
  10. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_instance.py +26 -13
  11. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_instance_details.py +8 -4
  12. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_instances_by_status.py +10 -5
  13. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_keypair_list.py +5 -4
  14. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_network_details.py +10 -5
  15. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_routers.py +5 -4
  16. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_security_groups.py +5 -1
  17. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_server_events.py +5 -1
  18. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_user_list.py +5 -4
  19. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_volume_list.py +10 -5
  20. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_volume_snapshots.py +5 -4
  21. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/search_instances.py +16 -11
  22. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_networks.py +4 -4
  23. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_volume.py +14 -17
  24. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/user_connection.py +80 -12
  25. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops.egg-info/PKG-INFO +49 -78
  26. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops.egg-info/SOURCES.txt +3 -6
  27. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops.egg-info/scm_file_list.json +3 -6
  28. mcp_openstack_ops-3.6.2/src/mcp_openstack_ops.egg-info/scm_version.json +8 -0
  29. mcp_openstack_ops-3.6.2/tests/test_expanded_validation_fixes.py +144 -0
  30. mcp_openstack_ops-3.6.2/tests/test_phase1_stabilization.py +202 -0
  31. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_user_connection.py +111 -0
  32. mcp_openstack_ops-3.6.0/docs/integration-validation.md +0 -64
  33. mcp_openstack_ops-3.6.0/docs/main-live-retest-2026-10-30.json +0 -2342
  34. mcp_openstack_ops-3.6.0/docs/main-live-retest-2026-10-30.md +0 -268
  35. mcp_openstack_ops-3.6.0/docs/main-live-validation-2026-10-30.json +0 -2745
  36. mcp_openstack_ops-3.6.0/docs/main-live-validation-2026-10-30.md +0 -315
  37. mcp_openstack_ops-3.6.0/src/mcp_openstack_ops.egg-info/scm_version.json +0 -8
  38. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.env.example +0 -0
  39. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.env.test +0 -0
  40. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.github/FUNDING.yml +0 -0
  41. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.github/copilot-instructions.md +0 -0
  42. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.github/dependabot.yml +0 -0
  43. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.github/workflows/pypi-publish.yml +0 -0
  44. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.github/workflows/tests.yml +0 -0
  45. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.gitignore +0 -0
  46. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.gitleaks.toml +0 -0
  47. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.pre-commit-config.yaml +0 -0
  48. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/.python-version +0 -0
  49. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/Dockerfile.MCP-Server +0 -0
  50. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/Dockerfile.MCPO-Proxy +0 -0
  51. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/LICENSE +0 -0
  52. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/MANIFEST.in +0 -0
  53. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/build-mcp-server-docker-image.sh +0 -0
  54. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/build-mcpo-server-docker-image.sh +0 -0
  55. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/diagnose_openstack.py +0 -0
  56. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/docker-compose.yml +0 -0
  57. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/img/MCP-Workflow-of-Quickstart-Tutorial.png +0 -0
  58. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/img/screenshot-claude-desktop.png +0 -0
  59. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/img/screenshot-example-cluster-status.png +0 -0
  60. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/img/screenshot-openstack-dashboard.png +0 -0
  61. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/main.py +0 -0
  62. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/mcp-config.json.http +0 -0
  63. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/mcp-config.json.multi-project +0 -0
  64. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/mcp-config.json.stdio +0 -0
  65. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/pyproject.toml +0 -0
  66. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/scripts/check_release.py +0 -0
  67. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/scripts/mcp-server-docker-cmd.sh +0 -0
  68. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/scripts/publish_release.py +0 -0
  69. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/scripts/run-mcp-inspector-local.sh +0 -0
  70. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/scripts/run-mcp-inspector-pypi.sh +0 -0
  71. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/setup.cfg +0 -0
  72. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/__init__.py +0 -0
  73. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/__main__.py +0 -0
  74. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/connection.py +0 -0
  75. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/functions.py +0 -0
  76. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/mcp_main.py +0 -0
  77. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/__init__.py +0 -0
  78. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/alarms.py +0 -0
  79. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/core.py +0 -0
  80. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/image.py +0 -0
  81. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/load_balancer/__init__.py +0 -0
  82. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/load_balancer/amphorae.py +0 -0
  83. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/load_balancer/core.py +0 -0
  84. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/load_balancer/health_monitors.py +0 -0
  85. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/load_balancer/l7_policies.py +0 -0
  86. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/load_balancer/listeners.py +0 -0
  87. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/load_balancer/management.py +0 -0
  88. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/load_balancer/pools.py +0 -0
  89. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/monitoring.py +0 -0
  90. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/services/orchestration.py +0 -0
  91. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/__init__.py +0 -0
  92. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_availability_zones.py +0 -0
  93. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_domains.py +0 -0
  94. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_floating_ip_pools.py +0 -0
  95. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_floating_ips.py +0 -0
  96. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_heat_stack_details.py +0 -0
  97. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_heat_stacks.py +0 -0
  98. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_hypervisor_details.py +0 -0
  99. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_identity_groups.py +0 -0
  100. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_image_detail_list.py +0 -0
  101. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_image_members.py +0 -0
  102. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_instance_by_name.py +0 -0
  103. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_amphorae.py +0 -0
  104. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_availability_zones.py +0 -0
  105. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_details.py +0 -0
  106. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_flavors.py +0 -0
  107. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_health_monitors.py +0 -0
  108. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_l7_policies.py +0 -0
  109. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_l7_rules.py +0 -0
  110. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_list.py +0 -0
  111. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_listeners.py +0 -0
  112. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_pool_members.py +0 -0
  113. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_pools.py +0 -0
  114. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_providers.py +0 -0
  115. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_load_balancer_quotas.py +0 -0
  116. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_network_qos_policies.py +0 -0
  117. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_project_details.py +0 -0
  118. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_quota.py +0 -0
  119. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_resource_monitoring.py +0 -0
  120. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_role_assignments.py +0 -0
  121. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_server_groups.py +0 -0
  122. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_server_volumes.py +0 -0
  123. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_service_status.py +0 -0
  124. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_usage_statistics.py +0 -0
  125. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_volume_backups.py +0 -0
  126. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_volume_groups.py +0 -0
  127. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_volume_qos.py +0 -0
  128. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_volume_transfers.py +0 -0
  129. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/get_volume_types.py +0 -0
  130. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_alarms.py +0 -0
  131. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_compute_agents.py +0 -0
  132. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_domains.py +0 -0
  133. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_flavor.py +0 -0
  134. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_floating_ip.py +0 -0
  135. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_floating_ip_port_forwarding.py +0 -0
  136. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_heat_stack.py +0 -0
  137. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_identity_groups.py +0 -0
  138. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_image.py +0 -0
  139. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_image_members.py +0 -0
  140. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_image_metadata.py +0 -0
  141. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_image_visibility.py +0 -0
  142. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_instance.py +0 -0
  143. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_keypair.py +0 -0
  144. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer.py +0 -0
  145. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_amphora.py +0 -0
  146. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_availability_zone.py +0 -0
  147. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_flavor.py +0 -0
  148. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_health_monitor.py +0 -0
  149. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_l7_policy.py +0 -0
  150. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_l7_rule.py +0 -0
  151. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_listener.py +0 -0
  152. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_pool.py +0 -0
  153. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_pool_member.py +0 -0
  154. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_load_balancer_quota.py +0 -0
  155. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_metrics.py +0 -0
  156. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_network_agents.py +0 -0
  157. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_network_ports.py +0 -0
  158. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_network_qos_policies.py +0 -0
  159. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_project.py +0 -0
  160. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_quota.py +0 -0
  161. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_roles.py +0 -0
  162. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_routers.py +0 -0
  163. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_security_groups.py +0 -0
  164. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_backup.py +0 -0
  165. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_dump.py +0 -0
  166. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_fixed_ip.py +0 -0
  167. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_floating_ip.py +0 -0
  168. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_group.py +0 -0
  169. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_migration.py +0 -0
  170. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_network.py +0 -0
  171. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_properties.py +0 -0
  172. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_security_group.py +0 -0
  173. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_server_volume.py +0 -0
  174. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_service_logs.py +0 -0
  175. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_services.py +0 -0
  176. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_snapshot.py +0 -0
  177. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_subnets.py +0 -0
  178. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_users.py +0 -0
  179. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_volume_backups.py +0 -0
  180. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_volume_groups.py +0 -0
  181. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_volume_qos.py +0 -0
  182. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops/tools/set_volume_types.py +0 -0
  183. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops.egg-info/dependency_links.txt +0 -0
  184. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops.egg-info/entry_points.txt +0 -0
  185. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops.egg-info/requires.txt +0 -0
  186. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/src/mcp_openstack_ops.egg-info/top_level.txt +0 -0
  187. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/test_compatibility.sh +0 -0
  188. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/test_project_isolation.py +0 -0
  189. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_connection.py +0 -0
  190. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_floating_ip.py +0 -0
  191. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_instance_image.py +0 -0
  192. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_live_regressions.py +0 -0
  193. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_operational_tools.py +0 -0
  194. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_publish_release.py +0 -0
  195. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_release.py +0 -0
  196. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/tests/test_tool_registration.py +0 -0
  197. {mcp_openstack_ops-3.6.0 → mcp_openstack_ops-3.6.2}/uv.lock +0 -0
@@ -33,10 +33,12 @@ consistent with the resulting implementation and actual verification.
33
33
  Label targeted retests as partial; do not extrapolate them to the full toolset.
34
34
  Document polling limits and distinguish accepted requests from confirmed final
35
35
  resource states. Explain changes in test conditions that affect comparisons.
36
- - Keep dated reports as historical evidence and link the latest applicable
37
- report from README.md. Reports must state verification limits, observed
38
- failures, and cleanup results without exposing credentials, private endpoints,
39
- or sensitive resource data.
36
+ - Keep `docs/` for reusable user guidance only. Do not create or retain
37
+ issue-specific reports, dated test results, or evidence JSON in `docs/`, or
38
+ embed those records in usage guides. Report case-specific verification results,
39
+ limits, failures, and cleanup in chat unless the user explicitly requests a
40
+ separate artifact. Never expose credentials, private endpoints, or sensitive
41
+ resource data. Do not add report links to README.md.
40
42
  - Before completion, check summary arithmetic, percentages, tool/action names,
41
43
  Status/Notes, source identity, and evidence links for agreement. If README.ko.md
42
44
  exists, maintain equivalent information in both README files.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-openstack-ops
3
- Version: 3.6.0
3
+ Version: 3.6.2
4
4
  Summary: OpenStack operations automation MCP server
5
5
  Author-email: JungJungIn <call518@gmail.com>
6
6
  Requires-Python: >=3.12
@@ -42,7 +42,7 @@ Dynamic: license-file
42
42
  ## Features
43
43
 
44
44
  Experimental per-user remote connections are available for testing with the
45
- opt-in `--multi-user` mode. See the [phase 1 setup and validation guide](docs/multi-user-phase1.md)
45
+ opt-in `--multi-user` mode. See the [multi-user setup and usage guide](docs/multi-user-guide.md)
46
46
  for authentication, client limitations, and the test checklist. Administrator
47
47
  cross-project queries are outside this phase.
48
48
 
@@ -177,47 +177,18 @@ Post-Action Status:
177
177
  ### **Unified Resource Queries**
178
178
  New consolidated `get_instance` tool replaces multiple separate tools:
179
179
  - ❌ Old: `get_instance_details`, `get_instance_info`, `get_instance_status`, `get_instance_network_info`
180
- - ✅ New: `get_instance(instance_names="vm1,vm2")` - Single tool, comprehensive information
180
+ - ✅ New: `get_instance(names="vm1,vm2")` - Single tool, comprehensive information
181
181
 
182
182
  ---
183
183
 
184
184
  ## 📊 OpenStack CLI vs MCP Tools Mapping
185
185
 
186
- **Validation snapshot — 2026-10-30** (main working tree based on `dd98993`,
187
- with the uncommitted fixes described in the report):
188
-
189
- <table border="1" rules="cols">
190
- <thead>
191
- <tr><th>Verification type</th><th>Item</th><th>Result</th></tr>
192
- </thead>
193
- <tbody>
194
- <tr><td rowspan="5">Live tool checks</td><td>Registered tools invoked and classified</td><td><strong>105</strong></td></tr>
195
- <tr><td>Passed within the exercised live scenarios</td><td><strong>74</strong></td></tr>
196
- <tr><td>Implemented, live unverified: service/API unavailable</td><td><strong>28</strong></td></tr>
197
- <tr><td>Intentional capability limitations</td><td><strong>3</strong></td></tr>
198
- <tr><td>Reproduced code defects / state-check timeouts in the retest</td><td><strong>0 / 0</strong></td></tr>
199
- <tr><td>Local unit tests</td><td>Test cases in <code>tests/test_*.py</code></td><td><strong>160/160 (100%)</strong></td></tr>
200
- </tbody>
201
- </table>
202
-
203
- State polling allowed 180 seconds; soft reboot completed in 131.66 seconds
204
- (previously it exceeded the 90-second check). No reboot implementation change
205
- was needed.
206
-
207
- The 10 previously reproduced tool defects were corrected. The 28 unavailable
208
- paths are **not live-validated successes**: 24 Octavia tools, two Neutron QoS
209
- tools, one Aodh tool, and one Neutron port-forwarding tool. Each affected table
210
- row is marked **⚠️ Live unverified**. An absent tool/action is marked **❌ Not
211
- implemented** rather than presented as an available feature.
212
-
213
- ✅ means an implemented API path; it does not certify every action or backend.
214
- The live-pass count covers only the scenarios in the
215
- [latest retest report](docs/main-live-retest-2026-10-30.md), with
216
- [sanitized evidence](docs/main-live-retest-2026-10-30.json). API policy, asynchronous
217
- completion, production HTTPS/client compatibility, load, and guest I/O limits
218
- are stated there. All test resources were cleaned up; the final audit found zero
219
- remaining test resources across 24 categories. See also
220
- [API prerequisites and result semantics](#api-prerequisites-and-result-semantics).
186
+ ✅ denotes an implemented API path, not certification of every action or
187
+ OpenStack deployment. **⚠️ Live unverified** identifies paths without successful
188
+ live validation; **❌ Not implemented** identifies unavailable capabilities.
189
+ Service availability, permissions, and asynchronous completion affect results.
190
+ See [API prerequisites and result semantics](#api-prerequisites-and-result-semantics)
191
+ and the [multi-user setup guide](docs/multi-user-guide.md).
221
192
 
222
193
  **Detailed Mapping by Category**
223
194
 
@@ -225,10 +196,10 @@ remaining test resources across 24 categories. See also
225
196
 
226
197
  | OpenStack CLI Command | MCP Tool | Status | Notes |
227
198
  |---------------------|---------|------|------|
228
- | `openstack server list` | `get_instance` | ✅ | **NEW UNIFIED** - Pagination, filtering support |
229
- | `openstack server show` | `get_instance` | ✅ | **ENHANCED** - Replaces get_instance_by_name, get_instance_by_id |
199
+ | `openstack server list` | `get_instance` | ✅ | Separate reader projects each returned exactly ten owned VMs; bounded lab validation only |
200
+ | `openstack server show` | `get_instance` | ✅ | Own fixture queries completed; foreign private ID returned no details; no 16-owned-ID batch claim |
230
201
  | `openstack server create` | `set_instance` (action="create") | ✅ | **ENHANCED** - Bulk creation support |
231
- | `openstack server start/stop/reboot` | `set_instance` | ✅ | **ENHANCED** - Bulk operations with filtering |
202
+ | `openstack server start/stop/reboot` | `set_instance` | ✅ | Bulk stop/start final states verified for two test VMs per project; reboot not retested in this round |
232
203
  | `openstack server delete` | `set_instance` (action="delete") | ✅ | **ENHANCED** - Bulk deletion with name_contains filtering |
233
204
  | `openstack server backup create` | `set_server_backup` | ✅ | Nova backup action with rotation; asynchronous, no custom metadata |
234
205
  | `openstack server image create` | `set_instance` (action="snapshot") | ✅ | Image/snapshot creation |
@@ -258,33 +229,33 @@ remaining test resources across 24 categories. See also
258
229
  | `openstack server remove fixed ip` | `set_server_fixed_ip` (action="remove") | ✅ | Fixed IP removal |
259
230
  | `openstack server add security group` | `set_server_security_group` (action="add") | ✅ | Security group addition |
260
231
  | `openstack server remove security group` | `set_server_security_group` (action="remove") | ✅ | Security group removal |
261
- | `openstack server add volume` | `set_server_volume` (action="attach") | ✅ | Volume attachment |
262
- | `openstack server remove volume` | `set_server_volume` (action="detach") | ✅ | Volume detachment |
232
+ | `openstack server add volume` | `set_server_volume` (action="attach") | ✅ | Member attach reached in-use via set_server_volume; guest I/O not tested |
233
+ | `openstack server remove volume` | `set_server_volume` (action="detach") | ✅ | Member detach reached available via set_server_volume |
263
234
  | `openstack server set` | `set_server_properties` (action="set") | ✅ | Server property setting |
264
235
  | `openstack server unset` | `set_server_properties` (action="unset") | ✅ | Server property unsetting |
265
236
  | `openstack server dump create` | `set_server_dump` | ❌ Unsupported | Returns an explicit unsupported result; no dump is created |
266
- | `openstack server event list` | `get_server_events` | ✅ | Server event tracking |
237
+ | `openstack server event list` | `get_server_events` | ✅ | Pass the server name or UUID via `instance_name`, not `server_id`; event visibility follows Nova policy |
267
238
  | `openstack server group list` | `get_server_groups` | ✅ | Server group listing |
268
239
  | `openstack server group create/delete` | `set_server_group` | ✅ | Server group management |
269
240
  | `openstack flavor list` | `set_flavor` (action="list") | ✅ | Requires modification tools to be enabled for registration |
270
241
  | `openstack flavor create/delete` | `set_flavor` | ✅ | Flavor management |
271
- | `openstack keypair list` | `get_keypair_list` | ✅ | Keypair listing |
272
- | `openstack keypair create/delete` | `set_keypair` | ✅ | Keypair management |
273
- | `openstack hypervisor list` | `get_hypervisor_details` | ✅ | Hypervisor querying |
274
- | `openstack availability zone list` | `get_availability_zones` | ✅ | Availability zone listing |
242
+ | `openstack keypair list` | `get_keypair_list` | ✅ | Empty scoped read completed; member keypair creation/deletion read-back tested separately |
243
+ | `openstack keypair create/delete` | `set_keypair` | ✅ | Explicit member MCP create/delete read-back passed; no successful Claude write workflow claimed |
244
+ | `openstack hypervisor list` | `get_hypervisor_details` | ⚠️ Live unverified | Reader policy denial; successful administrator MCP lookup was not obtained in this round |
245
+ | `openstack availability zone list` | `get_availability_zones` | ⚠️ Live unverified | Only policy-limited composite requests in this round; individual result not independently attributed |
275
246
 
276
247
  ### 2. 🌐 **Network (Neutron)**
277
248
 
278
249
  | OpenStack CLI Command | MCP Tool | Status | Notes |
279
250
  |---------------------|---------|------|------|
280
- | `openstack network list` | `get_network_details` | ✅ | Detailed network information |
281
- | `openstack network show` | `get_network_details` (name param) | ✅ | Specific network query |
282
- | `openstack network create` | `set_networks` (action="create") | ✅ | **ENHANCED** - Bulk network creation |
283
- | `openstack network delete` | `set_networks` (action="delete") | ✅ | **ENHANCED** - Bulk deletion with filtering |
251
+ | `openstack network list` | `get_network_details` | ✅ | Two owned private networks plus one policy-visible shared external network per reader; no other test project private networks |
252
+ | `openstack network show` | `get_network_details` (network_name) | ⚠️ Live unverified | Foreign-ID negative checked; dual-project positive named reader lookup not independently asserted |
253
+ | `openstack network create` | `set_networks` (action="create") | ✅ | Default mtu=0 omits the wire field: backend MTU 1450 verified; explicit 1400 retained in both member projects |
254
+ | `openstack network delete` | `set_networks` (action="delete") | ✅ | Both default/explicit-MTU test networks removed through actual TCP MCP, API absence confirmed |
284
255
  | `openstack network set` | `set_networks` (action="update") | ✅ | **ENHANCED** - Bulk updates |
285
- | `openstack subnet list` | `get_network_details` (includes subnets) | ✅ | Subnet information included |
286
- | `openstack subnet create/delete` | `set_subnets` | ✅ | Subnet management |
287
- | `openstack router list` | `get_routers` | ✅ | Router listing |
256
+ | `openstack subnet list` | `get_network_details` (includes subnets) | ✅ | Owned and shared external network subnets returned; three visible subnets per test reader |
257
+ | `openstack subnet create/delete` | `set_subnets` | ✅ | Member TCP MCP subnet create read back; deletion allowed parent network removal in both projects |
258
+ | `openstack router list` | `get_routers` | ⚠️ Live unverified | Only part of composite error requests in this round; no independent reader result attribution |
288
259
  | `openstack router create/delete` | `set_routers` | ✅ | Project-owned routers; attached interfaces are not removed automatically |
289
260
  | `openstack floating ip list` | `get_floating_ips` | ✅ | Floating IP listing |
290
261
  | `openstack floating ip create` | `set_floating_ip` (action="create") | ✅ | Floating IP creation |
@@ -292,38 +263,38 @@ remaining test resources across 24 categories. See also
292
263
  | `openstack floating ip set` | `set_floating_ip` (action="set") | ✅ | Floating IP property setting |
293
264
  | `openstack floating ip show` | `set_floating_ip` (action="show") | ✅ | Floating IP details |
294
265
  | `openstack floating ip unset` | `set_floating_ip` (action="unset") | ✅ | Floating IP property clearing |
295
- | `openstack floating ip pool list` | `get_floating_ip_pools` | ✅ | Floating IP pool listing |
266
+ | `openstack floating ip pool list` | `get_floating_ip_pools` | ⚠️ Live unverified | Composite result not independently attributed; available global pool capacity remains unknown |
296
267
  | `openstack floating ip port forwarding create` | `set_floating_ip_port_forwarding` (action="create") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
297
268
  | `openstack floating ip port forwarding delete` | `set_floating_ip_port_forwarding` (action="delete") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
298
269
  | `openstack floating ip port forwarding list` | `set_floating_ip_port_forwarding` (action="list") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
299
270
  | `openstack floating ip port forwarding set` | `set_floating_ip_port_forwarding` (action="set") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
300
271
  | `openstack floating ip port forwarding show` | `set_floating_ip_port_forwarding` (action="show") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
301
- | `openstack security group list` | `get_security_groups` | ✅ | Security group listing |
272
+ | `openstack security group list` | `get_security_groups` | ✅ | Scoped reader list completed; default and test groups visible |
302
273
  | `openstack security group create/delete` | `set_security_groups` | ✅ | Project-owned security groups |
303
- | `openstack port list` | `get_network_details` (includes ports) | ✅ | Port information included |
274
+ | `openstack port list` | `set_network_ports` (action="list") | ⚠️ Live unverified | Implemented list action requires modification-tool registration; not exercised in this round |
304
275
  | `openstack port create/delete` | `set_network_ports` | ✅ | Port management |
305
276
  | `openstack network qos policy list` | `get_network_qos_policies` | ⚠️ Live unverified | Implemented; test platform QoS endpoint returns HTTP 404 |
306
277
  | `openstack network qos policy create` | `set_network_qos_policies` | ⚠️ Live unverified | Implemented; test platform QoS endpoint returns HTTP 404. Policy containers only; no bandwidth rules |
307
- | `openstack network agent list` | `get_service_status` (includes agents) | ✅ | Network agents |
278
+ | `openstack network agent list` | `get_service_status` (includes agents) | ⚠️ Live unverified | Reader service-policy restrictions; partial data is not proof of global health |
308
279
  | `openstack network agent set` | `set_network_agents` | ✅ | Enable/disable cloud-wide agents; usually admin-only |
309
280
 
310
281
  ### 3. 💾 **Storage (Cinder)**
311
282
 
312
283
  | OpenStack CLI Command | MCP Tool | Status | Notes |
313
284
  |---------------------|---------|------|------|
314
- | `openstack volume list` | `get_volume_list` | ✅ | Volume listing |
315
- | `openstack volume show` | `get_volume_list` (filtering) | ✅ | Specific volume query |
285
+ | `openstack volume list` | `get_volume_list` | ✅ | Exactly ten owned volumes per reader; no other test project volume IDs returned |
286
+ | `openstack volume show` | `get_volume_list` | ✅ | Listing-based client filtering; no dedicated get_volume_list filter argument |
316
287
  | `openstack volume create/delete` | `set_volume` | ✅ | Volume creation/deletion |
317
- | `openstack volume set` | `set_volume` (action="modify") | ✅ | Volume property modification |
288
+ | `openstack volume set` | — | ❌ Not implemented | set_volume has no modify/update action; do not send this unsupported action |
318
289
  | `openstack volume type list` | `get_volume_types` | ✅ | Volume type listing |
319
290
  | `openstack volume type create/delete` | `set_volume_types` | ✅ | Volume type management; usually admin-only |
320
- | `openstack volume snapshot list` | `get_volume_snapshots` | ✅ | Snapshot listing |
321
- | `openstack volume snapshot create/delete` | `set_snapshot` | ✅ | Snapshot management |
322
- | `openstack backup list` | `get_volume_backups` | ✅ | Current-project backup listing |
291
+ | `openstack volume snapshot list` | `get_volume_snapshots` | ✅ | Two owned base snapshots per reader; API final states checked |
292
+ | `openstack volume snapshot create/delete` | `set_snapshot` | ✅ | Explicit member MCP snapshots reached available and were deleted; no restore/I/O claim |
293
+ | `openstack backup list` | `get_volume_backups` | ✅ | Three owned available backups per reader; base backup creation used real Cinder APIs |
323
294
  | `openstack backup create/delete` | `set_volume_backups` | ✅ | Volume backup management |
324
295
  | `openstack volume transfer request list` | `get_volume_transfers` | ✅ | Request listing only; authorization keys are excluded |
325
296
  | `openstack server volume list` | `get_server_volumes` | ✅ | Server volume listing |
326
- | `openstack server add/remove volume` | `set_server_volume` | ✅ | Server volume attach/detach |
297
+ | `openstack server add/remove volume` | `set_server_volume` / `set_volume` (action="attach"/"detach") | ✅ | Both paths reached in-use then available in both member projects; foreign endpoints rejected; guest I/O not tested |
327
298
  | `openstack volume group list` | `get_volume_groups` | ✅ | Requires Cinder generic groups (API >= 3.13) |
328
299
  | `openstack volume group create` | `set_volume_groups` | ✅ | Create/list/show/delete; create requires group_type and volume_types |
329
300
  | `openstack volume qos list` | `get_volume_qos` | ✅ | Cinder QoS specifications; subject to cloud policy |
@@ -349,22 +320,22 @@ remaining test resources across 24 categories. See also
349
320
 
350
321
  | OpenStack CLI Command | MCP Tool | Status | Notes |
351
322
  |---------------------|---------|------|------|
352
- | `openstack user list` | `get_user_list` | ✅ | User listing |
353
- | `openstack user show` | `get_user_list` (filtering) | ✅ | Specific user query |
323
+ | `openstack user list` | `get_user_list` | ⚠️ Live unverified | Reader denied by Keystone; explicit MCP failure observed; successful listing not validated in this round |
324
+ | `openstack user show` | `get_user_list` | ⚠️ Live unverified | Depends on policy-limited user listing; not independently validated for the new readers |
354
325
  | `openstack user create/delete` | `set_users` | ✅ | Password from a server environment variable; no role grants |
355
326
  | `openstack project list` | `get_project_details` | ✅ | Project listing |
356
327
  | `openstack project show` | `get_project_details` (name param) | ✅ | Specific project query |
357
328
  | `openstack project create/delete` | `set_project` | ✅ | Project management |
358
329
  | `openstack role list` | `get_role_assignments` | ✅ | Role listing |
359
- | `openstack role assignment list` | `get_role_assignments` | ✅ | Role assignment listing |
330
+ | `openstack role assignment list` | `get_role_assignments` | ⚠️ Live unverified | Reader Keystone policy denial; not a successful data lookup |
360
331
  | `openstack role create/delete` | `set_roles` | ✅ | Role management |
361
332
  | `openstack domain list` | `get_domains` | ✅ | Subject to Keystone policy |
362
333
  | `openstack domain create/delete` | `set_domains` | ✅ | Disable explicitly with update before delete |
363
334
  | `openstack group list` | `get_identity_groups` | ✅ | Subject to Keystone policy |
364
335
  | `openstack group create/delete` | `set_identity_groups` | ✅ | Group management |
365
- | `openstack service list` | `get_service_status` | ✅ | Service listing |
336
+ | `openstack service list` | `get_service_status` | ⚠️ Live unverified | Reader service-policy restrictions; partial data is not proof of global health |
366
337
  | `openstack service create/delete` | `set_services` | ✅ | Service management |
367
- | `openstack endpoint list` | `get_service_status` (includes endpoints) | ✅ | Endpoint information |
338
+ | `openstack endpoint list` | `get_service_status` (includes endpoints) | ⚠️ Live unverified | Reader service-policy restrictions; partial data is not proof of global health |
368
339
 
369
340
  ### 6. 🔥 **Orchestration (Heat)**
370
341
 
@@ -479,9 +450,9 @@ remaining test resources across 24 categories. See also
479
450
 
480
451
  | OpenStack CLI Command | MCP Tool | Status | Notes |
481
452
  |---------------------|---------|------|------|
482
- | Resource monitoring | `get_resource_monitoring` | ✅ | Project allocations, separate quotas and visible hypervisor capacity; no live utilization |
483
- | Service status | `get_service_status` | ✅ | Service status query |
484
- | Cluster overview | `get_service_status` + `get_resource_monitoring` | ✅ | Service probes and current inventory |
453
+ | Resource monitoring | `get_resource_monitoring` | ⚠️ Live unverified | Reader physical-capacity policy restrictions; allocations are separate from capacity; no live utilization |
454
+ | Service status | `get_service_status` | ⚠️ Live unverified | Reader service-policy restrictions; partial data is not proof of global health |
455
+ | Cluster overview | `get_service_status` + `get_resource_monitoring` | ⚠️ Live unverified | Reader physical-capacity policy restrictions; allocations are separate from capacity; no live utilization |
485
456
  | Service log metadata | `set_service_logs` | Partial | Service listing only; log retrieval is unavailable without a logging backend |
486
457
  | Resource metadata | `set_metrics` | Partial | list/summary only; telemetry sample retrieval is unavailable |
487
458
  | Alarm management | `set_alarms` | ⚠️ Live unverified | Implemented; Aodh/Gnocchi unavailable in the test platform. Requires services and collected metrics |
@@ -497,13 +468,13 @@ remaining test resources across 24 categories. See also
497
468
  | `openstack quota delete` | `set_quota` (action="delete") | ✅ | Resets all three service quotas to defaults; requires modification tools |
498
469
  | `openstack usage show` | `get_usage_statistics` | ✅ | Current-project Nova simple tenant usage; not monetary charges |
499
470
  | `openstack limits show` | `get_quota` (includes limits) | ✅ | Limits query |
500
- | Resource allocations | `get_resource_monitoring` | ✅ | Flavor allocations; not CPU load or resident memory samples |
471
+ | Resource allocations | `get_resource_monitoring` | ⚠️ Live unverified | Reader physical-capacity policy restrictions; allocations are separate from capacity; no live utilization |
501
472
 
502
473
  ---
503
474
 
504
475
  ### API prerequisites and result semantics
505
476
 
506
- 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.
477
+ The feature table marks implemented API paths, not verification against every OpenStack deployment. Service and policy requirements must be checked in the target deployment. A missing service, extension, required microversion, or permission is an operation failure, not an empty successful result.
507
478
 
508
479
  - **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.
509
480
  - **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.
@@ -705,7 +676,7 @@ unset OPENSTACK_MCP_TOKEN
705
676
  ```
706
677
 
707
678
  This Bearer configuration uses the server's configured OpenStack account. For
708
- experimental per-user authentication, see the [phase 1 guide](docs/multi-user-phase1.md).
679
+ experimental per-user authentication, see the [multi-user guide](docs/multi-user-guide.md).
709
680
  See also the [Claude Code MCP documentation](https://code.claude.com/docs/en/mcp).
710
681
 
711
682
  ## Server Configuration
@@ -1020,7 +991,7 @@ get_instance_details(limit=50, offset=50) # Next 50 instances
1020
991
  get_instance_details(include_all=True) # All instances (use with caution)
1021
992
 
1022
993
  # Optimized search for large datasets
1023
- search_instances("web", "name", limit=20) # Search with reasonable limit
994
+ search_instances("web", "name", limit=20, offset=0, case_sensitive=False)
1024
995
  ```
1025
996
 
1026
997
  ---
@@ -24,7 +24,7 @@
24
24
  ## Features
25
25
 
26
26
  Experimental per-user remote connections are available for testing with the
27
- opt-in `--multi-user` mode. See the [phase 1 setup and validation guide](docs/multi-user-phase1.md)
27
+ opt-in `--multi-user` mode. See the [multi-user setup and usage guide](docs/multi-user-guide.md)
28
28
  for authentication, client limitations, and the test checklist. Administrator
29
29
  cross-project queries are outside this phase.
30
30
 
@@ -159,47 +159,18 @@ Post-Action Status:
159
159
  ### **Unified Resource Queries**
160
160
  New consolidated `get_instance` tool replaces multiple separate tools:
161
161
  - ❌ Old: `get_instance_details`, `get_instance_info`, `get_instance_status`, `get_instance_network_info`
162
- - ✅ New: `get_instance(instance_names="vm1,vm2")` - Single tool, comprehensive information
162
+ - ✅ New: `get_instance(names="vm1,vm2")` - Single tool, comprehensive information
163
163
 
164
164
  ---
165
165
 
166
166
  ## 📊 OpenStack CLI vs MCP Tools Mapping
167
167
 
168
- **Validation snapshot — 2026-10-30** (main working tree based on `dd98993`,
169
- with the uncommitted fixes described in the report):
170
-
171
- <table border="1" rules="cols">
172
- <thead>
173
- <tr><th>Verification type</th><th>Item</th><th>Result</th></tr>
174
- </thead>
175
- <tbody>
176
- <tr><td rowspan="5">Live tool checks</td><td>Registered tools invoked and classified</td><td><strong>105</strong></td></tr>
177
- <tr><td>Passed within the exercised live scenarios</td><td><strong>74</strong></td></tr>
178
- <tr><td>Implemented, live unverified: service/API unavailable</td><td><strong>28</strong></td></tr>
179
- <tr><td>Intentional capability limitations</td><td><strong>3</strong></td></tr>
180
- <tr><td>Reproduced code defects / state-check timeouts in the retest</td><td><strong>0 / 0</strong></td></tr>
181
- <tr><td>Local unit tests</td><td>Test cases in <code>tests/test_*.py</code></td><td><strong>160/160 (100%)</strong></td></tr>
182
- </tbody>
183
- </table>
184
-
185
- State polling allowed 180 seconds; soft reboot completed in 131.66 seconds
186
- (previously it exceeded the 90-second check). No reboot implementation change
187
- was needed.
188
-
189
- The 10 previously reproduced tool defects were corrected. The 28 unavailable
190
- paths are **not live-validated successes**: 24 Octavia tools, two Neutron QoS
191
- tools, one Aodh tool, and one Neutron port-forwarding tool. Each affected table
192
- row is marked **⚠️ Live unverified**. An absent tool/action is marked **❌ Not
193
- implemented** rather than presented as an available feature.
194
-
195
- ✅ means an implemented API path; it does not certify every action or backend.
196
- The live-pass count covers only the scenarios in the
197
- [latest retest report](docs/main-live-retest-2026-10-30.md), with
198
- [sanitized evidence](docs/main-live-retest-2026-10-30.json). API policy, asynchronous
199
- completion, production HTTPS/client compatibility, load, and guest I/O limits
200
- are stated there. All test resources were cleaned up; the final audit found zero
201
- remaining test resources across 24 categories. See also
202
- [API prerequisites and result semantics](#api-prerequisites-and-result-semantics).
168
+ ✅ denotes an implemented API path, not certification of every action or
169
+ OpenStack deployment. **⚠️ Live unverified** identifies paths without successful
170
+ live validation; **❌ Not implemented** identifies unavailable capabilities.
171
+ Service availability, permissions, and asynchronous completion affect results.
172
+ See [API prerequisites and result semantics](#api-prerequisites-and-result-semantics)
173
+ and the [multi-user setup guide](docs/multi-user-guide.md).
203
174
 
204
175
  **Detailed Mapping by Category**
205
176
 
@@ -207,10 +178,10 @@ remaining test resources across 24 categories. See also
207
178
 
208
179
  | OpenStack CLI Command | MCP Tool | Status | Notes |
209
180
  |---------------------|---------|------|------|
210
- | `openstack server list` | `get_instance` | ✅ | **NEW UNIFIED** - Pagination, filtering support |
211
- | `openstack server show` | `get_instance` | ✅ | **ENHANCED** - Replaces get_instance_by_name, get_instance_by_id |
181
+ | `openstack server list` | `get_instance` | ✅ | Separate reader projects each returned exactly ten owned VMs; bounded lab validation only |
182
+ | `openstack server show` | `get_instance` | ✅ | Own fixture queries completed; foreign private ID returned no details; no 16-owned-ID batch claim |
212
183
  | `openstack server create` | `set_instance` (action="create") | ✅ | **ENHANCED** - Bulk creation support |
213
- | `openstack server start/stop/reboot` | `set_instance` | ✅ | **ENHANCED** - Bulk operations with filtering |
184
+ | `openstack server start/stop/reboot` | `set_instance` | ✅ | Bulk stop/start final states verified for two test VMs per project; reboot not retested in this round |
214
185
  | `openstack server delete` | `set_instance` (action="delete") | ✅ | **ENHANCED** - Bulk deletion with name_contains filtering |
215
186
  | `openstack server backup create` | `set_server_backup` | ✅ | Nova backup action with rotation; asynchronous, no custom metadata |
216
187
  | `openstack server image create` | `set_instance` (action="snapshot") | ✅ | Image/snapshot creation |
@@ -240,33 +211,33 @@ remaining test resources across 24 categories. See also
240
211
  | `openstack server remove fixed ip` | `set_server_fixed_ip` (action="remove") | ✅ | Fixed IP removal |
241
212
  | `openstack server add security group` | `set_server_security_group` (action="add") | ✅ | Security group addition |
242
213
  | `openstack server remove security group` | `set_server_security_group` (action="remove") | ✅ | Security group removal |
243
- | `openstack server add volume` | `set_server_volume` (action="attach") | ✅ | Volume attachment |
244
- | `openstack server remove volume` | `set_server_volume` (action="detach") | ✅ | Volume detachment |
214
+ | `openstack server add volume` | `set_server_volume` (action="attach") | ✅ | Member attach reached in-use via set_server_volume; guest I/O not tested |
215
+ | `openstack server remove volume` | `set_server_volume` (action="detach") | ✅ | Member detach reached available via set_server_volume |
245
216
  | `openstack server set` | `set_server_properties` (action="set") | ✅ | Server property setting |
246
217
  | `openstack server unset` | `set_server_properties` (action="unset") | ✅ | Server property unsetting |
247
218
  | `openstack server dump create` | `set_server_dump` | ❌ Unsupported | Returns an explicit unsupported result; no dump is created |
248
- | `openstack server event list` | `get_server_events` | ✅ | Server event tracking |
219
+ | `openstack server event list` | `get_server_events` | ✅ | Pass the server name or UUID via `instance_name`, not `server_id`; event visibility follows Nova policy |
249
220
  | `openstack server group list` | `get_server_groups` | ✅ | Server group listing |
250
221
  | `openstack server group create/delete` | `set_server_group` | ✅ | Server group management |
251
222
  | `openstack flavor list` | `set_flavor` (action="list") | ✅ | Requires modification tools to be enabled for registration |
252
223
  | `openstack flavor create/delete` | `set_flavor` | ✅ | Flavor management |
253
- | `openstack keypair list` | `get_keypair_list` | ✅ | Keypair listing |
254
- | `openstack keypair create/delete` | `set_keypair` | ✅ | Keypair management |
255
- | `openstack hypervisor list` | `get_hypervisor_details` | ✅ | Hypervisor querying |
256
- | `openstack availability zone list` | `get_availability_zones` | ✅ | Availability zone listing |
224
+ | `openstack keypair list` | `get_keypair_list` | ✅ | Empty scoped read completed; member keypair creation/deletion read-back tested separately |
225
+ | `openstack keypair create/delete` | `set_keypair` | ✅ | Explicit member MCP create/delete read-back passed; no successful Claude write workflow claimed |
226
+ | `openstack hypervisor list` | `get_hypervisor_details` | ⚠️ Live unverified | Reader policy denial; successful administrator MCP lookup was not obtained in this round |
227
+ | `openstack availability zone list` | `get_availability_zones` | ⚠️ Live unverified | Only policy-limited composite requests in this round; individual result not independently attributed |
257
228
 
258
229
  ### 2. 🌐 **Network (Neutron)**
259
230
 
260
231
  | OpenStack CLI Command | MCP Tool | Status | Notes |
261
232
  |---------------------|---------|------|------|
262
- | `openstack network list` | `get_network_details` | ✅ | Detailed network information |
263
- | `openstack network show` | `get_network_details` (name param) | ✅ | Specific network query |
264
- | `openstack network create` | `set_networks` (action="create") | ✅ | **ENHANCED** - Bulk network creation |
265
- | `openstack network delete` | `set_networks` (action="delete") | ✅ | **ENHANCED** - Bulk deletion with filtering |
233
+ | `openstack network list` | `get_network_details` | ✅ | Two owned private networks plus one policy-visible shared external network per reader; no other test project private networks |
234
+ | `openstack network show` | `get_network_details` (network_name) | ⚠️ Live unverified | Foreign-ID negative checked; dual-project positive named reader lookup not independently asserted |
235
+ | `openstack network create` | `set_networks` (action="create") | ✅ | Default mtu=0 omits the wire field: backend MTU 1450 verified; explicit 1400 retained in both member projects |
236
+ | `openstack network delete` | `set_networks` (action="delete") | ✅ | Both default/explicit-MTU test networks removed through actual TCP MCP, API absence confirmed |
266
237
  | `openstack network set` | `set_networks` (action="update") | ✅ | **ENHANCED** - Bulk updates |
267
- | `openstack subnet list` | `get_network_details` (includes subnets) | ✅ | Subnet information included |
268
- | `openstack subnet create/delete` | `set_subnets` | ✅ | Subnet management |
269
- | `openstack router list` | `get_routers` | ✅ | Router listing |
238
+ | `openstack subnet list` | `get_network_details` (includes subnets) | ✅ | Owned and shared external network subnets returned; three visible subnets per test reader |
239
+ | `openstack subnet create/delete` | `set_subnets` | ✅ | Member TCP MCP subnet create read back; deletion allowed parent network removal in both projects |
240
+ | `openstack router list` | `get_routers` | ⚠️ Live unverified | Only part of composite error requests in this round; no independent reader result attribution |
270
241
  | `openstack router create/delete` | `set_routers` | ✅ | Project-owned routers; attached interfaces are not removed automatically |
271
242
  | `openstack floating ip list` | `get_floating_ips` | ✅ | Floating IP listing |
272
243
  | `openstack floating ip create` | `set_floating_ip` (action="create") | ✅ | Floating IP creation |
@@ -274,38 +245,38 @@ remaining test resources across 24 categories. See also
274
245
  | `openstack floating ip set` | `set_floating_ip` (action="set") | ✅ | Floating IP property setting |
275
246
  | `openstack floating ip show` | `set_floating_ip` (action="show") | ✅ | Floating IP details |
276
247
  | `openstack floating ip unset` | `set_floating_ip` (action="unset") | ✅ | Floating IP property clearing |
277
- | `openstack floating ip pool list` | `get_floating_ip_pools` | ✅ | Floating IP pool listing |
248
+ | `openstack floating ip pool list` | `get_floating_ip_pools` | ⚠️ Live unverified | Composite result not independently attributed; available global pool capacity remains unknown |
278
249
  | `openstack floating ip port forwarding create` | `set_floating_ip_port_forwarding` (action="create") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
279
250
  | `openstack floating ip port forwarding delete` | `set_floating_ip_port_forwarding` (action="delete") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
280
251
  | `openstack floating ip port forwarding list` | `set_floating_ip_port_forwarding` (action="list") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
281
252
  | `openstack floating ip port forwarding set` | `set_floating_ip_port_forwarding` (action="set") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
282
253
  | `openstack floating ip port forwarding show` | `set_floating_ip_port_forwarding` (action="show") | ⚠️ Live unverified | Implemented; test platform port-forwarding endpoint returns HTTP 404 |
283
- | `openstack security group list` | `get_security_groups` | ✅ | Security group listing |
254
+ | `openstack security group list` | `get_security_groups` | ✅ | Scoped reader list completed; default and test groups visible |
284
255
  | `openstack security group create/delete` | `set_security_groups` | ✅ | Project-owned security groups |
285
- | `openstack port list` | `get_network_details` (includes ports) | ✅ | Port information included |
256
+ | `openstack port list` | `set_network_ports` (action="list") | ⚠️ Live unverified | Implemented list action requires modification-tool registration; not exercised in this round |
286
257
  | `openstack port create/delete` | `set_network_ports` | ✅ | Port management |
287
258
  | `openstack network qos policy list` | `get_network_qos_policies` | ⚠️ Live unverified | Implemented; test platform QoS endpoint returns HTTP 404 |
288
259
  | `openstack network qos policy create` | `set_network_qos_policies` | ⚠️ Live unverified | Implemented; test platform QoS endpoint returns HTTP 404. Policy containers only; no bandwidth rules |
289
- | `openstack network agent list` | `get_service_status` (includes agents) | ✅ | Network agents |
260
+ | `openstack network agent list` | `get_service_status` (includes agents) | ⚠️ Live unverified | Reader service-policy restrictions; partial data is not proof of global health |
290
261
  | `openstack network agent set` | `set_network_agents` | ✅ | Enable/disable cloud-wide agents; usually admin-only |
291
262
 
292
263
  ### 3. 💾 **Storage (Cinder)**
293
264
 
294
265
  | OpenStack CLI Command | MCP Tool | Status | Notes |
295
266
  |---------------------|---------|------|------|
296
- | `openstack volume list` | `get_volume_list` | ✅ | Volume listing |
297
- | `openstack volume show` | `get_volume_list` (filtering) | ✅ | Specific volume query |
267
+ | `openstack volume list` | `get_volume_list` | ✅ | Exactly ten owned volumes per reader; no other test project volume IDs returned |
268
+ | `openstack volume show` | `get_volume_list` | ✅ | Listing-based client filtering; no dedicated get_volume_list filter argument |
298
269
  | `openstack volume create/delete` | `set_volume` | ✅ | Volume creation/deletion |
299
- | `openstack volume set` | `set_volume` (action="modify") | ✅ | Volume property modification |
270
+ | `openstack volume set` | — | ❌ Not implemented | set_volume has no modify/update action; do not send this unsupported action |
300
271
  | `openstack volume type list` | `get_volume_types` | ✅ | Volume type listing |
301
272
  | `openstack volume type create/delete` | `set_volume_types` | ✅ | Volume type management; usually admin-only |
302
- | `openstack volume snapshot list` | `get_volume_snapshots` | ✅ | Snapshot listing |
303
- | `openstack volume snapshot create/delete` | `set_snapshot` | ✅ | Snapshot management |
304
- | `openstack backup list` | `get_volume_backups` | ✅ | Current-project backup listing |
273
+ | `openstack volume snapshot list` | `get_volume_snapshots` | ✅ | Two owned base snapshots per reader; API final states checked |
274
+ | `openstack volume snapshot create/delete` | `set_snapshot` | ✅ | Explicit member MCP snapshots reached available and were deleted; no restore/I/O claim |
275
+ | `openstack backup list` | `get_volume_backups` | ✅ | Three owned available backups per reader; base backup creation used real Cinder APIs |
305
276
  | `openstack backup create/delete` | `set_volume_backups` | ✅ | Volume backup management |
306
277
  | `openstack volume transfer request list` | `get_volume_transfers` | ✅ | Request listing only; authorization keys are excluded |
307
278
  | `openstack server volume list` | `get_server_volumes` | ✅ | Server volume listing |
308
- | `openstack server add/remove volume` | `set_server_volume` | ✅ | Server volume attach/detach |
279
+ | `openstack server add/remove volume` | `set_server_volume` / `set_volume` (action="attach"/"detach") | ✅ | Both paths reached in-use then available in both member projects; foreign endpoints rejected; guest I/O not tested |
309
280
  | `openstack volume group list` | `get_volume_groups` | ✅ | Requires Cinder generic groups (API >= 3.13) |
310
281
  | `openstack volume group create` | `set_volume_groups` | ✅ | Create/list/show/delete; create requires group_type and volume_types |
311
282
  | `openstack volume qos list` | `get_volume_qos` | ✅ | Cinder QoS specifications; subject to cloud policy |
@@ -331,22 +302,22 @@ remaining test resources across 24 categories. See also
331
302
 
332
303
  | OpenStack CLI Command | MCP Tool | Status | Notes |
333
304
  |---------------------|---------|------|------|
334
- | `openstack user list` | `get_user_list` | ✅ | User listing |
335
- | `openstack user show` | `get_user_list` (filtering) | ✅ | Specific user query |
305
+ | `openstack user list` | `get_user_list` | ⚠️ Live unverified | Reader denied by Keystone; explicit MCP failure observed; successful listing not validated in this round |
306
+ | `openstack user show` | `get_user_list` | ⚠️ Live unverified | Depends on policy-limited user listing; not independently validated for the new readers |
336
307
  | `openstack user create/delete` | `set_users` | ✅ | Password from a server environment variable; no role grants |
337
308
  | `openstack project list` | `get_project_details` | ✅ | Project listing |
338
309
  | `openstack project show` | `get_project_details` (name param) | ✅ | Specific project query |
339
310
  | `openstack project create/delete` | `set_project` | ✅ | Project management |
340
311
  | `openstack role list` | `get_role_assignments` | ✅ | Role listing |
341
- | `openstack role assignment list` | `get_role_assignments` | ✅ | Role assignment listing |
312
+ | `openstack role assignment list` | `get_role_assignments` | ⚠️ Live unverified | Reader Keystone policy denial; not a successful data lookup |
342
313
  | `openstack role create/delete` | `set_roles` | ✅ | Role management |
343
314
  | `openstack domain list` | `get_domains` | ✅ | Subject to Keystone policy |
344
315
  | `openstack domain create/delete` | `set_domains` | ✅ | Disable explicitly with update before delete |
345
316
  | `openstack group list` | `get_identity_groups` | ✅ | Subject to Keystone policy |
346
317
  | `openstack group create/delete` | `set_identity_groups` | ✅ | Group management |
347
- | `openstack service list` | `get_service_status` | ✅ | Service listing |
318
+ | `openstack service list` | `get_service_status` | ⚠️ Live unverified | Reader service-policy restrictions; partial data is not proof of global health |
348
319
  | `openstack service create/delete` | `set_services` | ✅ | Service management |
349
- | `openstack endpoint list` | `get_service_status` (includes endpoints) | ✅ | Endpoint information |
320
+ | `openstack endpoint list` | `get_service_status` (includes endpoints) | ⚠️ Live unverified | Reader service-policy restrictions; partial data is not proof of global health |
350
321
 
351
322
  ### 6. 🔥 **Orchestration (Heat)**
352
323
 
@@ -461,9 +432,9 @@ remaining test resources across 24 categories. See also
461
432
 
462
433
  | OpenStack CLI Command | MCP Tool | Status | Notes |
463
434
  |---------------------|---------|------|------|
464
- | Resource monitoring | `get_resource_monitoring` | ✅ | Project allocations, separate quotas and visible hypervisor capacity; no live utilization |
465
- | Service status | `get_service_status` | ✅ | Service status query |
466
- | Cluster overview | `get_service_status` + `get_resource_monitoring` | ✅ | Service probes and current inventory |
435
+ | Resource monitoring | `get_resource_monitoring` | ⚠️ Live unverified | Reader physical-capacity policy restrictions; allocations are separate from capacity; no live utilization |
436
+ | Service status | `get_service_status` | ⚠️ Live unverified | Reader service-policy restrictions; partial data is not proof of global health |
437
+ | Cluster overview | `get_service_status` + `get_resource_monitoring` | ⚠️ Live unverified | Reader physical-capacity policy restrictions; allocations are separate from capacity; no live utilization |
467
438
  | Service log metadata | `set_service_logs` | Partial | Service listing only; log retrieval is unavailable without a logging backend |
468
439
  | Resource metadata | `set_metrics` | Partial | list/summary only; telemetry sample retrieval is unavailable |
469
440
  | Alarm management | `set_alarms` | ⚠️ Live unverified | Implemented; Aodh/Gnocchi unavailable in the test platform. Requires services and collected metrics |
@@ -479,13 +450,13 @@ remaining test resources across 24 categories. See also
479
450
  | `openstack quota delete` | `set_quota` (action="delete") | ✅ | Resets all three service quotas to defaults; requires modification tools |
480
451
  | `openstack usage show` | `get_usage_statistics` | ✅ | Current-project Nova simple tenant usage; not monetary charges |
481
452
  | `openstack limits show` | `get_quota` (includes limits) | ✅ | Limits query |
482
- | Resource allocations | `get_resource_monitoring` | ✅ | Flavor allocations; not CPU load or resident memory samples |
453
+ | Resource allocations | `get_resource_monitoring` | ⚠️ Live unverified | Reader physical-capacity policy restrictions; allocations are separate from capacity; no live utilization |
483
454
 
484
455
  ---
485
456
 
486
457
  ### API prerequisites and result semantics
487
458
 
488
- 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.
459
+ The feature table marks implemented API paths, not verification against every OpenStack deployment. Service and policy requirements must be checked in the target deployment. A missing service, extension, required microversion, or permission is an operation failure, not an empty successful result.
489
460
 
490
461
  - **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.
491
462
  - **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.
@@ -687,7 +658,7 @@ unset OPENSTACK_MCP_TOKEN
687
658
  ```
688
659
 
689
660
  This Bearer configuration uses the server's configured OpenStack account. For
690
- experimental per-user authentication, see the [phase 1 guide](docs/multi-user-phase1.md).
661
+ experimental per-user authentication, see the [multi-user guide](docs/multi-user-guide.md).
691
662
  See also the [Claude Code MCP documentation](https://code.claude.com/docs/en/mcp).
692
663
 
693
664
  ## Server Configuration
@@ -1002,7 +973,7 @@ get_instance_details(limit=50, offset=50) # Next 50 instances
1002
973
  get_instance_details(include_all=True) # All instances (use with caution)
1003
974
 
1004
975
  # Optimized search for large datasets
1005
- search_instances("web", "name", limit=20) # Search with reasonable limit
976
+ search_instances("web", "name", limit=20, offset=0, case_sensitive=False)
1006
977
  ```
1007
978
 
1008
979
  ---