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.
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.claude-plugin/plugin.json +2 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.mcp.json +1 -1
- vmware_aiops-2.2.0/README.md → vmware_aiops-2.3.1/PKG-INFO +95 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/README-CN.md +70 -3
- vmware_aiops-2.2.0/PKG-INFO → vmware_aiops-2.3.1/README.md +71 -26
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/RELEASE_NOTES.md +57 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/openclaw.plugin.json +2 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/package.json +2 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/pyproject.toml +3 -3
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/server.json +3 -3
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/SKILL.md +19 -14
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/agent-guardrails.md +1 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/capabilities.md +23 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/cli-reference.md +1 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/setup-guide.md +41 -6
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_atexit_handlers_do_not_accumulate.py +9 -8
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_daemon_host_log_cycles.py +1 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_deploy_correctness.py +5 -0
- vmware_aiops-2.3.1/tests/eval/regression/test_login_without_vsphere_role.py +225 -0
- vmware_aiops-2.3.1/tests/eval/regression/test_ova_network_mapping.py +107 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_session_probe_eviction.py +27 -7
- vmware_aiops-2.3.1/tests/test_access_info.py +154 -0
- vmware_aiops-2.3.1/tests/test_concurrent_local_state.py +181 -0
- vmware_aiops-2.3.1/tests/test_session_pool.py +220 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/uv.lock +7 -7
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/__init__.py +1 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/_fsutil.py +22 -0
- vmware_aiops-2.3.1/vmware_aiops/access_requirements.py +207 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/_common.py +19 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/_root.py +2 -0
- vmware_aiops-2.3.1/vmware_aiops/cli/access.py +46 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/deploy.py +4 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/connection.py +91 -41
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/_shared.py +40 -12
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/server.py +2 -0
- vmware_aiops-2.3.1/vmware_aiops/mcp_server/tools/access.py +53 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/deploy.py +3 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/summary.py +3 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/datastore_browser.py +3 -4
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/ova_deploy.py +51 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/plan_executor.py +56 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/planner.py +5 -6
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/ttl.py +24 -15
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/scanner/scheduler.py +20 -3
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.clawhubignore +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.env.example +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.github/dependabot.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/.gitignore +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/Dockerfile +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/LICENSE +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/SECURITY.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/config.example.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docker-compose.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/continue.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/cursor.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/goose.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/localcowork.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/mcp-agent.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/integrations/vscode-copilot.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/docs/plans/2026-03-09-plan-apply-design.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/deploy.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/README.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/claude-code.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/continue.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/cursor.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/goose.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/localcowork.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/mcp-agent.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/mcp-configs/vscode-copilot.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/examples/ollama-local-setup.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/evals/evals.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/skills/vmware-aiops/references/investigation-protocol.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/smithery.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/conftest.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/_family.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/_scores.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/_scoring.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/_skill.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/conftest.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/test_entity_reachability.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/test_error_actionability.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/test_tool_description_quality.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/_diag_fakes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/_pc_fakes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_aiops_specific.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_alarm_health_scale_n1.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_capability_grader.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_cli_destructive_guards.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_cluster_health_summary_delegation.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_code_review_fixes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_config_path_resolution_is_shared.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_daemon_calls_are_audited.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_doctor_authenticates_every_target.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_documented_gates_match_the_registry.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_enum_params_match_implementation.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_env_secret_obfuscation.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_event_sets_match_real_class_names.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_events_are_read_newest_first.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_guest_download_writes_the_local_disk.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_guest_username_is_explicit.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_host_log_scan_reads_real_logs.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_instructions_name_targets.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_inventory_scale_issue31.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_list_envelope_conformance.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_list_plans_is_non_destructive.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_mcp_frame_marks_failures.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_release_blockers.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_result_envelope.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_returned_failure_is_audited.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_set_ttl_safety.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_snapshot_async.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_text_io_declares_encoding.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_tool_annotations_match_behaviour.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_unreachable_host_vmks.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_v1_5_25_blockers.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/eval/regression/test_vim_attribute_conformance.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_cluster_mgmt_sanitize.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_cluster_ttl_plan_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_config.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_drs_rules.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_gate_review_fixes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_guest_tools_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_host_network_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_init_and_onboarding.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_network_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_no_destructive_ops.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_plan_gate_narrow_fixes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_plan_rollback_final_fixes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_reset_alarm_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_results_name_their_target.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_safe_error_passthrough.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_stop_signal_runs_atexit.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_vm_delete_blast_radius.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/tests/test_vm_tools_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/alarm.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/cluster.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/doctor.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/hub.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/investigate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/mcp_config.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/plan.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/scan.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/summary.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/cli/vm.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/config.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/doctor.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/init_wizard.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/__main__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/alarm.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/cluster.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/datastore.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/guest.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/network.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/plan.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/ttl.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/mcp_server/tools/vm.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/notify/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/notify/audit.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/notify/logger.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/notify/webhook.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/_paging.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/alarm_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/cluster_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/cluster_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/guest_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/guest_ops.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/health.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/host_network_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/inventory.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/iscsi_config.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/network_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/plan_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/vm_delete_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/vm_deploy.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/vm_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/ops/vm_lifecycle.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/policy_environment.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/scanner/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.1}/vmware_aiops/scanner/alarm_scanner.py +0 -0
- {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.
|
|
6
|
-
"description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with
|
|
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",
|
|
@@ -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 —
|
|
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
|
|
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 生命周期管理与部署工具 —
|
|
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 把
|
|
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;小模型难以处理
|
|
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 —
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
4
|
-
"description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
10
|
+
"version": "2.3.1",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "vmware-aiops",
|
|
15
|
-
"version": "2.
|
|
15
|
+
"version": "2.3.1",
|
|
16
16
|
"runtimeHint": "uvx",
|
|
17
17
|
"packageArguments": [
|
|
18
18
|
{
|