kubectl-mcp-server 1.15.0__py3-none-any.whl → 1.17.0__py3-none-any.whl
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.
- {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/METADATA +34 -13
- kubectl_mcp_server-1.17.0.dist-info/RECORD +75 -0
- kubectl_mcp_tool/__init__.py +1 -1
- kubectl_mcp_tool/cli/cli.py +83 -9
- kubectl_mcp_tool/cli/output.py +14 -0
- kubectl_mcp_tool/config/__init__.py +46 -0
- kubectl_mcp_tool/config/loader.py +386 -0
- kubectl_mcp_tool/config/schema.py +184 -0
- kubectl_mcp_tool/crd_detector.py +247 -0
- kubectl_mcp_tool/k8s_config.py +19 -0
- kubectl_mcp_tool/mcp_server.py +246 -8
- kubectl_mcp_tool/observability/__init__.py +59 -0
- kubectl_mcp_tool/observability/metrics.py +223 -0
- kubectl_mcp_tool/observability/stats.py +255 -0
- kubectl_mcp_tool/observability/tracing.py +335 -0
- kubectl_mcp_tool/prompts/__init__.py +43 -0
- kubectl_mcp_tool/prompts/builtin.py +695 -0
- kubectl_mcp_tool/prompts/custom.py +298 -0
- kubectl_mcp_tool/prompts/prompts.py +180 -4
- kubectl_mcp_tool/safety.py +155 -0
- kubectl_mcp_tool/tools/__init__.py +20 -0
- kubectl_mcp_tool/tools/backup.py +881 -0
- kubectl_mcp_tool/tools/capi.py +727 -0
- kubectl_mcp_tool/tools/certs.py +709 -0
- kubectl_mcp_tool/tools/cilium.py +582 -0
- kubectl_mcp_tool/tools/cluster.py +384 -0
- kubectl_mcp_tool/tools/gitops.py +552 -0
- kubectl_mcp_tool/tools/keda.py +464 -0
- kubectl_mcp_tool/tools/kiali.py +652 -0
- kubectl_mcp_tool/tools/kubevirt.py +803 -0
- kubectl_mcp_tool/tools/policy.py +554 -0
- kubectl_mcp_tool/tools/rollouts.py +790 -0
- tests/test_browser.py +2 -2
- tests/test_config.py +386 -0
- tests/test_ecosystem.py +331 -0
- tests/test_mcp_integration.py +251 -0
- tests/test_observability.py +521 -0
- tests/test_prompts.py +716 -0
- tests/test_safety.py +218 -0
- tests/test_tools.py +70 -8
- kubectl_mcp_server-1.15.0.dist-info/RECORD +0 -49
- {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/WHEEL +0 -0
- {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/entry_points.txt +0 -0
- {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/licenses/LICENSE +0 -0
- {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/top_level.txt +0 -0
tests/test_safety.py
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"""Tests for safety mode implementation."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from kubectl_mcp_tool.safety import (
|
|
5
|
+
SafetyMode,
|
|
6
|
+
get_safety_mode,
|
|
7
|
+
set_safety_mode,
|
|
8
|
+
is_operation_allowed,
|
|
9
|
+
check_safety_mode,
|
|
10
|
+
get_mode_info,
|
|
11
|
+
WRITE_OPERATIONS,
|
|
12
|
+
DESTRUCTIVE_OPERATIONS,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestSafetyMode:
|
|
17
|
+
"""Test safety mode enum and state management."""
|
|
18
|
+
|
|
19
|
+
def setup_method(self):
|
|
20
|
+
"""Reset safety mode to NORMAL before each test."""
|
|
21
|
+
set_safety_mode(SafetyMode.NORMAL)
|
|
22
|
+
|
|
23
|
+
def test_default_mode_is_normal(self):
|
|
24
|
+
"""Test that default safety mode is NORMAL."""
|
|
25
|
+
assert get_safety_mode() == SafetyMode.NORMAL
|
|
26
|
+
|
|
27
|
+
def test_set_read_only_mode(self):
|
|
28
|
+
"""Test setting read-only mode."""
|
|
29
|
+
set_safety_mode(SafetyMode.READ_ONLY)
|
|
30
|
+
assert get_safety_mode() == SafetyMode.READ_ONLY
|
|
31
|
+
|
|
32
|
+
def test_set_disable_destructive_mode(self):
|
|
33
|
+
"""Test setting disable-destructive mode."""
|
|
34
|
+
set_safety_mode(SafetyMode.DISABLE_DESTRUCTIVE)
|
|
35
|
+
assert get_safety_mode() == SafetyMode.DISABLE_DESTRUCTIVE
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TestOperationAllowed:
|
|
39
|
+
"""Test is_operation_allowed function."""
|
|
40
|
+
|
|
41
|
+
def setup_method(self):
|
|
42
|
+
"""Reset safety mode to NORMAL before each test."""
|
|
43
|
+
set_safety_mode(SafetyMode.NORMAL)
|
|
44
|
+
|
|
45
|
+
def test_all_operations_allowed_in_normal_mode(self):
|
|
46
|
+
"""Test that all operations are allowed in NORMAL mode."""
|
|
47
|
+
for op in WRITE_OPERATIONS | DESTRUCTIVE_OPERATIONS:
|
|
48
|
+
allowed, reason = is_operation_allowed(op)
|
|
49
|
+
assert allowed is True
|
|
50
|
+
assert reason == ""
|
|
51
|
+
|
|
52
|
+
def test_read_operations_allowed_in_all_modes(self):
|
|
53
|
+
"""Test that read operations are allowed in all modes."""
|
|
54
|
+
read_ops = ["get_pods", "list_namespaces", "describe_deployment", "get_logs"]
|
|
55
|
+
|
|
56
|
+
for mode in SafetyMode:
|
|
57
|
+
set_safety_mode(mode)
|
|
58
|
+
for op in read_ops:
|
|
59
|
+
allowed, reason = is_operation_allowed(op)
|
|
60
|
+
assert allowed is True
|
|
61
|
+
|
|
62
|
+
def test_write_operations_blocked_in_read_only_mode(self):
|
|
63
|
+
"""Test that write operations are blocked in READ_ONLY mode."""
|
|
64
|
+
set_safety_mode(SafetyMode.READ_ONLY)
|
|
65
|
+
|
|
66
|
+
for op in WRITE_OPERATIONS:
|
|
67
|
+
allowed, reason = is_operation_allowed(op)
|
|
68
|
+
assert allowed is False
|
|
69
|
+
assert "read-only mode" in reason
|
|
70
|
+
|
|
71
|
+
def test_destructive_operations_blocked_in_read_only_mode(self):
|
|
72
|
+
"""Test that destructive operations are blocked in READ_ONLY mode."""
|
|
73
|
+
set_safety_mode(SafetyMode.READ_ONLY)
|
|
74
|
+
|
|
75
|
+
for op in DESTRUCTIVE_OPERATIONS:
|
|
76
|
+
allowed, reason = is_operation_allowed(op)
|
|
77
|
+
assert allowed is False
|
|
78
|
+
assert "read-only mode" in reason
|
|
79
|
+
|
|
80
|
+
def test_write_operations_allowed_in_disable_destructive_mode(self):
|
|
81
|
+
"""Test that non-destructive write operations are allowed in DISABLE_DESTRUCTIVE mode."""
|
|
82
|
+
set_safety_mode(SafetyMode.DISABLE_DESTRUCTIVE)
|
|
83
|
+
|
|
84
|
+
# Operations that are write but not destructive
|
|
85
|
+
non_destructive_writes = WRITE_OPERATIONS - DESTRUCTIVE_OPERATIONS
|
|
86
|
+
for op in non_destructive_writes:
|
|
87
|
+
allowed, reason = is_operation_allowed(op)
|
|
88
|
+
assert allowed is True
|
|
89
|
+
|
|
90
|
+
def test_destructive_operations_blocked_in_disable_destructive_mode(self):
|
|
91
|
+
"""Test that destructive operations are blocked in DISABLE_DESTRUCTIVE mode."""
|
|
92
|
+
set_safety_mode(SafetyMode.DISABLE_DESTRUCTIVE)
|
|
93
|
+
|
|
94
|
+
for op in DESTRUCTIVE_OPERATIONS:
|
|
95
|
+
allowed, reason = is_operation_allowed(op)
|
|
96
|
+
assert allowed is False
|
|
97
|
+
assert "destructive operations are disabled" in reason
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class TestCheckSafetyModeDecorator:
|
|
101
|
+
"""Test the check_safety_mode decorator."""
|
|
102
|
+
|
|
103
|
+
def setup_method(self):
|
|
104
|
+
"""Reset safety mode to NORMAL before each test."""
|
|
105
|
+
set_safety_mode(SafetyMode.NORMAL)
|
|
106
|
+
|
|
107
|
+
def test_decorator_allows_in_normal_mode(self):
|
|
108
|
+
"""Test that decorated function executes in NORMAL mode."""
|
|
109
|
+
@check_safety_mode
|
|
110
|
+
def delete_pod():
|
|
111
|
+
return {"success": True, "message": "Pod deleted"}
|
|
112
|
+
|
|
113
|
+
result = delete_pod()
|
|
114
|
+
assert result["success"] is True
|
|
115
|
+
assert result["message"] == "Pod deleted"
|
|
116
|
+
|
|
117
|
+
def test_decorator_blocks_write_in_read_only_mode(self):
|
|
118
|
+
"""Test that decorated function is blocked in READ_ONLY mode."""
|
|
119
|
+
set_safety_mode(SafetyMode.READ_ONLY)
|
|
120
|
+
|
|
121
|
+
@check_safety_mode
|
|
122
|
+
def run_pod():
|
|
123
|
+
return {"success": True, "message": "Pod created"}
|
|
124
|
+
|
|
125
|
+
result = run_pod()
|
|
126
|
+
assert result["success"] is False
|
|
127
|
+
assert "blocked" in result["error"]
|
|
128
|
+
assert result["blocked_by"] == "read_only"
|
|
129
|
+
assert result["operation"] == "run_pod"
|
|
130
|
+
|
|
131
|
+
def test_decorator_blocks_destructive_in_disable_destructive_mode(self):
|
|
132
|
+
"""Test that destructive operations are blocked."""
|
|
133
|
+
set_safety_mode(SafetyMode.DISABLE_DESTRUCTIVE)
|
|
134
|
+
|
|
135
|
+
@check_safety_mode
|
|
136
|
+
def delete_deployment():
|
|
137
|
+
return {"success": True, "message": "Deployment deleted"}
|
|
138
|
+
|
|
139
|
+
result = delete_deployment()
|
|
140
|
+
assert result["success"] is False
|
|
141
|
+
assert "blocked" in result["error"]
|
|
142
|
+
assert result["blocked_by"] == "disable_destructive"
|
|
143
|
+
|
|
144
|
+
def test_decorator_allows_non_destructive_write_in_disable_destructive_mode(self):
|
|
145
|
+
"""Test that non-destructive writes are allowed in DISABLE_DESTRUCTIVE mode."""
|
|
146
|
+
set_safety_mode(SafetyMode.DISABLE_DESTRUCTIVE)
|
|
147
|
+
|
|
148
|
+
@check_safety_mode
|
|
149
|
+
def scale_deployment():
|
|
150
|
+
return {"success": True, "message": "Deployment scaled"}
|
|
151
|
+
|
|
152
|
+
result = scale_deployment()
|
|
153
|
+
assert result["success"] is True
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class TestGetModeInfo:
|
|
157
|
+
"""Test get_mode_info function."""
|
|
158
|
+
|
|
159
|
+
def setup_method(self):
|
|
160
|
+
"""Reset safety mode to NORMAL before each test."""
|
|
161
|
+
set_safety_mode(SafetyMode.NORMAL)
|
|
162
|
+
|
|
163
|
+
def test_normal_mode_info(self):
|
|
164
|
+
"""Test mode info in NORMAL mode."""
|
|
165
|
+
info = get_mode_info()
|
|
166
|
+
assert info["mode"] == "normal"
|
|
167
|
+
assert "All operations allowed" in info["description"]
|
|
168
|
+
assert info["blocked_operations"] == []
|
|
169
|
+
|
|
170
|
+
def test_read_only_mode_info(self):
|
|
171
|
+
"""Test mode info in READ_ONLY mode."""
|
|
172
|
+
set_safety_mode(SafetyMode.READ_ONLY)
|
|
173
|
+
info = get_mode_info()
|
|
174
|
+
assert info["mode"] == "read_only"
|
|
175
|
+
assert "read" in info["description"].lower()
|
|
176
|
+
assert len(info["blocked_operations"]) > 0
|
|
177
|
+
assert "delete_pod" in info["blocked_operations"]
|
|
178
|
+
assert "run_pod" in info["blocked_operations"]
|
|
179
|
+
|
|
180
|
+
def test_disable_destructive_mode_info(self):
|
|
181
|
+
"""Test mode info in DISABLE_DESTRUCTIVE mode."""
|
|
182
|
+
set_safety_mode(SafetyMode.DISABLE_DESTRUCTIVE)
|
|
183
|
+
info = get_mode_info()
|
|
184
|
+
assert info["mode"] == "disable_destructive"
|
|
185
|
+
assert "delete" in info["description"].lower()
|
|
186
|
+
assert len(info["blocked_operations"]) > 0
|
|
187
|
+
assert "delete_pod" in info["blocked_operations"]
|
|
188
|
+
# Non-destructive writes should not be blocked
|
|
189
|
+
assert "scale_deployment" not in info["blocked_operations"]
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class TestOperationCategories:
|
|
193
|
+
"""Test that operations are categorized correctly."""
|
|
194
|
+
|
|
195
|
+
def test_all_destructive_ops_are_write_ops(self):
|
|
196
|
+
"""Test that all destructive operations are also write operations."""
|
|
197
|
+
for op in DESTRUCTIVE_OPERATIONS:
|
|
198
|
+
assert op in WRITE_OPERATIONS, f"{op} is destructive but not in WRITE_OPERATIONS"
|
|
199
|
+
|
|
200
|
+
def test_expected_write_operations_exist(self):
|
|
201
|
+
"""Test that expected write operations are defined."""
|
|
202
|
+
expected = [
|
|
203
|
+
"run_pod", "delete_pod",
|
|
204
|
+
"scale_deployment", "restart_deployment",
|
|
205
|
+
"install_helm_chart", "uninstall_helm_chart",
|
|
206
|
+
"apply_manifest", "delete_resource",
|
|
207
|
+
]
|
|
208
|
+
for op in expected:
|
|
209
|
+
assert op in WRITE_OPERATIONS, f"Expected {op} in WRITE_OPERATIONS"
|
|
210
|
+
|
|
211
|
+
def test_expected_destructive_operations_exist(self):
|
|
212
|
+
"""Test that expected destructive operations are defined."""
|
|
213
|
+
expected = [
|
|
214
|
+
"delete_pod", "delete_deployment", "delete_namespace",
|
|
215
|
+
"delete_resource", "uninstall_helm_chart",
|
|
216
|
+
]
|
|
217
|
+
for op in expected:
|
|
218
|
+
assert op in DESTRUCTIVE_OPERATIONS, f"Expected {op} in DESTRUCTIVE_OPERATIONS"
|
tests/test_tools.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Unit tests for all MCP tools in kubectl-mcp-server.
|
|
3
3
|
|
|
4
|
-
This module contains comprehensive tests for all
|
|
5
|
-
provided by the MCP server (
|
|
4
|
+
This module contains comprehensive tests for all Kubernetes tools
|
|
5
|
+
provided by the MCP server (224 total with ecosystem tools).
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
import pytest
|
|
@@ -12,7 +12,7 @@ from unittest.mock import patch, MagicMock
|
|
|
12
12
|
from datetime import datetime
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
# Complete list of all
|
|
15
|
+
# Complete list of all 224 tools that must be registered (125 core + 6 UI + 93 ecosystem)
|
|
16
16
|
EXPECTED_TOOLS = [
|
|
17
17
|
# Pods (pods.py)
|
|
18
18
|
"get_pods", "get_logs", "get_pod_events", "check_pod_health", "exec_in_pod",
|
|
@@ -65,15 +65,55 @@ EXPECTED_TOOLS = [
|
|
|
65
65
|
# UI tools (ui.py) - 6 tools for MCP-UI interactive dashboards
|
|
66
66
|
"show_pod_logs_ui", "show_pods_dashboard_ui", "show_resource_yaml_ui",
|
|
67
67
|
"show_cluster_overview_ui", "show_events_timeline_ui", "render_k8s_dashboard_screenshot",
|
|
68
|
+
# GitOps tools (gitops.py) - 7 tools for Flux and ArgoCD
|
|
69
|
+
"gitops_apps_list_tool", "gitops_app_get_tool", "gitops_app_sync_tool", "gitops_app_status_tool",
|
|
70
|
+
"gitops_sources_list_tool", "gitops_source_get_tool", "gitops_detect_engine_tool",
|
|
71
|
+
# Cert-Manager tools (certs.py) - 9 tools
|
|
72
|
+
"certs_list_tool", "certs_get_tool", "certs_issuers_list_tool", "certs_issuer_get_tool",
|
|
73
|
+
"certs_renew_tool", "certs_status_explain_tool", "certs_challenges_list_tool",
|
|
74
|
+
"certs_requests_list_tool", "certs_detect_tool",
|
|
75
|
+
# Policy tools (policy.py) - 6 tools for Kyverno and Gatekeeper
|
|
76
|
+
"policy_list_tool", "policy_get_tool", "policy_violations_list_tool", "policy_explain_denial_tool",
|
|
77
|
+
"policy_audit_tool", "policy_detect_tool",
|
|
78
|
+
# Backup tools (backup.py) - 11 tools for Velero
|
|
79
|
+
"backup_list_tool", "backup_get_tool", "backup_create_tool", "backup_delete_tool",
|
|
80
|
+
"restore_list_tool", "restore_create_tool", "restore_get_tool", "backup_locations_list_tool",
|
|
81
|
+
"backup_schedules_list_tool", "backup_schedule_create_tool", "backup_detect_tool",
|
|
82
|
+
# KEDA tools (keda.py) - 7 tools for autoscaling
|
|
83
|
+
"keda_scaledobjects_list_tool", "keda_scaledobject_get_tool", "keda_scaledjobs_list_tool",
|
|
84
|
+
"keda_triggerauths_list_tool", "keda_triggerauth_get_tool", "keda_hpa_list_tool", "keda_detect_tool",
|
|
85
|
+
# Cilium tools (cilium.py) - 8 tools for network observability
|
|
86
|
+
"cilium_policies_list_tool", "cilium_policy_get_tool", "cilium_endpoints_list_tool",
|
|
87
|
+
"cilium_identities_list_tool", "cilium_nodes_list_tool", "cilium_status_tool",
|
|
88
|
+
"hubble_flows_query_tool", "cilium_detect_tool",
|
|
89
|
+
# Rollouts tools (rollouts.py) - 11 tools for progressive delivery
|
|
90
|
+
"rollouts_list_tool", "rollout_get_tool", "rollout_status_tool", "rollout_promote_tool",
|
|
91
|
+
"rollout_abort_tool", "rollout_retry_tool", "rollout_restart_tool", "analysis_runs_list_tool",
|
|
92
|
+
"flagger_canaries_list_tool", "flagger_canary_get_tool", "rollouts_detect_tool",
|
|
93
|
+
# Cluster API tools (capi.py) - 11 tools for cluster lifecycle
|
|
94
|
+
"capi_clusters_list_tool", "capi_cluster_get_tool", "capi_machines_list_tool",
|
|
95
|
+
"capi_machine_get_tool", "capi_machinedeployments_list_tool", "capi_machinedeployment_scale_tool",
|
|
96
|
+
"capi_machinesets_list_tool", "capi_machinehealthchecks_list_tool", "capi_clusterclasses_list_tool",
|
|
97
|
+
"capi_cluster_kubeconfig_tool", "capi_detect_tool",
|
|
98
|
+
# KubeVirt tools (kubevirt.py) - 13 tools for VM management
|
|
99
|
+
"kubevirt_vms_list_tool", "kubevirt_vm_get_tool", "kubevirt_vmis_list_tool",
|
|
100
|
+
"kubevirt_vm_start_tool", "kubevirt_vm_stop_tool", "kubevirt_vm_restart_tool",
|
|
101
|
+
"kubevirt_vm_pause_tool", "kubevirt_vm_unpause_tool", "kubevirt_vm_migrate_tool",
|
|
102
|
+
"kubevirt_datasources_list_tool", "kubevirt_instancetypes_list_tool",
|
|
103
|
+
"kubevirt_datavolumes_list_tool", "kubevirt_detect_tool",
|
|
104
|
+
# Istio/Kiali tools (kiali.py) - 10 tools for service mesh
|
|
105
|
+
"istio_virtualservices_list_tool", "istio_virtualservice_get_tool", "istio_destinationrules_list_tool",
|
|
106
|
+
"istio_gateways_list_tool", "istio_peerauthentications_list_tool", "istio_authorizationpolicies_list_tool",
|
|
107
|
+
"istio_proxy_status_tool", "istio_analyze_tool", "istio_sidecar_status_tool", "istio_detect_tool",
|
|
68
108
|
]
|
|
69
109
|
|
|
70
110
|
|
|
71
111
|
class TestAllToolsRegistered:
|
|
72
|
-
"""Comprehensive tests to verify all
|
|
112
|
+
"""Comprehensive tests to verify all 224 tools are registered (125 core + 6 UI + 93 ecosystem)."""
|
|
73
113
|
|
|
74
114
|
@pytest.mark.unit
|
|
75
|
-
def
|
|
76
|
-
"""Verify all
|
|
115
|
+
def test_all_164_tools_registered(self):
|
|
116
|
+
"""Verify all 224 expected tools are registered (excluding optional browser tools)."""
|
|
77
117
|
import os
|
|
78
118
|
from kubectl_mcp_tool.mcp_server import MCPServer
|
|
79
119
|
|
|
@@ -94,8 +134,8 @@ class TestAllToolsRegistered:
|
|
|
94
134
|
tools = asyncio.run(get_tools())
|
|
95
135
|
tool_names = {t.name for t in tools}
|
|
96
136
|
|
|
97
|
-
# Verify count (
|
|
98
|
-
assert len(tools) ==
|
|
137
|
+
# Verify count (224 tools = 125 core + 6 UI + 93 ecosystem, browser tools disabled)
|
|
138
|
+
assert len(tools) == 224, f"Expected 224 tools, got {len(tools)}"
|
|
99
139
|
|
|
100
140
|
# Check for missing tools
|
|
101
141
|
missing_tools = set(EXPECTED_TOOLS) - tool_names
|
|
@@ -120,6 +160,16 @@ class TestAllToolsRegistered:
|
|
|
120
160
|
register_operations_tools,
|
|
121
161
|
register_diagnostics_tools,
|
|
122
162
|
register_cost_tools,
|
|
163
|
+
register_gitops_tools,
|
|
164
|
+
register_certs_tools,
|
|
165
|
+
register_policy_tools,
|
|
166
|
+
register_backup_tools,
|
|
167
|
+
register_keda_tools,
|
|
168
|
+
register_cilium_tools,
|
|
169
|
+
register_rollouts_tools,
|
|
170
|
+
register_capi_tools,
|
|
171
|
+
register_kubevirt_tools,
|
|
172
|
+
register_istio_tools,
|
|
123
173
|
)
|
|
124
174
|
# All imports should succeed
|
|
125
175
|
assert callable(register_helm_tools)
|
|
@@ -133,6 +183,18 @@ class TestAllToolsRegistered:
|
|
|
133
183
|
assert callable(register_operations_tools)
|
|
134
184
|
assert callable(register_diagnostics_tools)
|
|
135
185
|
assert callable(register_cost_tools)
|
|
186
|
+
# Ecosystem tools
|
|
187
|
+
assert callable(register_gitops_tools)
|
|
188
|
+
assert callable(register_certs_tools)
|
|
189
|
+
assert callable(register_policy_tools)
|
|
190
|
+
assert callable(register_backup_tools)
|
|
191
|
+
# Advanced ecosystem tools
|
|
192
|
+
assert callable(register_keda_tools)
|
|
193
|
+
assert callable(register_cilium_tools)
|
|
194
|
+
assert callable(register_rollouts_tools)
|
|
195
|
+
assert callable(register_capi_tools)
|
|
196
|
+
assert callable(register_kubevirt_tools)
|
|
197
|
+
assert callable(register_istio_tools)
|
|
136
198
|
|
|
137
199
|
@pytest.mark.unit
|
|
138
200
|
def test_all_tools_have_descriptions(self):
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
kubectl_mcp_server-1.15.0.dist-info/licenses/LICENSE,sha256=nH9Z0W0WNH2oQ4cPrBAU8ldDcHfeI6NUbkSGiazYWgQ,1070
|
|
2
|
-
kubectl_mcp_tool/__init__.py,sha256=umb22NMExrmcVr1J_Dgbg9NZEKk4kk46vx4uEQPgpko,580
|
|
3
|
-
kubectl_mcp_tool/__main__.py,sha256=CE6cTD6PA71Ap0i5_gE17Pb9FcedOJmtGRNzZ5-TFSc,1490
|
|
4
|
-
kubectl_mcp_tool/diagnostics.py,sha256=uwolSoHadRkB-J8PAsabbexfj6sTNCIIRRrABBRXoTU,11776
|
|
5
|
-
kubectl_mcp_tool/k8s_config.py,sha256=E4OqsiMhY5m3N1jgB0JUdzwgKj_kB8S4WbaVirnwvTs,15173
|
|
6
|
-
kubectl_mcp_tool/mcp_server.py,sha256=T1ZQWw9c69VDM11ECxavTc6NYWcjy4q1FpkqW23fiwc,21309
|
|
7
|
-
kubectl_mcp_tool/auth/__init__.py,sha256=ot8ivZZkDtV8Rg0y1UYruwobKCPyxX1svqh35wWxKvY,347
|
|
8
|
-
kubectl_mcp_tool/auth/config.py,sha256=wi3wuJNMyDqMeluDHL0MaJyedIFv5CFVxiUaEVaTvzk,2267
|
|
9
|
-
kubectl_mcp_tool/auth/scopes.py,sha256=KPmuGO0SrTkjzlElWFOV29ie9apTdMklOCkiA-965lI,6147
|
|
10
|
-
kubectl_mcp_tool/auth/verifier.py,sha256=ChZM-UsZJgZc3LjSfw8VfSydkKqKBZ1s8es71LlB_A0,2431
|
|
11
|
-
kubectl_mcp_tool/cli/__init__.py,sha256=NDd1-7_Ira9vx0uNVOUqhkK7S53IOTu0WUBWOKCtap8,1348
|
|
12
|
-
kubectl_mcp_tool/cli/__main__.py,sha256=OxhHqW8YsTd565acTDlZknljPAw6FN9JW7pNtgWIcFE,196
|
|
13
|
-
kubectl_mcp_tool/cli/cli.py,sha256=qy2mQ0uDrQ9qzv5LP_w9sJ2y_yt3Qzx5m2pzh1i-u4o,19694
|
|
14
|
-
kubectl_mcp_tool/cli/errors.py,sha256=nCvopWH9bt8wGRt6RTDoXo7IsKwsdwzRMvJ5OM2a1Eg,9018
|
|
15
|
-
kubectl_mcp_tool/cli/output.py,sha256=N1AUoRDiBe3lA27l96ZSdIA7pa4GqXLOP3PBdyoLHsQ,10060
|
|
16
|
-
kubectl_mcp_tool/prompts/__init__.py,sha256=BacBNfoVxow6aci8Zzcfam3m1oM7yYzM0IRT1L3uCOQ,77
|
|
17
|
-
kubectl_mcp_tool/prompts/prompts.py,sha256=ZfmTCio8NqOYYxF8VVo9f6VWGCS34J8tvmBfhNblr58,22942
|
|
18
|
-
kubectl_mcp_tool/resources/__init__.py,sha256=ERkn0ErlaGi9-dybv4wrAaT8WretvNp6K002h7Agjno,83
|
|
19
|
-
kubectl_mcp_tool/resources/resources.py,sha256=kvK4OM3Ox5cFvWDqJBTXOfBgnRYdoqdvvjsdCg0PJfY,12713
|
|
20
|
-
kubectl_mcp_tool/tools/__init__.py,sha256=tlm6TtwzHbGqQhIAQNAByLjgpDiim3eqdP89Y3JZfiA,1057
|
|
21
|
-
kubectl_mcp_tool/tools/browser.py,sha256=OvXUHzEuciRQInnwLLC16iObOOdniu09b9RT81y7sdc,25338
|
|
22
|
-
kubectl_mcp_tool/tools/cluster.py,sha256=Xyb18x7d1Eg3l0XZ2JMmCOb0c0IbtVCpk2RH2rKgKDY,20944
|
|
23
|
-
kubectl_mcp_tool/tools/core.py,sha256=67Cx1z4DqV0Qd26yXkF1eBXbUIlBB3Qj2W8rOInvb54,17801
|
|
24
|
-
kubectl_mcp_tool/tools/cost.py,sha256=fcFlIv-bsMdKESw-l-T6ECsUplDukNHaqM76JCYVHvQ,29629
|
|
25
|
-
kubectl_mcp_tool/tools/deployments.py,sha256=e138KV30DQhLCnvXntrofx1XdLH0dC0_mlODbzkluKk,18329
|
|
26
|
-
kubectl_mcp_tool/tools/diagnostics.py,sha256=LGpW-cx2ui40IIq4pZPT2O8nVzKCpOEVnnQ1OGUSVt0,7864
|
|
27
|
-
kubectl_mcp_tool/tools/helm.py,sha256=v_d1aH79VCKJmFi-kXG1LwzZRw6OFToyVC7D9tEp99A,61658
|
|
28
|
-
kubectl_mcp_tool/tools/networking.py,sha256=5I-2SHp2kK9OyGJJ9KUU0hetlYoREIfin1J6CJA6HVQ,14309
|
|
29
|
-
kubectl_mcp_tool/tools/operations.py,sha256=c7j1quXwRDoB9pMkmnLZ5Mk4QoCAuEzWVXJl_hmg2tc,24862
|
|
30
|
-
kubectl_mcp_tool/tools/pods.py,sha256=PsjqbudCUEgZdJmBBeHX3qg-mObn9mlVOCpJOU8XBd8,27271
|
|
31
|
-
kubectl_mcp_tool/tools/security.py,sha256=d7WLj-JZwr-0opzkRNWyPdMykvBjdsDCBSZHovDIPLo,13971
|
|
32
|
-
kubectl_mcp_tool/tools/storage.py,sha256=ILI3X5GYXASCETqg3A7X33B7PjwD5UsxL-iDG7yTi_8,5676
|
|
33
|
-
kubectl_mcp_tool/tools/ui.py,sha256=HHi0KM2JTvZFpQjo5V6XkJf02hxFoasec7uyNY5wuuo,39702
|
|
34
|
-
kubectl_mcp_tool/utils/__init__.py,sha256=CHBCpaXwt994DlqyRFkkRky2TK8OmmDl0Gyc28369gI,348
|
|
35
|
-
kubectl_mcp_tool/utils/helpers.py,sha256=W--wiVSKKqmjpxxdLT0J6rmhOQcp1OFk9jLrtQUVpGw,2444
|
|
36
|
-
tests/__init__.py,sha256=qZPXYXv3whkkWhi61Ngzj09GHnIFlVSZrajE0XRk55o,290
|
|
37
|
-
tests/conftest.py,sha256=6054YlpuGleV3Wg8BnVj4lnKWhGk-Eqc9JYTXxOmsXs,10782
|
|
38
|
-
tests/test_auth.py,sha256=PoESfWiN92wSGUdVwLL3Z1AP6C1zUsVmgTI7Q8ZdlxM,11074
|
|
39
|
-
tests/test_browser.py,sha256=45DLXhdz9HcEWHHcS04xe-a7o6KaVH525wXxLXq-dCA,20621
|
|
40
|
-
tests/test_cli.py,sha256=G-f9uByWooe-yUOH0ahBdoft4uz8TC0R0OzDs1Lom-4,10014
|
|
41
|
-
tests/test_prompts.py,sha256=3TcJUvSNxhTqfySW6DCrW9MwiMDumciLQRjjbucwqlA,17803
|
|
42
|
-
tests/test_resources.py,sha256=Z0Ex8WdRz-B3VZa1s0eAaDDGbhy7dRdqy1uFVOe2Qbo,12689
|
|
43
|
-
tests/test_server.py,sha256=lLvgbqutnivSgQMNrki0O48whBQt0UXjdwT047nf0nw,14415
|
|
44
|
-
tests/test_tools.py,sha256=JL_Q1KDQe7uMR66QnLn9aa-zydSyx1GkKgq4wlMOXiU,30654
|
|
45
|
-
kubectl_mcp_server-1.15.0.dist-info/METADATA,sha256=CFKlU2lYLirN-ddE8qUZLGhp7VvUe7i7N1e2zjR0pGk,35139
|
|
46
|
-
kubectl_mcp_server-1.15.0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
47
|
-
kubectl_mcp_server-1.15.0.dist-info/entry_points.txt,sha256=zeOxQGaNC4r58deEmqsLCU5hfMjF0VqFUt9P5wWsKEM,109
|
|
48
|
-
kubectl_mcp_server-1.15.0.dist-info/top_level.txt,sha256=o5IpfOGG-lqU8rVWJeK9aYC0r4f6qEX09QiBhZlYbkQ,23
|
|
49
|
-
kubectl_mcp_server-1.15.0.dist-info/RECORD,,
|
|
File without changes
|
{kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|