vmware-aiops 2.2.0__tar.gz → 2.3.1__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 (195) hide show
  1. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.claude-plugin/plugin.json +2 -2
  2. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.mcp.json +1 -1
  3. vmware_aiops-2.2.0/README.md → vmware_aiops-2.3.1/PKG-INFO +95 -2
  4. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/README-CN.md +70 -3
  5. vmware_aiops-2.2.0/PKG-INFO → vmware_aiops-2.3.1/README.md +71 -26
  6. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/RELEASE_NOTES.md +57 -0
  7. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/openclaw.plugin.json +2 -2
  8. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/package.json +2 -2
  9. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/pyproject.toml +3 -3
  10. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/server.json +3 -3
  11. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/SKILL.md +19 -14
  12. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/agent-guardrails.md +1 -1
  13. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/capabilities.md +23 -0
  14. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/cli-reference.md +1 -0
  15. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/setup-guide.md +41 -6
  16. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_atexit_handlers_do_not_accumulate.py +9 -8
  17. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_daemon_host_log_cycles.py +1 -1
  18. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_deploy_correctness.py +5 -0
  19. vmware_aiops-2.3.1/tests/eval/regression/test_login_without_vsphere_role.py +225 -0
  20. vmware_aiops-2.3.1/tests/eval/regression/test_ova_network_mapping.py +107 -0
  21. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_session_probe_eviction.py +27 -7
  22. vmware_aiops-2.3.1/tests/test_access_info.py +154 -0
  23. vmware_aiops-2.3.1/tests/test_concurrent_local_state.py +181 -0
  24. vmware_aiops-2.3.1/tests/test_session_pool.py +220 -0
  25. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/uv.lock +7 -7
  26. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/__init__.py +1 -1
  27. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/_fsutil.py +22 -0
  28. vmware_aiops-2.3.1/vmware_aiops/access_requirements.py +207 -0
  29. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/_common.py +19 -2
  30. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/_root.py +2 -0
  31. vmware_aiops-2.3.1/vmware_aiops/cli/access.py +46 -0
  32. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/deploy.py +4 -1
  33. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/connection.py +91 -41
  34. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/_shared.py +40 -12
  35. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/server.py +2 -0
  36. vmware_aiops-2.3.1/vmware_aiops/mcp_server/tools/access.py +53 -0
  37. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/deploy.py +3 -1
  38. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/summary.py +3 -1
  39. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/datastore_browser.py +3 -4
  40. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/ova_deploy.py +51 -2
  41. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/plan_executor.py +56 -1
  42. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/planner.py +5 -6
  43. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/ttl.py +24 -15
  44. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/scanner/scheduler.py +20 -3
  45. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.clawhubignore +0 -0
  46. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.env.example +0 -0
  47. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  48. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  49. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  50. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  51. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/dependabot.yml +0 -0
  52. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.gitignore +0 -0
  53. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/Dockerfile +0 -0
  54. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/LICENSE +0 -0
  55. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/SECURITY.md +0 -0
  56. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/config.example.yaml +0 -0
  57. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docker-compose.yml +0 -0
  58. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/continue.md +0 -0
  59. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/cursor.md +0 -0
  60. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/goose.md +0 -0
  61. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/localcowork.md +0 -0
  62. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/mcp-agent.md +0 -0
  63. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/vscode-copilot.md +0 -0
  64. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/plans/2026-03-09-plan-apply-design.md +0 -0
  65. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/deploy.yaml +0 -0
  66. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/README.md +0 -0
  67. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/claude-code.json +0 -0
  68. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/continue.yaml +0 -0
  69. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/cursor.json +0 -0
  70. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/goose.json +0 -0
  71. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/localcowork.json +0 -0
  72. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/mcp-agent.yaml +0 -0
  73. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/vscode-copilot.json +0 -0
  74. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/ollama-local-setup.md +0 -0
  75. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/evals/evals.json +0 -0
  76. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/investigation-protocol.md +0 -0
  77. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/smithery.yaml +0 -0
  78. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/__init__.py +0 -0
  79. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/conftest.py +0 -0
  80. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/__init__.py +0 -0
  81. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/__init__.py +0 -0
  82. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/_family.py +0 -0
  83. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/_scores.json +0 -0
  84. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/_scoring.py +0 -0
  85. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/_skill.py +0 -0
  86. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/conftest.py +0 -0
  87. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/test_entity_reachability.py +0 -0
  88. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/test_error_actionability.py +0 -0
  89. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/test_tool_description_quality.py +0 -0
  90. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
  91. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/__init__.py +0 -0
  92. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/_diag_fakes.py +0 -0
  93. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/_pc_fakes.py +0 -0
  94. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_aiops_specific.py +0 -0
  95. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_alarm_health_scale_n1.py +0 -0
  96. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_capability_grader.py +0 -0
  97. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_cli_destructive_guards.py +0 -0
  98. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
  99. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_cluster_health_summary_delegation.py +0 -0
  100. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_code_review_fixes.py +0 -0
  101. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_config_path_resolution_is_shared.py +0 -0
  102. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_daemon_calls_are_audited.py +0 -0
  103. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_doctor_authenticates_every_target.py +0 -0
  104. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_documented_gates_match_the_registry.py +0 -0
  105. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_enum_params_match_implementation.py +0 -0
  106. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_env_secret_obfuscation.py +0 -0
  107. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_event_sets_match_real_class_names.py +0 -0
  108. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_events_are_read_newest_first.py +0 -0
  109. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_guest_download_writes_the_local_disk.py +0 -0
  110. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_guest_username_is_explicit.py +0 -0
  111. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_host_log_scan_reads_real_logs.py +0 -0
  112. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_instructions_name_targets.py +0 -0
  113. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_inventory_scale_issue31.py +0 -0
  114. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_list_envelope_conformance.py +0 -0
  115. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_list_plans_is_non_destructive.py +0 -0
  116. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_mcp_frame_marks_failures.py +0 -0
  117. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_release_blockers.py +0 -0
  118. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_result_envelope.py +0 -0
  119. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_returned_failure_is_audited.py +0 -0
  120. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_set_ttl_safety.py +0 -0
  121. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_snapshot_async.py +0 -0
  122. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_text_io_declares_encoding.py +0 -0
  123. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_tool_annotations_match_behaviour.py +0 -0
  124. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_unreachable_host_vmks.py +0 -0
  125. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_v1_5_25_blockers.py +0 -0
  126. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_vim_attribute_conformance.py +0 -0
  127. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_cluster_mgmt_sanitize.py +0 -0
  128. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_cluster_ttl_plan_gate.py +0 -0
  129. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_config.py +0 -0
  130. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_drs_rules.py +0 -0
  131. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_gate_review_fixes.py +0 -0
  132. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_guest_tools_gate.py +0 -0
  133. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_host_network_mgmt.py +0 -0
  134. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_init_and_onboarding.py +0 -0
  135. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_network_mgmt.py +0 -0
  136. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_no_destructive_ops.py +0 -0
  137. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_plan_gate_narrow_fixes.py +0 -0
  138. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_plan_rollback_final_fixes.py +0 -0
  139. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_reset_alarm_gate.py +0 -0
  140. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_results_name_their_target.py +0 -0
  141. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_safe_error_passthrough.py +0 -0
  142. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_stop_signal_runs_atexit.py +0 -0
  143. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_vm_delete_blast_radius.py +0 -0
  144. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_vm_tools_gate.py +0 -0
  145. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/__init__.py +0 -0
  146. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/alarm.py +0 -0
  147. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/cluster.py +0 -0
  148. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/doctor.py +0 -0
  149. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/hub.py +0 -0
  150. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/investigate.py +0 -0
  151. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/mcp_config.py +0 -0
  152. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/plan.py +0 -0
  153. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/scan.py +0 -0
  154. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/summary.py +0 -0
  155. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/vm.py +0 -0
  156. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/config.py +0 -0
  157. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/doctor.py +0 -0
  158. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/init_wizard.py +0 -0
  159. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/__init__.py +0 -0
  160. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/__main__.py +0 -0
  161. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/__init__.py +0 -0
  162. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/alarm.py +0 -0
  163. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/cluster.py +0 -0
  164. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/datastore.py +0 -0
  165. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/guest.py +0 -0
  166. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/network.py +0 -0
  167. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/plan.py +0 -0
  168. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/ttl.py +0 -0
  169. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/vm.py +0 -0
  170. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/notify/__init__.py +0 -0
  171. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/notify/audit.py +0 -0
  172. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/notify/logger.py +0 -0
  173. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/notify/webhook.py +0 -0
  174. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/__init__.py +0 -0
  175. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/_paging.py +0 -0
  176. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/alarm_mgmt.py +0 -0
  177. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/cluster_gate.py +0 -0
  178. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/cluster_mgmt.py +0 -0
  179. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/gate.py +0 -0
  180. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/guest_gate.py +0 -0
  181. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/guest_ops.py +0 -0
  182. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/health.py +0 -0
  183. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/host_network_mgmt.py +0 -0
  184. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/inventory.py +0 -0
  185. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/iscsi_config.py +0 -0
  186. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/network_mgmt.py +0 -0
  187. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/plan_gate.py +0 -0
  188. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/vm_delete_gate.py +0 -0
  189. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/vm_deploy.py +0 -0
  190. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/vm_gate.py +0 -0
  191. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/vm_lifecycle.py +0 -0
  192. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/policy_environment.py +0 -0
  193. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/scanner/__init__.py +0 -0
  194. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/scanner/alarm_scanner.py +0 -0
  195. {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/scanner/log_scanner.py +0 -0
@@ -2,8 +2,8 @@
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "vmware-aiops",
4
4
  "displayName": "VMware AIops",
5
- "version": "2.2.0",
6
- "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 60 MCP tools.",
5
+ "version": "2.3.1",
6
+ "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 61 MCP tools.",
7
7
  "author": {
8
8
  "name": "Wei Zhou",
9
9
  "email": "zhouwei008@gmail.com",
@@ -5,7 +5,7 @@
5
5
  "command": "uvx",
6
6
  "args": [
7
7
  "--from",
8
- "vmware-aiops==2.2.0",
8
+ "vmware-aiops==2.3.1",
9
9
  "vmware-aiops-mcp"
10
10
  ]
11
11
  }
@@ -1,3 +1,27 @@
1
+ Metadata-Version: 2.5
2
+ Name: vmware-aiops
3
+ Version: 2.3.1
4
+ Summary: VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool
5
+ Project-URL: Homepage, https://github.com/vmware-skills/VMware-AIops
6
+ Project-URL: Repository, https://github.com/vmware-skills/VMware-AIops
7
+ Project-URL: Issues, https://github.com/vmware-skills/VMware-AIops/issues
8
+ Project-URL: Changelog, https://github.com/vmware-skills/VMware-AIops/blob/main/RELEASE_NOTES.md
9
+ Author-email: Wei Zhou <wei-wz.zhou@broadcom.com>
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Requires-Python: >=3.10
13
+ Requires-Dist: apscheduler<4.0,>=3.10
14
+ Requires-Dist: httpx<1.0,>=0.27
15
+ Requires-Dist: mcp[cli]<2.0,>=1.28
16
+ Requires-Dist: pyaml<27.0,>=24.0
17
+ Requires-Dist: python-dotenv<2.0,>=1.0
18
+ Requires-Dist: pyvmomi<10.0,>=8.0.3.0
19
+ Requires-Dist: rich<16.0,>=13.0
20
+ Requires-Dist: typer<1.0,>=0.12
21
+ Requires-Dist: vmware-monitor<3.0,>=2.3.1
22
+ Requires-Dist: vmware-policy<2.0,>=1.23.0
23
+ Description-Content-Type: text/markdown
24
+
1
25
  <!-- mcp-name: io.github.vmware-skills/vmware-aiops -->
2
26
  # VMware AIops
3
27
 
@@ -7,7 +31,7 @@
7
31
 
8
32
  English | [中文](README-CN.md)
9
33
 
10
- AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool — 60 tools.
34
+ AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool — 61 tools.
11
35
 
12
36
  > **Companion skills** handle everything else:
13
37
  >
@@ -26,7 +50,7 @@ AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool — 60 tools.
26
50
 
27
51
  ## Upgrading to 2.0
28
52
 
29
- 2.0 renames 38 of its 60 MCP tools so every name starts with a verb (e.g. `cluster_add_host` → `add_cluster_host`, `cluster_configure` → `configure_cluster`, `cluster_create` → `create_cluster`). The full old → new table is in
53
+ 2.0 renames 38 of its MCP tools so every name starts with a verb (e.g. `cluster_add_host` → `add_cluster_host`, `cluster_configure` → `configure_cluster`, `cluster_create` → `create_cluster`). The full old → new table is in
30
54
  [RELEASE_NOTES.md](RELEASE_NOTES.md#v200--mcp-tools-renamed-verb-first). Nothing else changes: same tools, parameters,
31
55
  safety gates and CLI commands. If an agent prompt, script or `~/.vmware/rules.yaml` names a tool, update it (but not the `action` words in saved plan
32
56
  files — `cluster_add_host`, `storage_rescan` and the like are plan actions, not tool names, and keep their spelling) — though deny
@@ -151,6 +175,7 @@ operator an auditor can sign off on, that's what this family is for — see
151
175
  | **Cluster** | create, delete, HA/DRS config, add/remove hosts | 6 |
152
176
  | **Datastore** | browse files, scan for images | 2 |
153
177
  | **Network** | dvSwitch portgroup list/create, host VMkernel list/add/remove, DF-bit MTU-path ping | 6 |
178
+ | **Access** | which account is in use, and whether it holds each tool's privileges (`get_access_info`, CLI `access-info`) | 1 |
154
179
 
155
180
  ### CLI vs MCP: Which Mode to Use
156
181
 
@@ -435,6 +460,9 @@ Run `vmware-aiops plan list` to see failed plan status. Ask user if they want to
435
460
  1. Verify target is reachable: `vmware-aiops doctor`
436
461
  2. For self-signed certs: set `verify_ssl: false` in config.yaml (lab environments only)
437
462
 
463
+ ### `doctor` reports "no vSphere role", or every command fails with "session is not authenticated"
464
+ The account logs in but has no vSphere role, so vCenter gives it no session (AIops#47). Assign it a role (Read-Only or higher) on the vCenter root folder: Administration > Access Control > Global Permissions. Changing the password will not help. `vmware-aiops doctor` reports this case by name, and `attention` counts such a target as unread (overall at least WARN).
465
+
438
466
  ---
439
467
 
440
468
  ## Supported AI Platforms
@@ -956,6 +984,7 @@ User → Aider CLI → Ollama (localhost:11434) → Qwen / DeepSeek local model
956
984
  # Diagnostics
957
985
  vmware-aiops doctor # Check environment, config, connectivity
958
986
  vmware-aiops doctor --skip-auth # Skip vSphere auth check (faster)
987
+ vmware-aiops access-info [--tool <mcp-tool>] [--target <name>] # Account in use + privileges per tool
959
988
 
960
989
  # MCP Config Generator
961
990
  vmware-aiops mcp-config generate --agent goose # Generate config for Goose
@@ -1122,6 +1151,70 @@ Built on **pyVmomi** (vSphere Web Services API / SOAP).
1122
1151
 
1123
1152
  If you encounter any errors or issues, please send the error message, logs, or screenshots to **zhouwei008@gmail.com**. Contributions are welcome — feel free to join us in maintaining and improving this project!
1124
1153
 
1154
+ <!-- usage: remote-and-exposure -->
1155
+ ## Remote access (HTTPS) and limiting tools
1156
+
1157
+ By default `vmware-aiops mcp` speaks stdio to one local client and offers every tool. Two options change that
1158
+ (vmware-policy ≥ 1.21.0).
1159
+
1160
+ **Serve over HTTPS** so clients on other machines can connect. Every caller needs a bearer token:
1161
+
1162
+ ```bash
1163
+ vmware-audit token create alice # prints the token once; give it to alice
1164
+ vmware-audit token list # names only
1165
+ vmware-audit token revoke alice # refused from its next request, no restart
1166
+ vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
1167
+ --cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \
1168
+ --public-name mcp.example.com
1169
+ ```
1170
+
1171
+ Connect a client (Claude Code shown; any MCP client that supports streamable HTTP and custom headers works):
1172
+
1173
+ ```bash
1174
+ claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
1175
+ --header "Authorization: Bearer $VMWARE_MCP_TOKEN"
1176
+ ```
1177
+
1178
+ ```json
1179
+ {
1180
+ "mcpServers": {
1181
+ "vmware-aiops": {
1182
+ "type": "http",
1183
+ "url": "https://mcp.example.com:8443/mcp",
1184
+ "headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }
1185
+ }
1186
+ }
1187
+ }
1188
+ ```
1189
+
1190
+ - The server will not start without a token, refuses Host/Origin values outside `--public-name`, and checks
1191
+ before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.
1192
+ - Behind a TLS-terminating reverse proxy on the same machine use `--transport http --host 127.0.0.1
1193
+ --public-name mcp.example.com` and pass the `Authorization` header through.
1194
+ - Behind a load balancer or gateway on another machine, keep `--transport https` (a self-signed certificate is
1195
+ fine), list in `--public-name` the host name the balancer sends as `Host`, and have it forward `Authorization`.
1196
+ Its health probe can use `GET /healthz`, which needs no token and returns only `{"status": "ok"}`
1197
+ (vmware-policy ≥ 1.23.0).
1198
+ - Send `traceparent` or `X-Request-ID` with each request to have it stored on the audit row;
1199
+ `vmware-audit log --correlation-id ID` then finds the calls behind one platform request.
1200
+ - The audit log records each caller as `token:<name>`. Calls run side by side, with up to `VMWARE_MCP_POOL_SIZE`
1201
+ (default 2) sessions per target; each session is a login on the target, and a call waits at most 300 s for one.
1202
+ - **Everyone who can reach the endpoint acts with this server's account.** Tokens identify callers; they grant
1203
+ nothing on the platform. Run one endpoint per privilege level.
1204
+
1205
+ **Offer only read tools, plus the writes you choose:**
1206
+
1207
+ ```bash
1208
+ vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
1209
+ # or: VMWARE_AIOPS_MCP_EXPOSE=read VMWARE_AIOPS_MCP_ALLOW_WRITE=acknowledge_vcenter_alarm vmware-aiops mcp
1210
+ ```
1211
+
1212
+ Tools not offered do not appear in the client's tool list. A bad value or an unknown write tool stops the server
1213
+ (exit 2). This limits what clients are offered; it is not authorization, so the account itself should be
1214
+ least-privilege.
1215
+
1216
+ Details: `skills/vmware-aiops/references/setup-guide.md` ("Serving MCP over HTTPS", "Limiting which tools are offered").
1217
+
1125
1218
  ## License
1126
1219
 
1127
1220
  MIT
@@ -7,7 +7,7 @@
7
7
 
8
8
  [English](README.md) | 中文
9
9
 
10
- AI 驱动的 VMware vCenter/ESXi VM 生命周期管理与部署工具 — 60 个工具。
10
+ AI 驱动的 VMware vCenter/ESXi VM 生命周期管理与部署工具 — 61 个工具。
11
11
 
12
12
  > **配套技能**负责其他领域:
13
13
  >
@@ -26,7 +26,7 @@ AI 驱动的 VMware vCenter/ESXi VM 生命周期管理与部署工具 — 60 个
26
26
 
27
27
  ## 升级到 2.0
28
28
 
29
- 2.0 把 60 个 MCP 工具中的 38 个改成动词在前(例如 `cluster_add_host` → `add_cluster_host`, `cluster_configure` → `configure_cluster`, `cluster_create` → `create_cluster`),完整的新旧名对照表见
29
+ 2.0 把 MCP 工具名改成动词在前(共改名 38 处)(例如 `cluster_add_host` → `add_cluster_host`, `cluster_configure` → `configure_cluster`, `cluster_create` → `create_cluster`),完整的新旧名对照表见
30
30
  [RELEASE_NOTES.md](RELEASE_NOTES.md#v200--mcp-tools-renamed-verb-first)。其他都不变:工具、参数、安全确认门和 CLI 命令都一样。
31
31
  如果 agent 提示词、脚本或 `~/.vmware/rules.yaml` 里写了工具名,请改成新名(但已保存计划文件里的 `action` 动作词不要改——`cluster_add_host`、`storage_rescan` 这类是计划动作,不是工具名,保持原样)——不过用旧名写的 deny 规则在
32
32
  vmware-policy ≥ 1.18 下仍然生效(`vmware-audit policy` 会列出因改名而多匹配的规则),vmware-pilot ≥ 1.13 也会自动转换已保存工作流里的旧名。
@@ -118,12 +118,13 @@ pip install --no-index --find-links dist vmware-aiops
118
118
  | **集群** | 创建、删除、HA/DRS 配置、添加/移除主机 | 6 |
119
119
  | **数据存储** | 浏览文件、扫描镜像 | 2 |
120
120
  | **网络** | dvSwitch 端口组 列出/创建、主机 VMkernel 列出/添加/移除、DF 位 MTU 路径 ping | 6 |
121
+ | **权限** | 当前使用哪个账号,以及它是否具备每个工具所需的权限(`get_access_info`,CLI `access-info`) | 1 |
121
122
 
122
123
  ### CLI vs MCP:如何选择
123
124
 
124
125
  | 场景 | 推荐模式 | 原因 |
125
126
  |------|:-------:|------|
126
- | **本地/小模型**(Ollama、Qwen <32B) | **CLI** | 上下文占用 ~2K tokens vs MCP ~10K;小模型难以处理 60 个工具的 schema |
127
+ | **本地/小模型**(Ollama、Qwen <32B) | **CLI** | 上下文占用 ~2K tokens vs MCP ~10K;小模型难以处理 61 个工具的 schema |
127
128
  | **Token 敏感场景** | **CLI** | SKILL.md + Bash = 最小开销 |
128
129
  | **云端大模型**(Claude、GPT-4o) | 均可 | MCP 提供结构化 JSON 输入输出 |
129
130
  | **自动化管道 / Agent 链式调用** | **MCP** | 类型安全参数,结构化输出,无需 Shell 解析 |
@@ -378,6 +379,9 @@ vSphere 中 VM 名称区分大小写。请使用 `vmware-monitor inventory vms`
378
379
  1. 验证目标可达:`vmware-aiops doctor`
379
380
  2. 自签名证书:在 config.yaml 中设置 `verify_ssl: false`(仅限实验环境)
380
381
 
382
+ ### `doctor` 报 "no vSphere role",或所有命令都报 "session is not authenticated"
383
+ 账号能登录,但没有任何 vSphere 角色,所以 vCenter 不给它会话(AIops#47)。在 vCenter 根文件夹上给它分配角色(Read-Only 或更高):Administration > Access Control > Global Permissions。改密码没有用。`vmware-aiops doctor` 会直接报出这种情况,`attention` 也会把这样的目标算作未读取(总体状态至少为 WARN)。
384
+
381
385
  ---
382
386
 
383
387
  ## 支持的 AI 平台
@@ -665,6 +669,7 @@ aider --conventions skills/vmware-aiops/SKILL.md --model ollama/qwen2.5-coder:32
665
669
  # 环境诊断
666
670
  vmware-aiops doctor # 检查环境、配置、连通性
667
671
  vmware-aiops doctor --skip-auth # 跳过 vSphere 认证检查(更快)
672
+ vmware-aiops access-info [--tool <mcp-tool>] [--target <name>] # 当前账号 + 每个工具的权限
668
673
 
669
674
  # MCP 配置生成
670
675
  vmware-aiops mcp-config generate --agent goose # 生成 Goose 配置
@@ -787,6 +792,68 @@ VMware-AIops/
787
792
 
788
793
  If you encounter any errors or issues, please send the error message, logs, or screenshots to **zhouwei008@gmail.com**. Contributions are welcome — feel free to join us in maintaining and improving this project!
789
794
 
795
+ <!-- usage: remote-and-exposure -->
796
+ ## 远程访问(HTTPS)与限制工具
797
+
798
+ 默认情况下 `vmware-aiops mcp` 通过 stdio 服务一个本地客户端,并提供全部工具。以下两个选项可以改变这一点
799
+ (需 vmware-policy ≥ 1.21.0)。
800
+
801
+ **通过 HTTPS 提供服务**,让其他机器上的客户端连接。每个调用者都需要一个 bearer token:
802
+
803
+ ```bash
804
+ vmware-audit token create alice # 只显示一次,交给 alice
805
+ vmware-audit token list # 只列名字
806
+ vmware-audit token revoke alice # 下一个请求起即拒绝,无需重启
807
+ vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
808
+ --cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \
809
+ --public-name mcp.example.com
810
+ ```
811
+
812
+ 连接客户端(以 Claude Code 为例;任何支持 streamable HTTP 和自定义请求头的 MCP 客户端都可以):
813
+
814
+ ```bash
815
+ claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
816
+ --header "Authorization: Bearer $VMWARE_MCP_TOKEN"
817
+ ```
818
+
819
+ ```json
820
+ {
821
+ "mcpServers": {
822
+ "vmware-aiops": {
823
+ "type": "http",
824
+ "url": "https://mcp.example.com:8443/mcp",
825
+ "headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }
826
+ }
827
+ }
828
+ }
829
+ ```
830
+
831
+ - 没有 token 时服务不会启动;`--public-name` 之外的 Host/Origin 一律拒绝;绑定端口前会自检,确认未认证请求得到 401。
832
+ 证书要用客户端信任、且覆盖这些名字的证书。
833
+ - 在同一台机器上由反向代理终结 TLS 时,用 `--transport http --host 127.0.0.1 --public-name mcp.example.com`,
834
+ 并让代理透传 `Authorization` 头。
835
+ - 负载均衡或网关在另一台机器上时,保持 `--transport https`(自签证书也可以),在 `--public-name` 里写上负载均衡
836
+ 转发时带的 `Host` 名,并让它透传 `Authorization`。健康检查可以用 `GET /healthz`:不需要 token,只返回
837
+ `{"status": "ok"}`(需 vmware-policy ≥ 1.23.0)。
838
+ - 每个请求带上 `traceparent` 或 `X-Request-ID`,它会记进审计记录;用 `vmware-audit log --correlation-id ID`
839
+ 就能查到平台上某一次请求对应的调用。
840
+ - 审计日志把每个调用者记为 `token:<名字>`。调用并行执行,每个 target 最多 `VMWARE_MCP_POOL_SIZE`(默认 2)
841
+ 个会话;每个会话都是在该 target 上的一次登录,一个调用最多等待 300 秒拿到会话。
842
+ - **能连到这个端点的人,都以该 server 配置的账号操作。** token 只用来识别调用者,不在平台上授予任何权限。
843
+ 每个权限级别单独起一个端点。
844
+
845
+ **只提供读工具,加上你选定的写工具:**
846
+
847
+ ```bash
848
+ vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
849
+ # 或:VMWARE_AIOPS_MCP_EXPOSE=read VMWARE_AIOPS_MCP_ALLOW_WRITE=acknowledge_vcenter_alarm vmware-aiops mcp
850
+ ```
851
+
852
+ 未提供的工具不会出现在客户端的工具列表里。取值错误或写工具名不存在时服务直接退出(exit 2)。
853
+ 这只限制提供给客户端的工具,不是授权;账号本身仍应遵循最小权限。
854
+
855
+ 详见 `skills/vmware-aiops/references/setup-guide.md`("Serving MCP over HTTPS"、"Limiting which tools are offered")。
856
+
790
857
  ## 许可证
791
858
 
792
859
  MIT
@@ -1,27 +1,3 @@
1
- Metadata-Version: 2.5
2
- Name: vmware-aiops
3
- Version: 2.2.0
4
- Summary: VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool
5
- Project-URL: Homepage, https://github.com/vmware-skills/VMware-AIops
6
- Project-URL: Repository, https://github.com/vmware-skills/VMware-AIops
7
- Project-URL: Issues, https://github.com/vmware-skills/VMware-AIops/issues
8
- Project-URL: Changelog, https://github.com/vmware-skills/VMware-AIops/blob/main/RELEASE_NOTES.md
9
- Author-email: Wei Zhou <wei-wz.zhou@broadcom.com>
10
- License-Expression: MIT
11
- License-File: LICENSE
12
- Requires-Python: >=3.10
13
- Requires-Dist: apscheduler<4.0,>=3.10
14
- Requires-Dist: httpx<1.0,>=0.27
15
- Requires-Dist: mcp[cli]<2.0,>=1.28
16
- Requires-Dist: pyaml<27.0,>=24.0
17
- Requires-Dist: python-dotenv<2.0,>=1.0
18
- Requires-Dist: pyvmomi<10.0,>=8.0.3.0
19
- Requires-Dist: rich<16.0,>=13.0
20
- Requires-Dist: typer<1.0,>=0.12
21
- Requires-Dist: vmware-monitor<3.0,>=2.0.0
22
- Requires-Dist: vmware-policy<2.0,>=1.21.0
23
- Description-Content-Type: text/markdown
24
-
25
1
  <!-- mcp-name: io.github.vmware-skills/vmware-aiops -->
26
2
  # VMware AIops
27
3
 
@@ -31,7 +7,7 @@ Description-Content-Type: text/markdown
31
7
 
32
8
  English | [中文](README-CN.md)
33
9
 
34
- AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool — 60 tools.
10
+ AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool — 61 tools.
35
11
 
36
12
  > **Companion skills** handle everything else:
37
13
  >
@@ -50,7 +26,7 @@ AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool — 60 tools.
50
26
 
51
27
  ## Upgrading to 2.0
52
28
 
53
- 2.0 renames 38 of its 60 MCP tools so every name starts with a verb (e.g. `cluster_add_host` → `add_cluster_host`, `cluster_configure` → `configure_cluster`, `cluster_create` → `create_cluster`). The full old → new table is in
29
+ 2.0 renames 38 of its MCP tools so every name starts with a verb (e.g. `cluster_add_host` → `add_cluster_host`, `cluster_configure` → `configure_cluster`, `cluster_create` → `create_cluster`). The full old → new table is in
54
30
  [RELEASE_NOTES.md](RELEASE_NOTES.md#v200--mcp-tools-renamed-verb-first). Nothing else changes: same tools, parameters,
55
31
  safety gates and CLI commands. If an agent prompt, script or `~/.vmware/rules.yaml` names a tool, update it (but not the `action` words in saved plan
56
32
  files — `cluster_add_host`, `storage_rescan` and the like are plan actions, not tool names, and keep their spelling) — though deny
@@ -175,6 +151,7 @@ operator an auditor can sign off on, that's what this family is for — see
175
151
  | **Cluster** | create, delete, HA/DRS config, add/remove hosts | 6 |
176
152
  | **Datastore** | browse files, scan for images | 2 |
177
153
  | **Network** | dvSwitch portgroup list/create, host VMkernel list/add/remove, DF-bit MTU-path ping | 6 |
154
+ | **Access** | which account is in use, and whether it holds each tool's privileges (`get_access_info`, CLI `access-info`) | 1 |
178
155
 
179
156
  ### CLI vs MCP: Which Mode to Use
180
157
 
@@ -459,6 +436,9 @@ Run `vmware-aiops plan list` to see failed plan status. Ask user if they want to
459
436
  1. Verify target is reachable: `vmware-aiops doctor`
460
437
  2. For self-signed certs: set `verify_ssl: false` in config.yaml (lab environments only)
461
438
 
439
+ ### `doctor` reports "no vSphere role", or every command fails with "session is not authenticated"
440
+ The account logs in but has no vSphere role, so vCenter gives it no session (AIops#47). Assign it a role (Read-Only or higher) on the vCenter root folder: Administration > Access Control > Global Permissions. Changing the password will not help. `vmware-aiops doctor` reports this case by name, and `attention` counts such a target as unread (overall at least WARN).
441
+
462
442
  ---
463
443
 
464
444
  ## Supported AI Platforms
@@ -980,6 +960,7 @@ User → Aider CLI → Ollama (localhost:11434) → Qwen / DeepSeek local model
980
960
  # Diagnostics
981
961
  vmware-aiops doctor # Check environment, config, connectivity
982
962
  vmware-aiops doctor --skip-auth # Skip vSphere auth check (faster)
963
+ vmware-aiops access-info [--tool <mcp-tool>] [--target <name>] # Account in use + privileges per tool
983
964
 
984
965
  # MCP Config Generator
985
966
  vmware-aiops mcp-config generate --agent goose # Generate config for Goose
@@ -1146,6 +1127,70 @@ Built on **pyVmomi** (vSphere Web Services API / SOAP).
1146
1127
 
1147
1128
  If you encounter any errors or issues, please send the error message, logs, or screenshots to **zhouwei008@gmail.com**. Contributions are welcome — feel free to join us in maintaining and improving this project!
1148
1129
 
1130
+ <!-- usage: remote-and-exposure -->
1131
+ ## Remote access (HTTPS) and limiting tools
1132
+
1133
+ By default `vmware-aiops mcp` speaks stdio to one local client and offers every tool. Two options change that
1134
+ (vmware-policy ≥ 1.21.0).
1135
+
1136
+ **Serve over HTTPS** so clients on other machines can connect. Every caller needs a bearer token:
1137
+
1138
+ ```bash
1139
+ vmware-audit token create alice # prints the token once; give it to alice
1140
+ vmware-audit token list # names only
1141
+ vmware-audit token revoke alice # refused from its next request, no restart
1142
+ vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
1143
+ --cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \
1144
+ --public-name mcp.example.com
1145
+ ```
1146
+
1147
+ Connect a client (Claude Code shown; any MCP client that supports streamable HTTP and custom headers works):
1148
+
1149
+ ```bash
1150
+ claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
1151
+ --header "Authorization: Bearer $VMWARE_MCP_TOKEN"
1152
+ ```
1153
+
1154
+ ```json
1155
+ {
1156
+ "mcpServers": {
1157
+ "vmware-aiops": {
1158
+ "type": "http",
1159
+ "url": "https://mcp.example.com:8443/mcp",
1160
+ "headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }
1161
+ }
1162
+ }
1163
+ }
1164
+ ```
1165
+
1166
+ - The server will not start without a token, refuses Host/Origin values outside `--public-name`, and checks
1167
+ before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.
1168
+ - Behind a TLS-terminating reverse proxy on the same machine use `--transport http --host 127.0.0.1
1169
+ --public-name mcp.example.com` and pass the `Authorization` header through.
1170
+ - Behind a load balancer or gateway on another machine, keep `--transport https` (a self-signed certificate is
1171
+ fine), list in `--public-name` the host name the balancer sends as `Host`, and have it forward `Authorization`.
1172
+ Its health probe can use `GET /healthz`, which needs no token and returns only `{"status": "ok"}`
1173
+ (vmware-policy ≥ 1.23.0).
1174
+ - Send `traceparent` or `X-Request-ID` with each request to have it stored on the audit row;
1175
+ `vmware-audit log --correlation-id ID` then finds the calls behind one platform request.
1176
+ - The audit log records each caller as `token:<name>`. Calls run side by side, with up to `VMWARE_MCP_POOL_SIZE`
1177
+ (default 2) sessions per target; each session is a login on the target, and a call waits at most 300 s for one.
1178
+ - **Everyone who can reach the endpoint acts with this server's account.** Tokens identify callers; they grant
1179
+ nothing on the platform. Run one endpoint per privilege level.
1180
+
1181
+ **Offer only read tools, plus the writes you choose:**
1182
+
1183
+ ```bash
1184
+ vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
1185
+ # or: VMWARE_AIOPS_MCP_EXPOSE=read VMWARE_AIOPS_MCP_ALLOW_WRITE=acknowledge_vcenter_alarm vmware-aiops mcp
1186
+ ```
1187
+
1188
+ Tools not offered do not appear in the client's tool list. A bad value or an unknown write tool stops the server
1189
+ (exit 2). This limits what clients are offered; it is not authorization, so the account itself should be
1190
+ least-privilege.
1191
+
1192
+ Details: `skills/vmware-aiops/references/setup-guide.md` ("Serving MCP over HTTPS", "Limiting which tools are offered").
1193
+
1149
1194
  ## License
1150
1195
 
1151
1196
  MIT
@@ -1,3 +1,51 @@
1
+ ## v2.3.1 — an account with no vSphere role is named, not passed (AIops#47)
2
+
3
+ Needs vmware-policy 1.23.0, and the vmware-monitor release with the same fix for the `attention` part.
4
+
5
+ * **A login with no vSphere role fails at connect time with the reason.** vCenter accepts the login but shows no
6
+ session for it, and every call then fails with `NotAuthenticated`. The connection is now closed at once and
7
+ `doctor`, the CLI and MCP tools say the account most likely has no vSphere role and to assign one (Read-Only or
8
+ higher). Reported on vCenter 8.0.3; not yet reproduced on our own hardware.
9
+ * Refused only when two signals agree: no session, **and** vCenter refuses a view of the root folder
10
+ (`NotAuthenticated` / `NoPermission`). An account scoped to one folder can also show no session, and still
11
+ connects; anything the check cannot read lets the login through.
12
+ * **`NotAuthenticated` later on names both causes**: the session expired (retry), or the account's role was
13
+ removed. It no longer says "verify connectivity and credentials".
14
+ * **Every CLI command prints one line for a vSphere fault.** `summary` (and any other command) printed a raw
15
+ traceback for faults other than a failed login; they now print the fault's message and what to check.
16
+ * **`attention` never reports OK for targets it could not read** (computed by vmware-monitor): any unread target
17
+ makes the overall status at least WARN, none read makes it CRITICAL, and the console and HTML say how many were
18
+ not read. A role-less target is listed as unreachable with reason `NoVSphereRoleError`.
19
+
20
+ ## Unreleased — OVA deploy honours `network_name`
21
+
22
+ * **`deploy_vm_from_ova` / `deploy ova --network` now attach the NICs to the network you name.** The import spec
23
+ carried no network mapping, so the argument had no effect and each NIC landed on whatever network the OVF
24
+ descriptor named. Every network the OVF declares is now mapped to the named port group (standard or distributed).
25
+ A name that matches no network, or more than one (a standard and a distributed port group can share a name), is
26
+ refused before anything is imported, with the available names in the error. An OVF descriptor the server cannot
27
+ parse is refused the same way. Found in the 2026-10-16 pre-release review.
28
+
29
+ ## v2.3.0 — calls on one target run side by side; `get_access_info`
30
+
31
+ Needs vmware-policy 1.22.0.
32
+
33
+ * **Calls no longer queue behind each other on a shared server.** Served over `--transport https`/`http`,
34
+ calls run side by side with up to `VMWARE_MCP_POOL_SIZE` (default 2) sessions per target; each call holds its
35
+ own session for its whole run, so two calls never share one. Each session is a login on the target. A call
36
+ that finds every session busy waits at most 300 s, then fails with a message saying so. stdio and the CLI
37
+ keep one session per target, as before.
38
+ * **Side-by-side calls no longer race on local state.** Two TTL changes at once could drop each other's entry
39
+ (and a reader catching the file mid-write saw no entries at all); the TTL store and the image registry are now
40
+ written atomically and TTL updates are serialized. One plan can no longer be applied or rolled back by two
41
+ calls at once: the second is refused with a message, and nothing runs twice.
42
+ * **The daemon's scan and TTL check each use their own session.** They run on APScheduler's thread pool and
43
+ could overlap on one pyVmomi session.
44
+ * **New tool `get_access_info`** (CLI `vmware-aiops access-info [--tool X] [--target T]`): which account the
45
+ server uses on a target, and whether it holds the privileges each tool needs, e.g. `--tool clone_vm`. It asks
46
+ vCenter about its own session (System.View is enough). Checked on the root folder: `not_granted_at_root` can
47
+ still be granted on a cluster, folder or VM, and `undetermined` is never read as granted. 61 tools (was 60).
48
+
1
49
  ## v2.2.0 — serve MCP over HTTPS
2
50
 
3
51
  `vmware-aiops mcp` can now serve the network as well as stdio (HLD §16, via vmware-policy 1.21.0):
@@ -8,6 +56,15 @@ vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
8
56
  --cert server.pem --key server-key.pem --public-name mcp.example.com
9
57
  ```
10
58
 
59
+ Connect a client and manage callers (Claude Code shown; any MCP client with streamable HTTP and custom headers works):
60
+
61
+ ```bash
62
+ claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
63
+ --header "Authorization: Bearer $VMWARE_MCP_TOKEN"
64
+ vmware-audit token list # names only
65
+ vmware-audit token revoke alice # refused from its next request, no restart
66
+ ```
67
+
11
68
  * Every request needs `Authorization: Bearer <token>`; the server will not start without a token, refuses Host or
12
69
  Origin values outside `--public-name`, and checks itself (unauthenticated requests must get 401) before it
13
70
  binds. `--transport http` binds loopback only, for a TLS-terminating reverse proxy.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "vmware-aiops",
3
3
  "name": "VMware AIops",
4
- "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 60 MCP tools.",
4
+ "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 61 MCP tools.",
5
5
  "skills": [
6
6
  "./skills"
7
7
  ],
@@ -11,7 +11,7 @@
11
11
  "command": "uvx",
12
12
  "args": [
13
13
  "--from",
14
- "vmware-aiops==2.2.0",
14
+ "vmware-aiops==2.3.1",
15
15
  "vmware-aiops-mcp"
16
16
  ]
17
17
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zw008/vmware-aiops",
3
- "version": "2.2.0",
4
- "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 60 MCP tools.",
3
+ "version": "2.3.1",
4
+ "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 61 MCP tools.",
5
5
  "private": true,
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/vmware-skills/VMware-AIops",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "vmware-aiops"
7
- version = "2.2.0"
7
+ version = "2.3.1"
8
8
  description = "VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -19,11 +19,11 @@ dependencies = [
19
19
  "httpx>=0.27,<1.0",
20
20
  "python-dotenv>=1.0,<2.0",
21
21
  "mcp[cli]>=1.28,<2.0",
22
- "vmware-policy>=1.21.0,<2.0",
22
+ "vmware-policy>=1.23.0,<2.0",
23
23
  # Read-only cluster-health triage (summary + HTML snapshot) is owned by
24
24
  # vmware-monitor; AIops delegates to it so a conversation with the AIops
25
25
  # entry point can produce the same report without duplicating the code.
26
- "vmware-monitor>=2.0.0,<3.0",
26
+ "vmware-monitor>=2.3.1,<3.0", # attention status floor + role-less login (AIops#47)
27
27
  ]
28
28
 
29
29
 
@@ -2,17 +2,17 @@
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.vmware-skills/vmware-aiops",
4
4
  "title": "VMware AIops",
5
- "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 60 MCP tools.",
5
+ "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 61 MCP tools.",
6
6
  "repository": {
7
7
  "url": "https://github.com/vmware-skills/VMware-AIops",
8
8
  "source": "github"
9
9
  },
10
- "version": "2.2.0",
10
+ "version": "2.3.1",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "pypi",
14
14
  "identifier": "vmware-aiops",
15
- "version": "2.2.0",
15
+ "version": "2.3.1",
16
16
  "runtimeHint": "uvx",
17
17
  "packageArguments": [
18
18
  {