vmware-aiops 2.0.0__tar.gz → 2.2.0__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 (187) hide show
  1. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.claude-plugin/plugin.json +1 -1
  2. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.mcp.json +1 -1
  3. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/PKG-INFO +3 -3
  4. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/RELEASE_NOTES.md +36 -0
  5. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/openclaw.plugin.json +1 -1
  6. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/package.json +1 -1
  7. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/pyproject.toml +3 -3
  8. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/server.json +2 -2
  9. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/SKILL.md +2 -2
  10. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/setup-guide.md +33 -5
  11. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/_family.py +9 -7
  12. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/uv.lock +9 -9
  13. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/__init__.py +1 -1
  14. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/_root.py +38 -5
  15. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/cluster.py +4 -4
  16. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/investigate.py +4 -4
  17. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/summary.py +1 -1
  18. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/vm.py +2 -2
  19. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/server.py +19 -2
  20. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.clawhubignore +0 -0
  21. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.env.example +0 -0
  22. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  23. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  25. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  26. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/dependabot.yml +0 -0
  27. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.gitignore +0 -0
  28. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/Dockerfile +0 -0
  29. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/LICENSE +0 -0
  30. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/README-CN.md +0 -0
  31. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/README.md +0 -0
  32. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/SECURITY.md +0 -0
  33. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/config.example.yaml +0 -0
  34. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docker-compose.yml +0 -0
  35. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/continue.md +0 -0
  36. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/cursor.md +0 -0
  37. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/goose.md +0 -0
  38. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/localcowork.md +0 -0
  39. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/mcp-agent.md +0 -0
  40. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/vscode-copilot.md +0 -0
  41. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/plans/2026-03-09-plan-apply-design.md +0 -0
  42. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/deploy.yaml +0 -0
  43. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/README.md +0 -0
  44. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/claude-code.json +0 -0
  45. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/continue.yaml +0 -0
  46. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/cursor.json +0 -0
  47. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/goose.json +0 -0
  48. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/localcowork.json +0 -0
  49. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/mcp-agent.yaml +0 -0
  50. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/vscode-copilot.json +0 -0
  51. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/ollama-local-setup.md +0 -0
  52. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/evals/evals.json +0 -0
  53. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/agent-guardrails.md +0 -0
  54. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/capabilities.md +0 -0
  55. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/cli-reference.md +0 -0
  56. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/investigation-protocol.md +0 -0
  57. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/smithery.yaml +0 -0
  58. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/__init__.py +0 -0
  59. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/conftest.py +0 -0
  60. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/__init__.py +0 -0
  61. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/__init__.py +0 -0
  62. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/_scores.json +0 -0
  63. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/_scoring.py +0 -0
  64. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/_skill.py +0 -0
  65. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/conftest.py +0 -0
  66. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/test_entity_reachability.py +0 -0
  67. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/test_error_actionability.py +0 -0
  68. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/test_tool_description_quality.py +0 -0
  69. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
  70. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/__init__.py +0 -0
  71. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/_diag_fakes.py +0 -0
  72. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/_pc_fakes.py +0 -0
  73. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_aiops_specific.py +0 -0
  74. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_alarm_health_scale_n1.py +0 -0
  75. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_atexit_handlers_do_not_accumulate.py +0 -0
  76. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_capability_grader.py +0 -0
  77. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_cli_destructive_guards.py +0 -0
  78. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
  79. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_cluster_health_summary_delegation.py +0 -0
  80. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_code_review_fixes.py +0 -0
  81. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_config_path_resolution_is_shared.py +0 -0
  82. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_daemon_calls_are_audited.py +0 -0
  83. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_daemon_host_log_cycles.py +0 -0
  84. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_deploy_correctness.py +0 -0
  85. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_doctor_authenticates_every_target.py +0 -0
  86. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_documented_gates_match_the_registry.py +0 -0
  87. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_enum_params_match_implementation.py +0 -0
  88. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_env_secret_obfuscation.py +0 -0
  89. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_event_sets_match_real_class_names.py +0 -0
  90. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_events_are_read_newest_first.py +0 -0
  91. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_guest_download_writes_the_local_disk.py +0 -0
  92. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_guest_username_is_explicit.py +0 -0
  93. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_host_log_scan_reads_real_logs.py +0 -0
  94. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_instructions_name_targets.py +0 -0
  95. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_inventory_scale_issue31.py +0 -0
  96. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_list_envelope_conformance.py +0 -0
  97. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_list_plans_is_non_destructive.py +0 -0
  98. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_mcp_frame_marks_failures.py +0 -0
  99. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_release_blockers.py +0 -0
  100. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_result_envelope.py +0 -0
  101. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_returned_failure_is_audited.py +0 -0
  102. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_session_probe_eviction.py +0 -0
  103. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_set_ttl_safety.py +0 -0
  104. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_snapshot_async.py +0 -0
  105. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_text_io_declares_encoding.py +0 -0
  106. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_tool_annotations_match_behaviour.py +0 -0
  107. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_unreachable_host_vmks.py +0 -0
  108. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_v1_5_25_blockers.py +0 -0
  109. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_vim_attribute_conformance.py +0 -0
  110. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_cluster_mgmt_sanitize.py +0 -0
  111. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_cluster_ttl_plan_gate.py +0 -0
  112. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_config.py +0 -0
  113. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_drs_rules.py +0 -0
  114. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_gate_review_fixes.py +0 -0
  115. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_guest_tools_gate.py +0 -0
  116. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_host_network_mgmt.py +0 -0
  117. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_init_and_onboarding.py +0 -0
  118. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_network_mgmt.py +0 -0
  119. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_no_destructive_ops.py +0 -0
  120. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_plan_gate_narrow_fixes.py +0 -0
  121. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_plan_rollback_final_fixes.py +0 -0
  122. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_reset_alarm_gate.py +0 -0
  123. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_results_name_their_target.py +0 -0
  124. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_safe_error_passthrough.py +0 -0
  125. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_stop_signal_runs_atexit.py +0 -0
  126. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_vm_delete_blast_radius.py +0 -0
  127. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_vm_tools_gate.py +0 -0
  128. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/_fsutil.py +0 -0
  129. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/__init__.py +0 -0
  130. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/_common.py +0 -0
  131. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/alarm.py +0 -0
  132. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/deploy.py +0 -0
  133. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/doctor.py +0 -0
  134. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/hub.py +0 -0
  135. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/mcp_config.py +0 -0
  136. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/plan.py +0 -0
  137. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/scan.py +0 -0
  138. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/config.py +0 -0
  139. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/connection.py +0 -0
  140. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/doctor.py +0 -0
  141. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/init_wizard.py +0 -0
  142. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/__init__.py +0 -0
  143. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/__main__.py +0 -0
  144. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/_shared.py +0 -0
  145. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/__init__.py +0 -0
  146. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/alarm.py +0 -0
  147. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/cluster.py +0 -0
  148. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/datastore.py +0 -0
  149. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/deploy.py +0 -0
  150. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/guest.py +0 -0
  151. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/network.py +0 -0
  152. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/plan.py +0 -0
  153. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/summary.py +0 -0
  154. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/ttl.py +0 -0
  155. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/vm.py +0 -0
  156. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/notify/__init__.py +0 -0
  157. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/notify/audit.py +0 -0
  158. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/notify/logger.py +0 -0
  159. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/notify/webhook.py +0 -0
  160. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/__init__.py +0 -0
  161. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/_paging.py +0 -0
  162. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/alarm_mgmt.py +0 -0
  163. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/cluster_gate.py +0 -0
  164. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/cluster_mgmt.py +0 -0
  165. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/datastore_browser.py +0 -0
  166. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/gate.py +0 -0
  167. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/guest_gate.py +0 -0
  168. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/guest_ops.py +0 -0
  169. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/health.py +0 -0
  170. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/host_network_mgmt.py +0 -0
  171. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/inventory.py +0 -0
  172. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/iscsi_config.py +0 -0
  173. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/network_mgmt.py +0 -0
  174. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/ova_deploy.py +0 -0
  175. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/plan_executor.py +0 -0
  176. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/plan_gate.py +0 -0
  177. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/planner.py +0 -0
  178. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/ttl.py +0 -0
  179. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/vm_delete_gate.py +0 -0
  180. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/vm_deploy.py +0 -0
  181. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/vm_gate.py +0 -0
  182. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/vm_lifecycle.py +0 -0
  183. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/policy_environment.py +0 -0
  184. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/scanner/__init__.py +0 -0
  185. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/scanner/alarm_scanner.py +0 -0
  186. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/scanner/log_scanner.py +0 -0
  187. {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/scanner/scheduler.py +0 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "vmware-aiops",
4
4
  "displayName": "VMware AIops",
5
- "version": "2.0.0",
5
+ "version": "2.2.0",
6
6
  "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 60 MCP tools.",
7
7
  "author": {
8
8
  "name": "Wei Zhou",
@@ -5,7 +5,7 @@
5
5
  "command": "uvx",
6
6
  "args": [
7
7
  "--from",
8
- "vmware-aiops==2.0.0",
8
+ "vmware-aiops==2.2.0",
9
9
  "vmware-aiops-mcp"
10
10
  ]
11
11
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vmware-aiops
3
- Version: 2.0.0
3
+ Version: 2.2.0
4
4
  Summary: VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool
5
5
  Project-URL: Homepage, https://github.com/vmware-skills/VMware-AIops
6
6
  Project-URL: Repository, https://github.com/vmware-skills/VMware-AIops
@@ -12,14 +12,14 @@ License-File: LICENSE
12
12
  Requires-Python: >=3.10
13
13
  Requires-Dist: apscheduler<4.0,>=3.10
14
14
  Requires-Dist: httpx<1.0,>=0.27
15
- Requires-Dist: mcp[cli]<2.0,>=1.10
15
+ Requires-Dist: mcp[cli]<2.0,>=1.28
16
16
  Requires-Dist: pyaml<27.0,>=24.0
17
17
  Requires-Dist: python-dotenv<2.0,>=1.0
18
18
  Requires-Dist: pyvmomi<10.0,>=8.0.3.0
19
19
  Requires-Dist: rich<16.0,>=13.0
20
20
  Requires-Dist: typer<1.0,>=0.12
21
21
  Requires-Dist: vmware-monitor<3.0,>=2.0.0
22
- Requires-Dist: vmware-policy<2.0,>=1.18.0
22
+ Requires-Dist: vmware-policy<2.0,>=1.21.0
23
23
  Description-Content-Type: text/markdown
24
24
 
25
25
  <!-- mcp-name: io.github.vmware-skills/vmware-aiops -->
@@ -1,3 +1,39 @@
1
+ ## v2.2.0 — serve MCP over HTTPS
2
+
3
+ `vmware-aiops mcp` can now serve the network as well as stdio (HLD §16, via vmware-policy 1.21.0):
4
+
5
+ ```bash
6
+ vmware-audit token create alice # once per caller; shown once
7
+ vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
8
+ --cert server.pem --key server-key.pem --public-name mcp.example.com
9
+ ```
10
+
11
+ * Every request needs `Authorization: Bearer <token>`; the server will not start without a token, refuses Host or
12
+ Origin values outside `--public-name`, and checks itself (unauthenticated requests must get 401) before it
13
+ binds. `--transport http` binds loopback only, for a TLS-terminating reverse proxy.
14
+ * Audit rows record the caller as `token:<name>` and the surface as `mcp-https`. Calls naming different targets
15
+ run in parallel; calls naming no target run one at a time.
16
+ * stdio remains the default; the `vmware-aiops-mcp` console script and `python -m` are unchanged.
17
+ * Everyone who can reach the endpoint acts with this server's account; run one endpoint per privilege level.
18
+ * Requires `vmware-policy>=1.21.0` and `mcp>=1.28`.
19
+
20
+ ## v2.1.0 — offer only read tools, plus chosen write tools
21
+
22
+ `vmware-aiops mcp` can now offer a subset of this server's tools (HLD §17 D-16, via vmware-policy 1.20.0):
23
+
24
+ ```bash
25
+ vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
26
+ ```
27
+
28
+ * `--expose read` (or `VMWARE_AIOPS_MCP_EXPOSE=read`) keeps only tools annotated `readOnlyHint: true`; `--allow-write a,b`
29
+ (or `VMWARE_AIOPS_MCP_ALLOW_WRITE`) keeps chosen write tools on top. The default is unchanged: every tool.
30
+ * A bad value, or a name that is not a write tool of this server, stops the server before it serves (exit 2).
31
+ Flags and environment variables are not mixed; a blank flag counts as not given. Pre-2.0 names are accepted.
32
+ * This limits what clients are offered; it is not authorization. See "Limiting which tools are offered" in
33
+ `references/setup-guide.md`, which also notes that an agent with a shell can bypass MCP, so the account itself
34
+ must be least-privilege.
35
+ * Requires `vmware-policy>=1.20.0`.
36
+
1
37
  ## v2.0.0 — MCP tools renamed verb-first
2
38
 
3
39
  **Breaking for MCP clients: 38 of the 60 tools have new names.** The family now names every MCP tool one way —
@@ -11,7 +11,7 @@
11
11
  "command": "uvx",
12
12
  "args": [
13
13
  "--from",
14
- "vmware-aiops==2.0.0",
14
+ "vmware-aiops==2.2.0",
15
15
  "vmware-aiops-mcp"
16
16
  ]
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zw008/vmware-aiops",
3
- "version": "2.0.0",
3
+ "version": "2.2.0",
4
4
  "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 60 MCP tools.",
5
5
  "private": true,
6
6
  "license": "MIT",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "vmware-aiops"
7
- version = "2.0.0"
7
+ version = "2.2.0"
8
8
  description = "VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -18,8 +18,8 @@ dependencies = [
18
18
  "apscheduler>=3.10,<4.0",
19
19
  "httpx>=0.27,<1.0",
20
20
  "python-dotenv>=1.0,<2.0",
21
- "mcp[cli]>=1.10,<2.0",
22
- "vmware-policy>=1.18.0,<2.0",
21
+ "mcp[cli]>=1.28,<2.0",
22
+ "vmware-policy>=1.21.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.
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/vmware-skills/VMware-AIops",
8
8
  "source": "github"
9
9
  },
10
- "version": "2.0.0",
10
+ "version": "2.2.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "pypi",
14
14
  "identifier": "vmware-aiops",
15
- "version": "2.0.0",
15
+ "version": "2.2.0",
16
16
  "runtimeHint": "uvx",
17
17
  "packageArguments": [
18
18
  {
@@ -62,7 +62,7 @@ Read before connecting an agent. Per-tool inventory: `references/capabilities.md
62
62
  ## Quick Install
63
63
 
64
64
  ```bash
65
- uv tool install vmware-aiops==2.0.0
65
+ uv tool install vmware-aiops==2.2.0
66
66
  vmware-aiops doctor
67
67
  vmware-aiops hub status # see which family members are installed
68
68
  ```
@@ -298,7 +298,7 @@ Run `vmware-aiops plan list` to see failed plan status. Ask user if they want to
298
298
  ## Setup
299
299
 
300
300
  ```bash
301
- uv tool install vmware-aiops==2.0.0
301
+ uv tool install vmware-aiops==2.2.0
302
302
  mkdir -p ~/.vmware-aiops
303
303
  vmware-aiops init # generates config.yaml and .env templates
304
304
  chmod 600 ~/.vmware-aiops/.env
@@ -6,13 +6,13 @@ All install methods fetch from the same source: [github.com/vmware-skills/VMware
6
6
 
7
7
  ```bash
8
8
  # Via PyPI (recommended for version pinning)
9
- uv tool install vmware-aiops==2.0.0
9
+ uv tool install vmware-aiops==2.2.0
10
10
 
11
11
  # Via Skills.sh (fetches from GitHub)
12
- npx skills add vmware-skills/VMware-AIops#v2.0.0
12
+ npx skills add vmware-skills/VMware-AIops#v2.2.0
13
13
 
14
14
  # Via ClawHub (fetches from ClawHub registry snapshot of GitHub)
15
- clawhub install @zw008/vmware-aiops --version 2.0.0
15
+ clawhub install @zw008/vmware-aiops --version 2.2.0
16
16
  ```
17
17
 
18
18
  ### Claude Code
@@ -35,7 +35,7 @@ claude mcp add vmware-aiops -- vmware-aiops mcp
35
35
 
36
36
  ```bash
37
37
  # 1. Install from PyPI (source: github.com/vmware-skills/VMware-AIops)
38
- uv tool install vmware-aiops==2.0.0
38
+ uv tool install vmware-aiops==2.2.0
39
39
 
40
40
  # 2. Verify installation source
41
41
  vmware-aiops --version # confirms installed version
@@ -73,7 +73,7 @@ The `vmware-aiops` package installs a Python CLI binary and its dependencies (py
73
73
  ## Development Install
74
74
 
75
75
  ```bash
76
- git clone --branch v2.0.0 https://github.com/vmware-skills/VMware-AIops.git
76
+ git clone --branch v2.2.0 https://github.com/vmware-skills/VMware-AIops.git
77
77
  cd VMware-AIops
78
78
  uv venv && source .venv/bin/activate
79
79
  # --no-sources: pyproject's [tool.uv.sources] points vmware-monitor at a sibling
@@ -180,3 +180,31 @@ For Claude Code / Cursor users who prefer structured tool calls, add to `~/.clau
180
180
  > `vmware-aiops-mcp` entry point is also kept for backward compatibility.
181
181
 
182
182
  MCP exposes 60 tools across 10 categories. All accept optional `target` parameter.
183
+
184
+ ## Limiting which tools are offered
185
+
186
+ By default the MCP server offers every tool. To offer only read tools, start it with `--expose read`, or set
187
+ `VMWARE_AIOPS_MCP_EXPOSE=read` in the MCP client's `env` block (useful when the client launches `vmware-aiops mcp` itself). To offer
188
+ chosen write tools as well, add `--allow-write` with a comma-separated list (or `VMWARE_AIOPS_MCP_ALLOW_WRITE`):
189
+
190
+ ```bash
191
+ vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
192
+ ```
193
+
194
+ - A read tool is one annotated `readOnlyHint: true`; every other tool counts as a write.
195
+ - An unknown setting, or a name that is not a write tool of this server, stops the server before it serves (exit
196
+ code 2), so it never offers more than you asked for. Pre-2.0 tool names are accepted.
197
+ - With `--expose read`, the server prints one line to stderr saying what it exposes.
198
+ - Flags and environment variables are not mixed: if either flag is given, both environment variables are
199
+ ignored, so a leftover `_ALLOW_WRITE` in the shell cannot widen `--expose read`. A blank flag value counts as
200
+ not given.
201
+ - A tool that runs other steps (a plan, workflow or batch tool) carries every write it can execute, including
202
+ writes this setting hides. Expose such a tool only if you would expose those writes too.
203
+ - A launcher that imports the server object can call
204
+ `vmware_policy.exposure.restrict_tools(mcp, skill="aiops", expose="read", allow_write=[...])` before running it,
205
+ instead of editing the SDK's tool registry.
206
+ - This limits what clients are offered. It is **not** authorization: whether a call may change anything is decided by
207
+ the account's permissions, and deny rules in `~/.vmware/rules.yaml` still apply to every exposed tool.
208
+ - An agent that can run shell commands can also reach the platform without MCP (SSH, curl, govc, PowerCLI). So
209
+ the service account itself must be least-privilege: exposure and deny rules are guardrails, not the boundary.
210
+
@@ -104,9 +104,10 @@ FAMILY_TOOLS: dict[str, frozenset[str]] = {
104
104
  'update_dfw_policy', 'update_dfw_rule',
105
105
  }),
106
106
  'vmware-pilot': frozenset({
107
- 'approve', 'cancel_workflow', 'confirm_draft', 'create_workflow', 'design_workflow',
108
- 'get_skill_catalog', 'get_workflow_status', 'list_workflows', 'plan_workflow',
109
- 'review_workflow', 'rollback', 'run_workflow', 'update_draft',
107
+ 'approve', 'cancel_workflow', 'confirm_draft', 'create_workflow',
108
+ 'create_workflow_from_template', 'design_workflow', 'get_skill_catalog',
109
+ 'get_workflow_status', 'list_workflows', 'review_workflow', 'rollback',
110
+ 'run_workflow', 'update_draft',
110
111
  }),
111
112
  'vmware-storage': frozenset({
112
113
  'add_iscsi_target', 'browse_datastore', 'enable_iscsi', 'get_iscsi_status',
@@ -118,10 +119,11 @@ FAMILY_TOOLS: dict[str, frozenset[str]] = {
118
119
  'vmware-vks': frozenset({
119
120
  'check_vks_compatibility', 'create_namespace', 'create_tkc_cluster',
120
121
  'delete_namespace', 'delete_tkc_cluster', 'get_harbor_info', 'get_namespace',
121
- 'get_supervisor_kubeconfig', 'get_supervisor_status', 'get_tkc_available_versions',
122
- 'get_tkc_cluster', 'get_tkc_kubeconfig', 'list_namespace_storage_usage',
123
- 'list_namespaces', 'list_supervisor_storage_policies', 'list_tkc_clusters',
124
- 'list_vm_classes', 'list_vm_service_groups', 'list_vm_service_network_interfaces',
122
+ 'get_supervisor_status', 'get_tkc_available_versions', 'get_tkc_cluster',
123
+ 'issue_supervisor_kubeconfig', 'issue_tkc_kubeconfig',
124
+ 'list_namespace_storage_usage', 'list_namespaces',
125
+ 'list_supervisor_storage_policies', 'list_tkc_clusters', 'list_vm_classes',
126
+ 'list_vm_service_groups', 'list_vm_service_network_interfaces',
125
127
  'list_vm_service_snapshots', 'scale_tkc_cluster', 'update_namespace',
126
128
  'upgrade_tkc_cluster',
127
129
  }),
@@ -1195,7 +1195,7 @@ wheels = [
1195
1195
 
1196
1196
  [[package]]
1197
1197
  name = "vmware-aiops"
1198
- version = "2.0.0"
1198
+ version = "2.2.0"
1199
1199
  source = { editable = "." }
1200
1200
  dependencies = [
1201
1201
  { name = "apscheduler" },
@@ -1221,14 +1221,14 @@ dev = [
1221
1221
  requires-dist = [
1222
1222
  { name = "apscheduler", specifier = ">=3.10,<4.0" },
1223
1223
  { name = "httpx", specifier = ">=0.27,<1.0" },
1224
- { name = "mcp", extras = ["cli"], specifier = ">=1.10,<2.0" },
1224
+ { name = "mcp", extras = ["cli"], specifier = ">=1.28,<2.0" },
1225
1225
  { name = "pyaml", specifier = ">=24.0,<27.0" },
1226
1226
  { name = "python-dotenv", specifier = ">=1.0,<2.0" },
1227
1227
  { name = "pyvmomi", specifier = ">=8.0.3.0,<10.0" },
1228
1228
  { name = "rich", specifier = ">=13.0,<16.0" },
1229
1229
  { name = "typer", specifier = ">=0.12,<1.0" },
1230
1230
  { name = "vmware-monitor", editable = "../VMware-Monitor" },
1231
- { name = "vmware-policy", specifier = ">=1.18.0,<2.0" },
1231
+ { name = "vmware-policy", specifier = ">=1.21.0,<2.0" },
1232
1232
  ]
1233
1233
 
1234
1234
  [package.metadata.requires-dev]
@@ -1240,7 +1240,7 @@ dev = [
1240
1240
 
1241
1241
  [[package]]
1242
1242
  name = "vmware-monitor"
1243
- version = "2.0.0"
1243
+ version = "2.2.0"
1244
1244
  source = { editable = "../VMware-Monitor" }
1245
1245
  dependencies = [
1246
1246
  { name = "apscheduler" },
@@ -1258,13 +1258,13 @@ dependencies = [
1258
1258
  requires-dist = [
1259
1259
  { name = "apscheduler", specifier = ">=3.10,<4.0" },
1260
1260
  { name = "httpx", specifier = ">=0.27,<1.0" },
1261
- { name = "mcp", extras = ["cli"], specifier = ">=1.10,<2.0" },
1261
+ { name = "mcp", extras = ["cli"], specifier = ">=1.28,<2.0" },
1262
1262
  { name = "pyaml", specifier = ">=24.0,<27.0" },
1263
1263
  { name = "python-dotenv", specifier = ">=1.0,<2.0" },
1264
1264
  { name = "pyvmomi", specifier = ">=8.0.3.0,<10.0" },
1265
1265
  { name = "rich", specifier = ">=13.0,<16.0" },
1266
1266
  { name = "typer", specifier = ">=0.12,<1.0" },
1267
- { name = "vmware-policy", specifier = ">=1.18.0,<2.0" },
1267
+ { name = "vmware-policy", specifier = ">=1.21.0,<2.0" },
1268
1268
  ]
1269
1269
 
1270
1270
  [package.metadata.requires-dev]
@@ -1276,14 +1276,14 @@ dev = [
1276
1276
 
1277
1277
  [[package]]
1278
1278
  name = "vmware-policy"
1279
- version = "1.18.2"
1279
+ version = "1.21.0"
1280
1280
  source = { registry = "https://pypi.org/simple" }
1281
1281
  dependencies = [
1282
1282
  { name = "pyyaml" },
1283
1283
  { name = "rich" },
1284
1284
  { name = "typer" },
1285
1285
  ]
1286
- sdist = { url = "https://files.pythonhosted.org/packages/5d/ce/a4f31330f983f411051ab0f42dcbd3c7174670541fa5cdb7faaf22991b24/vmware_policy-1.18.2.tar.gz", hash = "sha256:8e52629bf4a0d355a6841f1d9d5fb4ac1e69bbc7ae22d3843dd7cf3426b30e4c", size = 208412, upload-time = "2026-10-14T06:08:54.124Z" }
1286
+ sdist = { url = "https://files.pythonhosted.org/packages/87/5d/4221ea4a344ec33d6b54903682ce8ae2013bb0a2d6137c94ac769690ea8b/vmware_policy-1.21.0.tar.gz", hash = "sha256:f42b794ea69e52e1fa13aff8b5bc07631d82683b1c12872f2f2ec744e3853549", size = 303862, upload-time = "2026-10-15T10:13:33.719Z" }
1287
1287
  wheels = [
1288
- { url = "https://files.pythonhosted.org/packages/6b/cc/0ad37c57ee902819efc1c193b363df9a7c762794e7dff3318577c17743de/vmware_policy-1.18.2-py3-none-any.whl", hash = "sha256:6e7414f6cc7d783f486db858fd99dd7123ddefc0e823a8b319756e17ece03455", size = 80791, upload-time = "2026-10-14T06:08:52.267Z" },
1288
+ { url = "https://files.pythonhosted.org/packages/b3/b4/feb7015ae5f7870e8058ad713050f7fe3ddefa57aa7bdd4a83f2e3b9abb4/vmware_policy-1.21.0-py3-none-any.whl", hash = "sha256:a10c26816be09f9a2823cc58bc4eacb9b5eff8b6df49dfc5b504b3d76cb3b7ec", size = 99818, upload-time = "2026-10-15T10:13:31.67Z" },
1289
1289
  ]
@@ -1,3 +1,3 @@
1
1
  """VMware AIops - AI-powered vCenter/ESXi monitoring and operations."""
2
2
 
3
- __version__ = "2.0.0"
3
+ __version__ = "2.2.0"
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Annotated
5
+ from typing import Optional, Annotated
6
6
 
7
7
  import typer
8
8
 
@@ -64,13 +64,43 @@ def init_cmd(
64
64
  @app.command("mcp")
65
65
  @cli_errors
66
66
  @cli_local("starts the MCP server; its tools audit themselves")
67
- def mcp_cmd() -> None:
68
- """Start the MCP server (stdio transport).
67
+ def mcp_cmd(
68
+ expose: Optional[str] = typer.Option(
69
+ None,
70
+ "--expose",
71
+ help="Which tools to offer: all (default) or read. Limits what clients see; "
72
+ "not authorization: the account's permissions still decide.",
73
+ ),
74
+ allow_write: Optional[str] = typer.Option(
75
+ None,
76
+ "--allow-write",
77
+ help="With --expose read: comma-separated write tools to offer as well.",
78
+ ),
79
+ transport: Optional[str] = typer.Option(
80
+ None,
81
+ "--transport",
82
+ help="stdio (default), https, or http (loopback only, behind a TLS reverse proxy). "
83
+ "https/http need a token: 'vmware-audit token create NAME'.",
84
+ ),
85
+ host: Optional[str] = typer.Option(None, "--host", help="Bind address (default 127.0.0.1)."),
86
+ port: Optional[int] = typer.Option(None, "--port", help="Port (default 8443)."),
87
+ cert: Optional[str] = typer.Option(None, "--cert", help="TLS certificate (PEM) for https."),
88
+ key: Optional[str] = typer.Option(None, "--key", help="TLS private key (PEM) for https."),
89
+ public_name: Optional[str] = typer.Option(
90
+ None,
91
+ "--public-name",
92
+ help="Host names clients use, comma-separated; other Host/Origin values are refused.",
93
+ ),
94
+ token_file: Optional[str] = typer.Option(
95
+ None, "--token-file", help="Token hash file (default $OPS_HOME/mcp-tokens)."
96
+ ),
97
+ ) -> None:
98
+ """Start the MCP server (stdio by default; --transport https serves the network).
69
99
 
70
100
  Single-command entry point for MCP clients (Claude Desktop, Cursor, etc.):
71
101
  vmware-aiops mcp
72
102
 
73
- Equivalent to the legacy `vmware-aiops-mcp` console script.
103
+ Equivalent to the legacy `vmware-aiops-mcp` console script for stdio (the console script takes no flags).
74
104
  """
75
105
  import sys
76
106
 
@@ -87,7 +117,10 @@ def mcp_cmd() -> None:
87
117
 
88
118
  from vmware_aiops.mcp_server.server import main as _mcp_main
89
119
 
90
- _mcp_main()
120
+ _mcp_main(
121
+ expose=expose, allow_write=allow_write, transport=transport, host=host, port=port,
122
+ cert=cert, key=key, public_name=public_name, token_file=token_file,
123
+ )
91
124
 
92
125
 
93
126
  if __name__ == "__main__":
@@ -135,7 +135,7 @@ def cluster_add_host_cmd(
135
135
 
136
136
  if dry_run:
137
137
  _dry_run_print(
138
- target=_resolve_target(target), vm_name=name, operation="cluster_add_host",
138
+ target=_resolve_target(target), vm_name=name, operation="add_cluster_host",
139
139
  api_call="cluster.MoveInto_Task()",
140
140
  parameters={"host": host},
141
141
  resource_label="Cluster",
@@ -146,7 +146,7 @@ def cluster_add_host_cmd(
146
146
  result = add_host_to_cluster(si, cluster_name=name, host_name=host)
147
147
  console.print(f"[green]{result}[/]")
148
148
  _audit.log(
149
- target=_resolve_target(target), operation="cluster_add_host",
149
+ target=_resolve_target(target), operation="add_cluster_host",
150
150
  resource=name, parameters={"host": host}, result=result,
151
151
  )
152
152
 
@@ -166,7 +166,7 @@ def cluster_remove_host_cmd(
166
166
 
167
167
  if dry_run:
168
168
  _dry_run_print(
169
- target=_resolve_target(target), vm_name=name, operation="cluster_remove_host",
169
+ target=_resolve_target(target), vm_name=name, operation="remove_cluster_host",
170
170
  api_call="datacenter.hostFolder.MoveIntoFolder_Task(list=[host])",
171
171
  parameters={"host": host},
172
172
  resource_label="Cluster",
@@ -177,7 +177,7 @@ def cluster_remove_host_cmd(
177
177
  result = remove_host_from_cluster(si, cluster_name=name, host_name=host)
178
178
  console.print(f"[green]{result}[/]")
179
179
  _audit.log(
180
- target=_resolve_target(target), operation="cluster_remove_host",
180
+ target=_resolve_target(target), operation="remove_cluster_host",
181
181
  resource=name, parameters={"host": host}, result=result,
182
182
  )
183
183
 
@@ -60,7 +60,7 @@ def investigate_vm_cmd(
60
60
  tgt = _tgt(target, cfg)
61
61
  bundle = get_vm_investigation_bundle(si, vm_name, hours=hours)
62
62
  _audit.log_query(
63
- target=tgt, resource=vm_name, query_type="vm_investigation_bundle", skill="aiops"
63
+ target=tgt, resource=vm_name, query_type="investigate_vm", skill="aiops"
64
64
  )
65
65
  if html or html_path is not None:
66
66
  write_bundle_html_snapshot(bundle, "vm", tgt, html_path)
@@ -87,7 +87,7 @@ def investigate_host_cmd(
87
87
  tgt = _tgt(target, cfg)
88
88
  bundle = get_host_investigation_bundle(si, host_name, hours=hours)
89
89
  _audit.log_query(
90
- target=tgt, resource=host_name, query_type="host_investigation_bundle", skill="aiops"
90
+ target=tgt, resource=host_name, query_type="investigate_host", skill="aiops"
91
91
  )
92
92
  if html or html_path is not None:
93
93
  write_bundle_html_snapshot(bundle, "host", tgt, html_path)
@@ -116,7 +116,7 @@ def investigate_datastore_cmd(
116
116
  _audit.log_query(
117
117
  target=tgt,
118
118
  resource=datastore_name,
119
- query_type="datastore_investigation_bundle",
119
+ query_type="investigate_datastore",
120
120
  skill="aiops",
121
121
  )
122
122
  if html or html_path is not None:
@@ -148,7 +148,7 @@ def attention_cmd(
148
148
  sessions, unreachable=unreachable, cluster_filter=cluster, top_n=top
149
149
  )
150
150
  _audit.log_query(
151
- target="*", resource="all-vcenters", query_type="cross_vcenter_attention", skill="aiops"
151
+ target="*", resource="all-vcenters", query_type="get_cross_vcenter_attention", skill="aiops"
152
152
  )
153
153
  if html or html_path is not None:
154
154
  write_attention_html_snapshot(data, html_path)
@@ -67,7 +67,7 @@ def cluster_summary_cmd(
67
67
  tgt = target or getattr(getattr(cfg, "default_target", None), "name", "default")
68
68
  data = get_cluster_health_summary(si, cluster_filter=cluster, include_vms=not no_vms, top_n=top)
69
69
  _audit.log_query(
70
- target=tgt, resource="clusters", query_type="cluster_health_summary", skill="aiops"
70
+ target=tgt, resource="clusters", query_type="get_cluster_health_summary", skill="aiops"
71
71
  )
72
72
 
73
73
  if html or html_path is not None:
@@ -588,7 +588,7 @@ def set_vm_ttl(
588
588
 
589
589
  if dry_run:
590
590
  _dry_run_print(
591
- target=_resolve_target(target), vm_name=vm_name, operation="vm_set_ttl",
591
+ target=_resolve_target(target), vm_name=vm_name, operation="set_vm_ttl",
592
592
  api_call="scheduler.delete_vm() on TTL expiry",
593
593
  parameters={
594
594
  "minutes": minutes,
@@ -601,7 +601,7 @@ def set_vm_ttl(
601
601
  console.print(f"[green]{result}[/]")
602
602
  _audit.log(
603
603
  target=_resolve_target(target),
604
- operation="vm_set_ttl",
604
+ operation="set_vm_ttl",
605
605
  resource=vm_name,
606
606
  parameters={"minutes": minutes},
607
607
  result=result,
@@ -42,6 +42,7 @@ License: MIT
42
42
  """
43
43
 
44
44
  import logging
45
+ from typing import Optional
45
46
 
46
47
  from vmware_policy import describe_tool_parameters
47
48
 
@@ -144,11 +145,27 @@ def _exit_on_stop_signals() -> None:
144
145
  signal.signal(sig, _stop)
145
146
 
146
147
 
147
- def main() -> None:
148
+ def main(
149
+ expose: Optional[str] = None,
150
+ allow_write: Optional[str] = None,
151
+ transport: Optional[str] = None,
152
+ host: Optional[str] = None,
153
+ port: Optional[int] = None,
154
+ cert: Optional[str] = None,
155
+ key: Optional[str] = None,
156
+ public_name: Optional[str] = None,
157
+ token_file: Optional[str] = None,
158
+ ) -> None:
148
159
  """Run the MCP server over stdio."""
149
160
  logging.basicConfig(level=logging.INFO)
150
161
  _exit_on_stop_signals()
151
- mcp.run(transport="stdio")
162
+ from vmware_policy.serve import run_server
163
+ run_server(
164
+ mcp,
165
+ skill="aiops",
166
+ expose=expose, allow_write=allow_write, transport=transport, host=host, port=port,
167
+ cert=cert, key=key, public_name=public_name, token_file=token_file,
168
+ )
152
169
 
153
170
  # The docstrings above are the schema. `describe_tool_parameters` copies each
154
171
  # `Args:` entry into the JSON schema an agent actually reads, and closes the
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes