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.
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.claude-plugin/plugin.json +1 -1
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.mcp.json +1 -1
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/PKG-INFO +3 -3
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/RELEASE_NOTES.md +36 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/openclaw.plugin.json +1 -1
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/package.json +1 -1
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/pyproject.toml +3 -3
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/server.json +2 -2
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/SKILL.md +2 -2
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/setup-guide.md +33 -5
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/_family.py +9 -7
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/uv.lock +9 -9
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/__init__.py +1 -1
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/_root.py +38 -5
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/cluster.py +4 -4
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/investigate.py +4 -4
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/summary.py +1 -1
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/vm.py +2 -2
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/server.py +19 -2
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.clawhubignore +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.env.example +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.github/dependabot.yml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/.gitignore +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/Dockerfile +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/LICENSE +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/README-CN.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/README.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/SECURITY.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/config.example.yaml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docker-compose.yml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/continue.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/cursor.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/goose.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/localcowork.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/mcp-agent.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/integrations/vscode-copilot.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/docs/plans/2026-03-09-plan-apply-design.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/deploy.yaml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/README.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/claude-code.json +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/continue.yaml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/cursor.json +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/goose.json +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/localcowork.json +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/mcp-agent.yaml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/mcp-configs/vscode-copilot.json +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/examples/ollama-local-setup.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/evals/evals.json +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/agent-guardrails.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/capabilities.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/cli-reference.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/investigation-protocol.md +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/smithery.yaml +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/conftest.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/_scores.json +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/_scoring.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/_skill.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/conftest.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/test_entity_reachability.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/test_error_actionability.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/test_tool_description_quality.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/_diag_fakes.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/_pc_fakes.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_aiops_specific.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_alarm_health_scale_n1.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_atexit_handlers_do_not_accumulate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_capability_grader.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_cli_destructive_guards.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_cluster_health_summary_delegation.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_code_review_fixes.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_config_path_resolution_is_shared.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_daemon_calls_are_audited.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_daemon_host_log_cycles.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_deploy_correctness.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_doctor_authenticates_every_target.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_documented_gates_match_the_registry.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_enum_params_match_implementation.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_env_secret_obfuscation.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_event_sets_match_real_class_names.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_events_are_read_newest_first.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_guest_download_writes_the_local_disk.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_guest_username_is_explicit.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_host_log_scan_reads_real_logs.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_instructions_name_targets.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_inventory_scale_issue31.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_list_envelope_conformance.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_list_plans_is_non_destructive.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_mcp_frame_marks_failures.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_release_blockers.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_result_envelope.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_returned_failure_is_audited.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_session_probe_eviction.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_set_ttl_safety.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_snapshot_async.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_text_io_declares_encoding.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_tool_annotations_match_behaviour.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_unreachable_host_vmks.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_v1_5_25_blockers.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/eval/regression/test_vim_attribute_conformance.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_cluster_mgmt_sanitize.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_cluster_ttl_plan_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_config.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_drs_rules.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_gate_review_fixes.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_guest_tools_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_host_network_mgmt.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_init_and_onboarding.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_network_mgmt.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_no_destructive_ops.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_plan_gate_narrow_fixes.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_plan_rollback_final_fixes.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_reset_alarm_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_results_name_their_target.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_safe_error_passthrough.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_stop_signal_runs_atexit.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_vm_delete_blast_radius.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/tests/test_vm_tools_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/_fsutil.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/_common.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/alarm.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/deploy.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/doctor.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/hub.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/mcp_config.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/plan.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/cli/scan.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/config.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/connection.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/doctor.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/init_wizard.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/__main__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/_shared.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/alarm.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/cluster.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/datastore.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/deploy.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/guest.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/network.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/plan.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/summary.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/ttl.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/mcp_server/tools/vm.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/notify/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/notify/audit.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/notify/logger.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/notify/webhook.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/_paging.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/alarm_mgmt.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/cluster_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/cluster_mgmt.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/datastore_browser.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/guest_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/guest_ops.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/health.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/host_network_mgmt.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/inventory.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/iscsi_config.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/network_mgmt.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/ova_deploy.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/plan_executor.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/plan_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/planner.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/ttl.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/vm_delete_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/vm_deploy.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/vm_gate.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/ops/vm_lifecycle.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/policy_environment.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/scanner/__init__.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/scanner/alarm_scanner.py +0 -0
- {vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/vmware_aiops/scanner/log_scanner.py +0 -0
- {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.
|
|
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",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vmware-aiops
|
|
3
|
-
Version: 2.
|
|
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.
|
|
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.
|
|
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 —
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "vmware-aiops"
|
|
7
|
-
version = "2.
|
|
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.
|
|
22
|
-
"vmware-policy>=1.
|
|
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.
|
|
10
|
+
"version": "2.2.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "vmware-aiops",
|
|
15
|
-
"version": "2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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',
|
|
108
|
-
'
|
|
109
|
-
'
|
|
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
|
-
'
|
|
122
|
-
'
|
|
123
|
-
'
|
|
124
|
-
'
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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/
|
|
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/
|
|
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
|
]
|
|
@@ -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(
|
|
68
|
-
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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(
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/agent-guardrails.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vmware_aiops-2.0.0 → vmware_aiops-2.2.0}/skills/vmware-aiops/references/investigation-protocol.md
RENAMED
|
File without changes
|