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.
Files changed (45) hide show
  1. {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/METADATA +34 -13
  2. kubectl_mcp_server-1.17.0.dist-info/RECORD +75 -0
  3. kubectl_mcp_tool/__init__.py +1 -1
  4. kubectl_mcp_tool/cli/cli.py +83 -9
  5. kubectl_mcp_tool/cli/output.py +14 -0
  6. kubectl_mcp_tool/config/__init__.py +46 -0
  7. kubectl_mcp_tool/config/loader.py +386 -0
  8. kubectl_mcp_tool/config/schema.py +184 -0
  9. kubectl_mcp_tool/crd_detector.py +247 -0
  10. kubectl_mcp_tool/k8s_config.py +19 -0
  11. kubectl_mcp_tool/mcp_server.py +246 -8
  12. kubectl_mcp_tool/observability/__init__.py +59 -0
  13. kubectl_mcp_tool/observability/metrics.py +223 -0
  14. kubectl_mcp_tool/observability/stats.py +255 -0
  15. kubectl_mcp_tool/observability/tracing.py +335 -0
  16. kubectl_mcp_tool/prompts/__init__.py +43 -0
  17. kubectl_mcp_tool/prompts/builtin.py +695 -0
  18. kubectl_mcp_tool/prompts/custom.py +298 -0
  19. kubectl_mcp_tool/prompts/prompts.py +180 -4
  20. kubectl_mcp_tool/safety.py +155 -0
  21. kubectl_mcp_tool/tools/__init__.py +20 -0
  22. kubectl_mcp_tool/tools/backup.py +881 -0
  23. kubectl_mcp_tool/tools/capi.py +727 -0
  24. kubectl_mcp_tool/tools/certs.py +709 -0
  25. kubectl_mcp_tool/tools/cilium.py +582 -0
  26. kubectl_mcp_tool/tools/cluster.py +384 -0
  27. kubectl_mcp_tool/tools/gitops.py +552 -0
  28. kubectl_mcp_tool/tools/keda.py +464 -0
  29. kubectl_mcp_tool/tools/kiali.py +652 -0
  30. kubectl_mcp_tool/tools/kubevirt.py +803 -0
  31. kubectl_mcp_tool/tools/policy.py +554 -0
  32. kubectl_mcp_tool/tools/rollouts.py +790 -0
  33. tests/test_browser.py +2 -2
  34. tests/test_config.py +386 -0
  35. tests/test_ecosystem.py +331 -0
  36. tests/test_mcp_integration.py +251 -0
  37. tests/test_observability.py +521 -0
  38. tests/test_prompts.py +716 -0
  39. tests/test_safety.py +218 -0
  40. tests/test_tools.py +70 -8
  41. kubectl_mcp_server-1.15.0.dist-info/RECORD +0 -49
  42. {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/WHEEL +0 -0
  43. {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/entry_points.txt +0 -0
  44. {kubectl_mcp_server-1.15.0.dist-info → kubectl_mcp_server-1.17.0.dist-info}/licenses/LICENSE +0 -0
  45. {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 125 Kubernetes tools
5
- provided by the MCP server (131 total with UI tools).
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 131 tools that must be registered (125 core + 6 UI)
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 131 tools are registered (125 core + 6 UI)."""
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 test_all_127_tools_registered(self):
76
- """Verify all 131 expected tools are registered (excluding optional browser tools)."""
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 (131 tools = 125 core + 6 UI, browser tools disabled)
98
- assert len(tools) == 131, f"Expected 131 tools, got {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,,