vmware-aiops 2.2.0__tar.gz → 2.3.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.2.0 → vmware_aiops-2.3.0}/.claude-plugin/plugin.json +2 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.mcp.json +1 -1
- vmware_aiops-2.2.0/README.md → vmware_aiops-2.3.0/PKG-INFO +86 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/README-CN.md +62 -3
- vmware_aiops-2.2.0/PKG-INFO → vmware_aiops-2.3.0/README.md +62 -26
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/RELEASE_NOTES.md +29 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/openclaw.plugin.json +2 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/package.json +2 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/pyproject.toml +2 -2
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/server.json +3 -3
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/skills/vmware-aiops/SKILL.md +12 -9
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/skills/vmware-aiops/references/agent-guardrails.md +1 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/skills/vmware-aiops/references/capabilities.md +23 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/skills/vmware-aiops/references/cli-reference.md +1 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/skills/vmware-aiops/references/setup-guide.md +34 -6
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_atexit_handlers_do_not_accumulate.py +1 -5
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_daemon_host_log_cycles.py +1 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_session_probe_eviction.py +27 -7
- vmware_aiops-2.3.0/tests/test_access_info.py +154 -0
- vmware_aiops-2.3.0/tests/test_concurrent_local_state.py +181 -0
- vmware_aiops-2.3.0/tests/test_session_pool.py +220 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/uv.lock +7 -7
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/__init__.py +1 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/_fsutil.py +22 -0
- vmware_aiops-2.3.0/vmware_aiops/access_requirements.py +207 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/_root.py +2 -0
- vmware_aiops-2.3.0/vmware_aiops/cli/access.py +46 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/connection.py +59 -41
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/_shared.py +15 -8
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/server.py +2 -0
- vmware_aiops-2.3.0/vmware_aiops/mcp_server/tools/access.py +53 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/datastore_browser.py +3 -4
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/plan_executor.py +56 -1
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/planner.py +5 -6
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/ttl.py +24 -15
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/scanner/scheduler.py +20 -3
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.clawhubignore +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.env.example +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.github/dependabot.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/.gitignore +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/Dockerfile +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/LICENSE +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/SECURITY.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/config.example.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/docker-compose.yml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/docs/integrations/continue.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/docs/integrations/cursor.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/docs/integrations/goose.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/docs/integrations/localcowork.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/docs/integrations/mcp-agent.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/docs/integrations/vscode-copilot.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/docs/plans/2026-03-09-plan-apply-design.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/deploy.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/mcp-configs/README.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/mcp-configs/claude-code.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/mcp-configs/continue.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/mcp-configs/cursor.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/mcp-configs/goose.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/mcp-configs/localcowork.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/mcp-configs/mcp-agent.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/mcp-configs/vscode-copilot.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/examples/ollama-local-setup.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/skills/vmware-aiops/evals/evals.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/skills/vmware-aiops/references/investigation-protocol.md +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/smithery.yaml +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/conftest.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/_family.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/_scores.json +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/_scoring.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/_skill.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/conftest.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/test_entity_reachability.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/test_error_actionability.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/test_tool_description_quality.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/_diag_fakes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/_pc_fakes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_aiops_specific.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_alarm_health_scale_n1.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_capability_grader.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_cli_destructive_guards.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_cluster_health_summary_delegation.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_code_review_fixes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_config_path_resolution_is_shared.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_daemon_calls_are_audited.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_deploy_correctness.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_doctor_authenticates_every_target.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_documented_gates_match_the_registry.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_enum_params_match_implementation.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_env_secret_obfuscation.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_event_sets_match_real_class_names.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_events_are_read_newest_first.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_guest_download_writes_the_local_disk.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_guest_username_is_explicit.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_host_log_scan_reads_real_logs.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_instructions_name_targets.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_inventory_scale_issue31.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_list_envelope_conformance.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_list_plans_is_non_destructive.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_mcp_frame_marks_failures.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_release_blockers.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_result_envelope.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_returned_failure_is_audited.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_set_ttl_safety.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_snapshot_async.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_text_io_declares_encoding.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_tool_annotations_match_behaviour.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_unreachable_host_vmks.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_v1_5_25_blockers.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/eval/regression/test_vim_attribute_conformance.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_cluster_mgmt_sanitize.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_cluster_ttl_plan_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_config.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_drs_rules.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_gate_review_fixes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_guest_tools_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_host_network_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_init_and_onboarding.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_network_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_no_destructive_ops.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_plan_gate_narrow_fixes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_plan_rollback_final_fixes.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_reset_alarm_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_results_name_their_target.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_safe_error_passthrough.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_stop_signal_runs_atexit.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_vm_delete_blast_radius.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/tests/test_vm_tools_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/_common.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/alarm.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/cluster.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/deploy.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/doctor.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/hub.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/investigate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/mcp_config.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/plan.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/scan.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/summary.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/cli/vm.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/config.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/doctor.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/init_wizard.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/__main__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/alarm.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/cluster.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/datastore.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/deploy.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/guest.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/network.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/plan.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/summary.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/ttl.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/mcp_server/tools/vm.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/notify/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/notify/audit.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/notify/logger.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/notify/webhook.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/_paging.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/alarm_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/cluster_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/cluster_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/guest_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/guest_ops.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/health.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/host_network_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/inventory.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/iscsi_config.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/network_mgmt.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/ova_deploy.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/plan_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/vm_delete_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/vm_deploy.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/vm_gate.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/ops/vm_lifecycle.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/policy_environment.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/scanner/__init__.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/vmware_aiops/scanner/alarm_scanner.py +0 -0
- {vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/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.0",
|
|
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.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.22.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
|
|
|
@@ -956,6 +981,7 @@ User → Aider CLI → Ollama (localhost:11434) → Qwen / DeepSeek local model
|
|
|
956
981
|
# Diagnostics
|
|
957
982
|
vmware-aiops doctor # Check environment, config, connectivity
|
|
958
983
|
vmware-aiops doctor --skip-auth # Skip vSphere auth check (faster)
|
|
984
|
+
vmware-aiops access-info [--tool <mcp-tool>] [--target <name>] # Account in use + privileges per tool
|
|
959
985
|
|
|
960
986
|
# MCP Config Generator
|
|
961
987
|
vmware-aiops mcp-config generate --agent goose # Generate config for Goose
|
|
@@ -1122,6 +1148,64 @@ Built on **pyVmomi** (vSphere Web Services API / SOAP).
|
|
|
1122
1148
|
|
|
1123
1149
|
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
1150
|
|
|
1151
|
+
<!-- usage: remote-and-exposure -->
|
|
1152
|
+
## Remote access (HTTPS) and limiting tools
|
|
1153
|
+
|
|
1154
|
+
By default `vmware-aiops mcp` speaks stdio to one local client and offers every tool. Two options change that
|
|
1155
|
+
(vmware-policy ≥ 1.21.0).
|
|
1156
|
+
|
|
1157
|
+
**Serve over HTTPS** so clients on other machines can connect. Every caller needs a bearer token:
|
|
1158
|
+
|
|
1159
|
+
```bash
|
|
1160
|
+
vmware-audit token create alice # prints the token once; give it to alice
|
|
1161
|
+
vmware-audit token list # names only
|
|
1162
|
+
vmware-audit token revoke alice # refused from its next request, no restart
|
|
1163
|
+
vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
|
|
1164
|
+
--cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \
|
|
1165
|
+
--public-name mcp.example.com
|
|
1166
|
+
```
|
|
1167
|
+
|
|
1168
|
+
Connect a client (Claude Code shown; any MCP client that supports streamable HTTP and custom headers works):
|
|
1169
|
+
|
|
1170
|
+
```bash
|
|
1171
|
+
claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
|
|
1172
|
+
--header "Authorization: Bearer $VMWARE_MCP_TOKEN"
|
|
1173
|
+
```
|
|
1174
|
+
|
|
1175
|
+
```json
|
|
1176
|
+
{
|
|
1177
|
+
"mcpServers": {
|
|
1178
|
+
"vmware-aiops": {
|
|
1179
|
+
"type": "http",
|
|
1180
|
+
"url": "https://mcp.example.com:8443/mcp",
|
|
1181
|
+
"headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
```
|
|
1186
|
+
|
|
1187
|
+
- The server will not start without a token, refuses Host/Origin values outside `--public-name`, and checks
|
|
1188
|
+
before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.
|
|
1189
|
+
- Behind a TLS-terminating reverse proxy on the same machine use `--transport http --host 127.0.0.1
|
|
1190
|
+
--public-name mcp.example.com` and pass the `Authorization` header through.
|
|
1191
|
+
- The audit log records each caller as `token:<name>`. Calls run side by side, with up to `VMWARE_MCP_POOL_SIZE`
|
|
1192
|
+
(default 2) sessions per target; each session is a login on the target, and a call waits at most 300 s for one.
|
|
1193
|
+
- **Everyone who can reach the endpoint acts with this server's account.** Tokens identify callers; they grant
|
|
1194
|
+
nothing on the platform. Run one endpoint per privilege level.
|
|
1195
|
+
|
|
1196
|
+
**Offer only read tools, plus the writes you choose:**
|
|
1197
|
+
|
|
1198
|
+
```bash
|
|
1199
|
+
vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
|
|
1200
|
+
# or: VMWARE_AIOPS_MCP_EXPOSE=read VMWARE_AIOPS_MCP_ALLOW_WRITE=acknowledge_vcenter_alarm vmware-aiops mcp
|
|
1201
|
+
```
|
|
1202
|
+
|
|
1203
|
+
Tools not offered do not appear in the client's tool list. A bad value or an unknown write tool stops the server
|
|
1204
|
+
(exit 2). This limits what clients are offered; it is not authorization, so the account itself should be
|
|
1205
|
+
least-privilege.
|
|
1206
|
+
|
|
1207
|
+
Details: `skills/vmware-aiops/references/setup-guide.md` ("Serving MCP over HTTPS", "Limiting which tools are offered").
|
|
1208
|
+
|
|
1125
1209
|
## License
|
|
1126
1210
|
|
|
1127
1211
|
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 解析 |
|
|
@@ -665,6 +666,7 @@ aider --conventions skills/vmware-aiops/SKILL.md --model ollama/qwen2.5-coder:32
|
|
|
665
666
|
# 环境诊断
|
|
666
667
|
vmware-aiops doctor # 检查环境、配置、连通性
|
|
667
668
|
vmware-aiops doctor --skip-auth # 跳过 vSphere 认证检查(更快)
|
|
669
|
+
vmware-aiops access-info [--tool <mcp-tool>] [--target <name>] # 当前账号 + 每个工具的权限
|
|
668
670
|
|
|
669
671
|
# MCP 配置生成
|
|
670
672
|
vmware-aiops mcp-config generate --agent goose # 生成 Goose 配置
|
|
@@ -787,6 +789,63 @@ VMware-AIops/
|
|
|
787
789
|
|
|
788
790
|
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
791
|
|
|
792
|
+
<!-- usage: remote-and-exposure -->
|
|
793
|
+
## 远程访问(HTTPS)与限制工具
|
|
794
|
+
|
|
795
|
+
默认情况下 `vmware-aiops mcp` 通过 stdio 服务一个本地客户端,并提供全部工具。以下两个选项可以改变这一点
|
|
796
|
+
(需 vmware-policy ≥ 1.21.0)。
|
|
797
|
+
|
|
798
|
+
**通过 HTTPS 提供服务**,让其他机器上的客户端连接。每个调用者都需要一个 bearer token:
|
|
799
|
+
|
|
800
|
+
```bash
|
|
801
|
+
vmware-audit token create alice # 只显示一次,交给 alice
|
|
802
|
+
vmware-audit token list # 只列名字
|
|
803
|
+
vmware-audit token revoke alice # 下一个请求起即拒绝,无需重启
|
|
804
|
+
vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
|
|
805
|
+
--cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \
|
|
806
|
+
--public-name mcp.example.com
|
|
807
|
+
```
|
|
808
|
+
|
|
809
|
+
连接客户端(以 Claude Code 为例;任何支持 streamable HTTP 和自定义请求头的 MCP 客户端都可以):
|
|
810
|
+
|
|
811
|
+
```bash
|
|
812
|
+
claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
|
|
813
|
+
--header "Authorization: Bearer $VMWARE_MCP_TOKEN"
|
|
814
|
+
```
|
|
815
|
+
|
|
816
|
+
```json
|
|
817
|
+
{
|
|
818
|
+
"mcpServers": {
|
|
819
|
+
"vmware-aiops": {
|
|
820
|
+
"type": "http",
|
|
821
|
+
"url": "https://mcp.example.com:8443/mcp",
|
|
822
|
+
"headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
- 没有 token 时服务不会启动;`--public-name` 之外的 Host/Origin 一律拒绝;绑定端口前会自检,确认未认证请求得到 401。
|
|
829
|
+
证书要用客户端信任、且覆盖这些名字的证书。
|
|
830
|
+
- 在同一台机器上由反向代理终结 TLS 时,用 `--transport http --host 127.0.0.1 --public-name mcp.example.com`,
|
|
831
|
+
并让代理透传 `Authorization` 头。
|
|
832
|
+
- 审计日志把每个调用者记为 `token:<名字>`。调用并行执行,每个 target 最多 `VMWARE_MCP_POOL_SIZE`(默认 2)
|
|
833
|
+
个会话;每个会话都是在该 target 上的一次登录,一个调用最多等待 300 秒拿到会话。
|
|
834
|
+
- **能连到这个端点的人,都以该 server 配置的账号操作。** token 只用来识别调用者,不在平台上授予任何权限。
|
|
835
|
+
每个权限级别单独起一个端点。
|
|
836
|
+
|
|
837
|
+
**只提供读工具,加上你选定的写工具:**
|
|
838
|
+
|
|
839
|
+
```bash
|
|
840
|
+
vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
|
|
841
|
+
# 或:VMWARE_AIOPS_MCP_EXPOSE=read VMWARE_AIOPS_MCP_ALLOW_WRITE=acknowledge_vcenter_alarm vmware-aiops mcp
|
|
842
|
+
```
|
|
843
|
+
|
|
844
|
+
未提供的工具不会出现在客户端的工具列表里。取值错误或写工具名不存在时服务直接退出(exit 2)。
|
|
845
|
+
这只限制提供给客户端的工具,不是授权;账号本身仍应遵循最小权限。
|
|
846
|
+
|
|
847
|
+
详见 `skills/vmware-aiops/references/setup-guide.md`("Serving MCP over HTTPS"、"Limiting which tools are offered")。
|
|
848
|
+
|
|
790
849
|
## 许可证
|
|
791
850
|
|
|
792
851
|
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
|
|
|
@@ -980,6 +957,7 @@ User → Aider CLI → Ollama (localhost:11434) → Qwen / DeepSeek local model
|
|
|
980
957
|
# Diagnostics
|
|
981
958
|
vmware-aiops doctor # Check environment, config, connectivity
|
|
982
959
|
vmware-aiops doctor --skip-auth # Skip vSphere auth check (faster)
|
|
960
|
+
vmware-aiops access-info [--tool <mcp-tool>] [--target <name>] # Account in use + privileges per tool
|
|
983
961
|
|
|
984
962
|
# MCP Config Generator
|
|
985
963
|
vmware-aiops mcp-config generate --agent goose # Generate config for Goose
|
|
@@ -1146,6 +1124,64 @@ Built on **pyVmomi** (vSphere Web Services API / SOAP).
|
|
|
1146
1124
|
|
|
1147
1125
|
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
1126
|
|
|
1127
|
+
<!-- usage: remote-and-exposure -->
|
|
1128
|
+
## Remote access (HTTPS) and limiting tools
|
|
1129
|
+
|
|
1130
|
+
By default `vmware-aiops mcp` speaks stdio to one local client and offers every tool. Two options change that
|
|
1131
|
+
(vmware-policy ≥ 1.21.0).
|
|
1132
|
+
|
|
1133
|
+
**Serve over HTTPS** so clients on other machines can connect. Every caller needs a bearer token:
|
|
1134
|
+
|
|
1135
|
+
```bash
|
|
1136
|
+
vmware-audit token create alice # prints the token once; give it to alice
|
|
1137
|
+
vmware-audit token list # names only
|
|
1138
|
+
vmware-audit token revoke alice # refused from its next request, no restart
|
|
1139
|
+
vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
|
|
1140
|
+
--cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \
|
|
1141
|
+
--public-name mcp.example.com
|
|
1142
|
+
```
|
|
1143
|
+
|
|
1144
|
+
Connect a client (Claude Code shown; any MCP client that supports streamable HTTP and custom headers works):
|
|
1145
|
+
|
|
1146
|
+
```bash
|
|
1147
|
+
claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
|
|
1148
|
+
--header "Authorization: Bearer $VMWARE_MCP_TOKEN"
|
|
1149
|
+
```
|
|
1150
|
+
|
|
1151
|
+
```json
|
|
1152
|
+
{
|
|
1153
|
+
"mcpServers": {
|
|
1154
|
+
"vmware-aiops": {
|
|
1155
|
+
"type": "http",
|
|
1156
|
+
"url": "https://mcp.example.com:8443/mcp",
|
|
1157
|
+
"headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
```
|
|
1162
|
+
|
|
1163
|
+
- The server will not start without a token, refuses Host/Origin values outside `--public-name`, and checks
|
|
1164
|
+
before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.
|
|
1165
|
+
- Behind a TLS-terminating reverse proxy on the same machine use `--transport http --host 127.0.0.1
|
|
1166
|
+
--public-name mcp.example.com` and pass the `Authorization` header through.
|
|
1167
|
+
- The audit log records each caller as `token:<name>`. Calls run side by side, with up to `VMWARE_MCP_POOL_SIZE`
|
|
1168
|
+
(default 2) sessions per target; each session is a login on the target, and a call waits at most 300 s for one.
|
|
1169
|
+
- **Everyone who can reach the endpoint acts with this server's account.** Tokens identify callers; they grant
|
|
1170
|
+
nothing on the platform. Run one endpoint per privilege level.
|
|
1171
|
+
|
|
1172
|
+
**Offer only read tools, plus the writes you choose:**
|
|
1173
|
+
|
|
1174
|
+
```bash
|
|
1175
|
+
vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
|
|
1176
|
+
# or: VMWARE_AIOPS_MCP_EXPOSE=read VMWARE_AIOPS_MCP_ALLOW_WRITE=acknowledge_vcenter_alarm vmware-aiops mcp
|
|
1177
|
+
```
|
|
1178
|
+
|
|
1179
|
+
Tools not offered do not appear in the client's tool list. A bad value or an unknown write tool stops the server
|
|
1180
|
+
(exit 2). This limits what clients are offered; it is not authorization, so the account itself should be
|
|
1181
|
+
least-privilege.
|
|
1182
|
+
|
|
1183
|
+
Details: `skills/vmware-aiops/references/setup-guide.md` ("Serving MCP over HTTPS", "Limiting which tools are offered").
|
|
1184
|
+
|
|
1149
1185
|
## License
|
|
1150
1186
|
|
|
1151
1187
|
MIT
|
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
## v2.3.0 — calls on one target run side by side; `get_access_info`
|
|
2
|
+
|
|
3
|
+
Needs vmware-policy 1.22.0.
|
|
4
|
+
|
|
5
|
+
* **Calls no longer queue behind each other on a shared server.** Served over `--transport https`/`http`,
|
|
6
|
+
calls run side by side with up to `VMWARE_MCP_POOL_SIZE` (default 2) sessions per target; each call holds its
|
|
7
|
+
own session for its whole run, so two calls never share one. Each session is a login on the target. A call
|
|
8
|
+
that finds every session busy waits at most 300 s, then fails with a message saying so. stdio and the CLI
|
|
9
|
+
keep one session per target, as before.
|
|
10
|
+
* **Side-by-side calls no longer race on local state.** Two TTL changes at once could drop each other's entry
|
|
11
|
+
(and a reader catching the file mid-write saw no entries at all); the TTL store and the image registry are now
|
|
12
|
+
written atomically and TTL updates are serialized. One plan can no longer be applied or rolled back by two
|
|
13
|
+
calls at once: the second is refused with a message, and nothing runs twice.
|
|
14
|
+
* **The daemon's scan and TTL check each use their own session.** They run on APScheduler's thread pool and
|
|
15
|
+
could overlap on one pyVmomi session.
|
|
16
|
+
* **New tool `get_access_info`** (CLI `vmware-aiops access-info [--tool X] [--target T]`): which account the
|
|
17
|
+
server uses on a target, and whether it holds the privileges each tool needs, e.g. `--tool clone_vm`. It asks
|
|
18
|
+
vCenter about its own session (System.View is enough). Checked on the root folder: `not_granted_at_root` can
|
|
19
|
+
still be granted on a cluster, folder or VM, and `undetermined` is never read as granted. 61 tools (was 60).
|
|
20
|
+
|
|
1
21
|
## v2.2.0 — serve MCP over HTTPS
|
|
2
22
|
|
|
3
23
|
`vmware-aiops mcp` can now serve the network as well as stdio (HLD §16, via vmware-policy 1.21.0):
|
|
@@ -8,6 +28,15 @@ vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
|
|
|
8
28
|
--cert server.pem --key server-key.pem --public-name mcp.example.com
|
|
9
29
|
```
|
|
10
30
|
|
|
31
|
+
Connect a client and manage callers (Claude Code shown; any MCP client with streamable HTTP and custom headers works):
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
|
|
35
|
+
--header "Authorization: Bearer $VMWARE_MCP_TOKEN"
|
|
36
|
+
vmware-audit token list # names only
|
|
37
|
+
vmware-audit token revoke alice # refused from its next request, no restart
|
|
38
|
+
```
|
|
39
|
+
|
|
11
40
|
* Every request needs `Authorization: Bearer <token>`; the server will not start without a token, refuses Host or
|
|
12
41
|
Origin values outside `--public-name`, and checks itself (unauthenticated requests must get 401) before it
|
|
13
42
|
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.0",
|
|
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.0",
|
|
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.0"
|
|
8
8
|
description = "VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -19,7 +19,7 @@ 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.22.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.
|
|
@@ -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.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "vmware-aiops",
|
|
15
|
-
"version": "2.
|
|
15
|
+
"version": "2.3.0",
|
|
16
16
|
"runtimeHint": "uvx",
|
|
17
17
|
"packageArguments": [
|
|
18
18
|
{
|
|
@@ -27,7 +27,7 @@ compatibility: >
|
|
|
27
27
|
|
|
28
28
|
> **Disclaimer**: This is a community-maintained open-source project and is **not affiliated with, endorsed by, or sponsored by VMware, Inc. or Broadcom Inc.** "VMware" and "vSphere" are trademarks of Broadcom. Source code is publicly auditable at [github.com/vmware-skills/VMware-AIops](https://github.com/vmware-skills/VMware-AIops) under the MIT license.
|
|
29
29
|
|
|
30
|
-
VMware family entry point — AI-powered VM lifecycle, deployment, and alarm management —
|
|
30
|
+
VMware family entry point — AI-powered VM lifecycle, deployment, and alarm management — 61 MCP tools.
|
|
31
31
|
|
|
32
32
|
> **Start here**: install vmware-aiops first, then add modules as needed.
|
|
33
33
|
> Run `vmware-aiops hub status` to see which family members are installed.
|
|
@@ -47,6 +47,7 @@ VMware family entry point — AI-powered VM lifecycle, deployment, and alarm man
|
|
|
47
47
|
| **Network** | dvSwitch portgroup list/create, host VMkernel list/add/remove/tag-service, DF-bit MTU-path ping | 7 |
|
|
48
48
|
| **Alarm Management** | list alarms, acknowledge, reset | 3 |
|
|
49
49
|
| **Triage & Investigation** (read-only, delegates to vmware-monitor) | one-glance cluster health summary, object-centered VM/host/datastore drill-down bundles, cross-vCenter "what needs attention now?" | 5 |
|
|
50
|
+
| **Access** | which account is in use, and whether it holds each tool's privileges | 1 |
|
|
50
51
|
|
|
51
52
|
## Audit & Safety
|
|
52
53
|
|
|
@@ -62,7 +63,7 @@ Read before connecting an agent. Per-tool inventory: `references/capabilities.md
|
|
|
62
63
|
## Quick Install
|
|
63
64
|
|
|
64
65
|
```bash
|
|
65
|
-
uv tool install vmware-aiops==2.
|
|
66
|
+
uv tool install vmware-aiops==2.3.0
|
|
66
67
|
vmware-aiops doctor
|
|
67
68
|
vmware-aiops hub status # see which family members are installed
|
|
68
69
|
```
|
|
@@ -117,7 +118,7 @@ vmware-aiops is the entry point. Add modules for additional capabilities:
|
|
|
117
118
|
|
|
118
119
|
## Common Workflows
|
|
119
120
|
|
|
120
|
-
> **Diagnostic investigations**: Before remediating any "why is X slow / failing / down" issue, follow [`references/investigation-protocol.md`](references/investigation-protocol.md). It enforces
|
|
121
|
+
> **Diagnostic investigations**: Before remediating any "why is X slow / failing / down" issue, follow [`references/investigation-protocol.md`](references/investigation-protocol.md). It enforces four root-cause completeness criteria and a deepening loop. Only invoke L3+ write tools after the four criteria are satisfied AND the user has approved a remediation plan.
|
|
121
122
|
|
|
122
123
|
### Cluster Health Triage ("what's wrong right now?")
|
|
123
124
|
|
|
@@ -125,7 +126,7 @@ Start here when the ask is "is anything on fire?" before diving into a specific
|
|
|
125
126
|
|
|
126
127
|
1. One glance --> `get_cluster_health_summary` (MCP) or `vmware-aiops summary` (CLI). Read `top_issues` first — ranked anomalies (disconnected hosts, red/yellow alarms, capacity pressure), each with a drill-down hint; the per-cluster table is context
|
|
127
128
|
2. Act on what it surfaces --> a `host_down` row → investigate the host; an alarm → `acknowledge_vcenter_alarm` / `reset_vcenter_alarm`; a hot VM implicated → `migrate_vm` or `reconfigure_vm` (after the investigation protocol)
|
|
128
|
-
3. Save/share a snapshot --> `vmware-aiops summary --html` writes an offline, timestamped HTML file (
|
|
129
|
+
3. Save/share a snapshot --> `vmware-aiops summary --html` writes an offline, timestamped HTML file (same renderer as vmware-monitor)
|
|
129
130
|
4. **If vmware-monitor is not installed** --> this command/tool is unavailable (AIops delegates to it); install `vmware-monitor`, or use the deeper per-object read tools in that skill
|
|
130
131
|
|
|
131
132
|
### Object-Centered Investigation → Act (drill-down before you change anything)
|
|
@@ -143,7 +144,7 @@ Start here when the ask is "is anything on fire?" before diving into a specific
|
|
|
143
144
|
### Deploy a Lab Environment
|
|
144
145
|
|
|
145
146
|
**Pre-flight (judgment, not blind sequence)**:
|
|
146
|
-
- Free space: target datastore must have ≥ OVA size × 2 (delta files + thin-provision overhead).
|
|
147
|
+
- Free space: target datastore must have ≥ OVA size × 2 (delta files + thin-provision overhead).
|
|
147
148
|
- Name hygiene: prefix with date or owner (`lab-2026-04-30-alice`) so the TTL cleanup audit trail is meaningful.
|
|
148
149
|
- TTL: always set. 480 min for a single test session, 7200 min for a week-long sandbox. **Never deploy a "lab" VM without a TTL** — that is how datastores fill up at 3 AM.
|
|
149
150
|
- Snapshot timing: take the baseline **after** provisioning succeeds, not before — a pre-provision snapshot is just an empty checkpoint.
|
|
@@ -161,8 +162,9 @@ Start here when the ask is "is anything on fire?" before diving into a specific
|
|
|
161
162
|
- Source VM state: powered-off is safest. If powered-on, VMware Tools must be running and quiesce-capable, else clones may have inconsistent disk state.
|
|
162
163
|
- Capacity math: `free_space ≥ source.size × count × 1.2` (full clone) or `≥ count × 2 GB` (linked clone, delta-only).
|
|
163
164
|
- Decision rule: **count > 10 → use linked clones** (`deploy linked-clone`); seconds vs minutes per clone, ~100× less storage. Tradeoff: linked clones depend on source snapshot — deleting the snapshot breaks all children.
|
|
164
|
-
- Network
|
|
165
|
+
- Network: batches > 200 can exhaust the vSphere MAC pool.
|
|
165
166
|
- TTL: every clone must have one. Use the plan's metadata to track ownership.
|
|
167
|
+
- Privileges: `get_access_info(tool="clone_vm")` (CLI `vmware-aiops access-info --tool clone_vm`) — root folder only; `undetermined` is not granted.
|
|
166
168
|
|
|
167
169
|
**Steps**:
|
|
168
170
|
1. `create_vm_plan` with clone + reconfigure + set-ttl steps grouped per VM (atomic per clone)
|
|
@@ -193,7 +195,7 @@ Start here when the ask is "is anything on fire?" before diving into a specific
|
|
|
193
195
|
| Cloud models (Claude, GPT-4o) | Either | MCP gives structured JSON I/O |
|
|
194
196
|
| Automated pipelines | **MCP** | Type-safe parameters, structured output |
|
|
195
197
|
|
|
196
|
-
## MCP Tools (
|
|
198
|
+
## MCP Tools (61 — 18 read, 43 write)
|
|
197
199
|
|
|
198
200
|
| Category | Tools | R/W |
|
|
199
201
|
|----------|-------|:---:|
|
|
@@ -212,10 +214,11 @@ Start here when the ask is "is anything on fire?" before diving into a specific
|
|
|
212
214
|
| | `acknowledge_vcenter_alarm`, `reset_vcenter_alarm` | Write |
|
|
213
215
|
| Cluster Triage (1) | `get_cluster_health_summary` (delegates to vmware-monitor) | Read |
|
|
214
216
|
| Object Investigation (4) | `investigate_vm`, `investigate_host`, `investigate_datastore`, `get_cross_vcenter_attention` (all delegate to vmware-monitor) | Read |
|
|
217
|
+
| Access (1) | `get_access_info` | Read |
|
|
215
218
|
|
|
216
219
|
**List envelope**: the read list tools — `browse_datastore`, `list_vcenter_alarms`, `list_vm_plans`, `list_vm_snapshots`, `list_vm_ttls` — return `{items, returned, limit, total, truncated, hint}` rather than a bare array. Read the rows from `items` and check `truncated` before concluding a listing is complete; empty `items` with `truncated: false` means checked-and-none, not a failure. The write `batch_*` tools keep their bare list (complete by construction). Rationale, `total` semantics, error shape: `references/capabilities.md`.
|
|
217
220
|
|
|
218
|
-
**Read/write split**:
|
|
221
|
+
**Read/write split**: 18 tools are read-only (per `[READ]` docstring marker), 43 modify state — gating in [Audit & Safety](#audit--safety). `set_vm_ttl` schedules an unattended auto-delete.
|
|
219
222
|
|
|
220
223
|
**Network write gating**: all four network writes are preview/confirm-gated — `confirm=False` (default) returns the exact spec without writing. `remove_host_vmk` is **fail-closed**: it refuses when the vmk is selected for a host service (management/vMotion/vSAN), lives on a non-default netstack (NSX TEPs, dedicated vMotion stacks), carries a default gateway route, or when any of that cannot be verified — pass `force_unprotected=True` to override the non-absolute protections. The host's only management-enabled vmk is never removable (no override). `set_vmk_service` is **fail-closed** too: it refuses both directions when the host's service map is unreadable, and refuses (no override) to untag `management` from the host's only management-enabled vmk — the call rides the interface it would untag.
|
|
221
224
|
|
|
@@ -298,7 +301,7 @@ Run `vmware-aiops plan list` to see failed plan status. Ask user if they want to
|
|
|
298
301
|
## Setup
|
|
299
302
|
|
|
300
303
|
```bash
|
|
301
|
-
uv tool install vmware-aiops==2.
|
|
304
|
+
uv tool install vmware-aiops==2.3.0
|
|
302
305
|
mkdir -p ~/.vmware-aiops
|
|
303
306
|
vmware-aiops init # generates config.yaml and .env templates
|
|
304
307
|
chmod 600 ~/.vmware-aiops/.env
|
{vmware_aiops-2.2.0 → vmware_aiops-2.3.0}/skills/vmware-aiops/references/agent-guardrails.md
RENAMED
|
@@ -14,7 +14,7 @@ vmware-monitor and vmware-aria against a production vSphere estate with Llama
|
|
|
14
14
|
cross-skill rules are identical across this family; the parts below marked
|
|
15
15
|
vmware-aiops are specific to this skill.
|
|
16
16
|
|
|
17
|
-
vmware-aiops carries the family's largest write surface — 43 of its
|
|
17
|
+
vmware-aiops carries the family's largest write surface — 43 of its 61 MCP
|
|
18
18
|
tools change state, including `delete_vm`, cluster deletion, host VMkernel
|
|
19
19
|
removal and guest command execution. Of every skill here, this is the one where a model's discipline
|
|
20
20
|
should not be the only thing standing between a prompt and a destroyed VM — and
|
|
@@ -291,6 +291,29 @@ MCP-only (no CLI subcommand). Seven tools for distributed-switch portgroup and h
|
|
|
291
291
|
|
|
292
292
|
> **Blast radius**: vSphere has no per-alarm clear API. `alarm reset` / `reset_vcenter_alarm` uses `AlarmManager.ClearTriggeredAlarms`, which clears **all** triggered alarms matching the named alarm's entity type (host/VM/all) and current status (red/yellow) — not just the named one. The named alarm is looked up first (typos fail fast). Over MCP a bare call previews every alarm it would clear (`blast_radius.will_clear`) and changes nothing; `confirm=True` clears, and the result's `scope` field reports exactly what was cleared. Cleared alarms re-trigger automatically if their underlying condition persists.
|
|
293
293
|
|
|
294
|
+
## Access self-check — `get_access_info`
|
|
295
|
+
|
|
296
|
+
`get_access_info(tool=None, target=None)` (CLI `access-info`) asks the target about this
|
|
297
|
+
server's own session (`HasPrivilegeOnEntities`, which needs only System.View) and answers
|
|
298
|
+
which account it acts as and whether that account holds the privileges a tool needs: with
|
|
299
|
+
`tool`, `{name, requires, verdict, meaning, missing_at_root}`; without it, every tool sorted
|
|
300
|
+
into `tools_granted_at_root` / `tools_not_granted_at_root` / `tools_undetermined` /
|
|
301
|
+
`tools_no_privilege_needed`, plus the account's direct permissions. Use it before a write
|
|
302
|
+
the account may not be allowed, or after a NoPermission. The table it reads is
|
|
303
|
+
`vmware_aiops/access_requirements.py`.
|
|
304
|
+
|
|
305
|
+
- Checked on the **root folder** only. `not_granted_at_root` may still be granted on a
|
|
306
|
+
cluster, folder or VM; `undetermined` (the platform did not answer) is never granted.
|
|
307
|
+
- Where vSphere checks a privilege inside the method (reconfigure, clone from a template,
|
|
308
|
+
vMotion, cluster delete, datastore browse), the table lists vSphere's documented id.
|
|
309
|
+
`ping_from_vmk` (esxcli through the host) is always `undetermined`: what the host checks
|
|
310
|
+
for it is not documented.
|
|
311
|
+
- `set_vm_ttl` includes what `delete_vm` needs: the daemon deletes later as this account.
|
|
312
|
+
- `apply_vm_plan` / `rollback_vm_plan` list every privilege any plan step could need; a
|
|
313
|
+
given plan needs only its own steps'.
|
|
314
|
+
|
|
315
|
+
**Typical response tokens**: ~310 for one tool, ~900 for all 61.
|
|
316
|
+
|
|
294
317
|
## Scheduled Scanning & Notifications
|
|
295
318
|
|
|
296
319
|
| Feature | Details |
|
|
@@ -9,6 +9,7 @@ default, the other 20 write tools act immediately, and the enforcement boundary
|
|
|
9
9
|
```bash
|
|
10
10
|
# Diagnostics
|
|
11
11
|
vmware-aiops doctor [--skip-auth] # --skip-auth only skips doctor's own vSphere login check; no other command has it
|
|
12
|
+
vmware-aiops access-info [--tool <mcp-tool>] [--target <name>] # account in use + its privileges per MCP tool (JSON; root folder only)
|
|
12
13
|
|
|
13
14
|
# MCP Config Generator
|
|
14
15
|
vmware-aiops mcp-config generate --agent <goose|cursor|claude-code|continue|vscode-copilot|localcowork|mcp-agent>
|