kubectl-mcp-server 1.16.0__tar.gz → 1.18.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.
Files changed (83) hide show
  1. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/PKG-INFO +48 -1
  2. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/README.md +47 -0
  3. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/PKG-INFO +48 -1
  4. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/SOURCES.txt +15 -0
  5. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/__init__.py +1 -1
  6. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/cli.py +83 -9
  7. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/output.py +14 -0
  8. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/config/__init__.py +46 -0
  9. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/config/loader.py +386 -0
  10. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/config/schema.py +184 -0
  11. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/k8s_config.py +127 -1
  12. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/mcp_server.py +219 -8
  13. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/observability/__init__.py +59 -0
  14. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/observability/metrics.py +223 -0
  15. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/observability/stats.py +255 -0
  16. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/observability/tracing.py +335 -0
  17. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/prompts/__init__.py +48 -0
  18. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/prompts/builtin.py +695 -0
  19. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/prompts/custom.py +298 -0
  20. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/prompts/prompts.py +180 -4
  21. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/providers.py +347 -0
  22. kubectl_mcp_server-1.18.0/kubectl_mcp_tool/safety.py +155 -0
  23. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/cluster.py +384 -0
  24. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/setup.py +1 -1
  25. kubectl_mcp_server-1.18.0/tests/test_config.py +386 -0
  26. kubectl_mcp_server-1.18.0/tests/test_mcp_integration.py +251 -0
  27. kubectl_mcp_server-1.18.0/tests/test_observability.py +521 -0
  28. kubectl_mcp_server-1.18.0/tests/test_prompts.py +1252 -0
  29. kubectl_mcp_server-1.18.0/tests/test_safety.py +218 -0
  30. kubectl_mcp_server-1.16.0/kubectl_mcp_tool/prompts/__init__.py +0 -5
  31. kubectl_mcp_server-1.16.0/tests/test_prompts.py +0 -536
  32. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/LICENSE +0 -0
  33. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/dependency_links.txt +0 -0
  34. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/entry_points.txt +0 -0
  35. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/requires.txt +0 -0
  36. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/top_level.txt +0 -0
  37. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/__main__.py +0 -0
  38. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/auth/__init__.py +0 -0
  39. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/auth/config.py +0 -0
  40. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/auth/scopes.py +0 -0
  41. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/auth/verifier.py +0 -0
  42. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/__init__.py +0 -0
  43. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/__main__.py +0 -0
  44. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/errors.py +0 -0
  45. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/crd_detector.py +0 -0
  46. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/diagnostics.py +0 -0
  47. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/resources/__init__.py +0 -0
  48. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/resources/resources.py +0 -0
  49. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/__init__.py +0 -0
  50. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/backup.py +0 -0
  51. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/browser.py +0 -0
  52. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/capi.py +0 -0
  53. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/certs.py +0 -0
  54. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/cilium.py +0 -0
  55. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/core.py +0 -0
  56. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/cost.py +0 -0
  57. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/deployments.py +0 -0
  58. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/diagnostics.py +0 -0
  59. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/gitops.py +0 -0
  60. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/helm.py +0 -0
  61. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/keda.py +0 -0
  62. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/kiali.py +0 -0
  63. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/kubevirt.py +0 -0
  64. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/networking.py +0 -0
  65. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/operations.py +0 -0
  66. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/pods.py +0 -0
  67. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/policy.py +0 -0
  68. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/rollouts.py +0 -0
  69. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/security.py +0 -0
  70. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/storage.py +0 -0
  71. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/ui.py +0 -0
  72. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/utils/__init__.py +0 -0
  73. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/utils/helpers.py +0 -0
  74. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/setup.cfg +0 -0
  75. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/__init__.py +0 -0
  76. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/conftest.py +0 -0
  77. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_auth.py +0 -0
  78. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_browser.py +0 -0
  79. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_cli.py +0 -0
  80. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_ecosystem.py +0 -0
  81. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_resources.py +0 -0
  82. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_server.py +0 -0
  83. {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kubectl-mcp-server
3
- Version: 1.16.0
3
+ Version: 1.18.0
4
4
  Summary: A Model Context Protocol (MCP) server for Kubernetes with 220+ tools, 8 resources, and 8 prompts
5
5
  Home-page: https://github.com/rohitg00/kubectl-mcp-server
6
6
  Author: Rohit Ghumare
@@ -121,6 +121,7 @@ pip install kubectl-mcp-server[ui]
121
121
  - [In-Cluster Deployment](#in-cluster-deployment)
122
122
  - [Multi-Cluster Support](#multi-cluster-support)
123
123
  - [Architecture](#architecture)
124
+ - [Agent Skills](#agent-skills-24-skills-for-ai-coding-agents)
124
125
  - [Development & Testing](#development--testing)
125
126
  - [Contributing](#contributing)
126
127
  - [Support & Community](#support--community)
@@ -875,6 +876,52 @@ kubectl_mcp_tool/
875
876
  └── cli/ # CLI interface
876
877
  ```
877
878
 
879
+ ## Agent Skills (24 Skills for AI Coding Agents)
880
+
881
+ Extend your AI coding agent with Kubernetes expertise using our [Agent Skills](https://agentskills.io) library. Skills provide specialized knowledge and workflows that agents can load on demand.
882
+
883
+ ### Quick Install
884
+
885
+ ```bash
886
+ # Copy all skills to Claude
887
+ cp -r kubernetes-skills/claude/* ~/.claude/skills/
888
+
889
+ # Or install specific skills
890
+ cp -r kubernetes-skills/claude/k8s-helm ~/.claude/skills/
891
+ ```
892
+
893
+ ### Available Skills (24)
894
+
895
+ | Category | Skills |
896
+ |----------|--------|
897
+ | **Core Resources** | k8s-core, k8s-networking, k8s-storage |
898
+ | **Workloads** | k8s-deploy, k8s-operations, k8s-helm |
899
+ | **Observability** | k8s-diagnostics, k8s-troubleshoot, k8s-incident |
900
+ | **Security** | k8s-security, k8s-policy, k8s-certs |
901
+ | **GitOps** | k8s-gitops, k8s-rollouts |
902
+ | **Scaling** | k8s-autoscaling, k8s-cost, k8s-backup |
903
+ | **Multi-Cluster** | k8s-multicluster, k8s-capi, k8s-kubevirt |
904
+ | **Networking** | k8s-service-mesh, k8s-cilium |
905
+ | **Tools** | k8s-browser, k8s-cli |
906
+
907
+ ### Convert to Other Agents
908
+
909
+ Use [SkillKit](https://github.com/rohitg00/skillkit) to convert skills to your preferred AI agent format:
910
+
911
+ ```bash
912
+ npm install -g skillkit
913
+
914
+ # Convert to Cursor format
915
+ skillkit translate kubernetes-skills/claude --to cursor --output .cursor/rules/
916
+
917
+ # Convert to Codex format
918
+ skillkit translate kubernetes-skills/claude --to codex --output ./
919
+ ```
920
+
921
+ **Supported agents:** Claude, Cursor, Codex, Gemini CLI, GitHub Copilot, Goose, Windsurf, Roo, Amp, and more.
922
+
923
+ See [kubernetes-skills/README.md](kubernetes-skills/README.md) for full documentation.
924
+
878
925
  ## Multi-Cluster Support
879
926
 
880
927
  Seamlessly manage multiple Kubernetes clusters through natural language. **Every tool** supports an optional `context` parameter to target any cluster without switching contexts.
@@ -63,6 +63,7 @@ pip install kubectl-mcp-server[ui]
63
63
  - [In-Cluster Deployment](#in-cluster-deployment)
64
64
  - [Multi-Cluster Support](#multi-cluster-support)
65
65
  - [Architecture](#architecture)
66
+ - [Agent Skills](#agent-skills-24-skills-for-ai-coding-agents)
66
67
  - [Development & Testing](#development--testing)
67
68
  - [Contributing](#contributing)
68
69
  - [Support & Community](#support--community)
@@ -817,6 +818,52 @@ kubectl_mcp_tool/
817
818
  └── cli/ # CLI interface
818
819
  ```
819
820
 
821
+ ## Agent Skills (24 Skills for AI Coding Agents)
822
+
823
+ Extend your AI coding agent with Kubernetes expertise using our [Agent Skills](https://agentskills.io) library. Skills provide specialized knowledge and workflows that agents can load on demand.
824
+
825
+ ### Quick Install
826
+
827
+ ```bash
828
+ # Copy all skills to Claude
829
+ cp -r kubernetes-skills/claude/* ~/.claude/skills/
830
+
831
+ # Or install specific skills
832
+ cp -r kubernetes-skills/claude/k8s-helm ~/.claude/skills/
833
+ ```
834
+
835
+ ### Available Skills (24)
836
+
837
+ | Category | Skills |
838
+ |----------|--------|
839
+ | **Core Resources** | k8s-core, k8s-networking, k8s-storage |
840
+ | **Workloads** | k8s-deploy, k8s-operations, k8s-helm |
841
+ | **Observability** | k8s-diagnostics, k8s-troubleshoot, k8s-incident |
842
+ | **Security** | k8s-security, k8s-policy, k8s-certs |
843
+ | **GitOps** | k8s-gitops, k8s-rollouts |
844
+ | **Scaling** | k8s-autoscaling, k8s-cost, k8s-backup |
845
+ | **Multi-Cluster** | k8s-multicluster, k8s-capi, k8s-kubevirt |
846
+ | **Networking** | k8s-service-mesh, k8s-cilium |
847
+ | **Tools** | k8s-browser, k8s-cli |
848
+
849
+ ### Convert to Other Agents
850
+
851
+ Use [SkillKit](https://github.com/rohitg00/skillkit) to convert skills to your preferred AI agent format:
852
+
853
+ ```bash
854
+ npm install -g skillkit
855
+
856
+ # Convert to Cursor format
857
+ skillkit translate kubernetes-skills/claude --to cursor --output .cursor/rules/
858
+
859
+ # Convert to Codex format
860
+ skillkit translate kubernetes-skills/claude --to codex --output ./
861
+ ```
862
+
863
+ **Supported agents:** Claude, Cursor, Codex, Gemini CLI, GitHub Copilot, Goose, Windsurf, Roo, Amp, and more.
864
+
865
+ See [kubernetes-skills/README.md](kubernetes-skills/README.md) for full documentation.
866
+
820
867
  ## Multi-Cluster Support
821
868
 
822
869
  Seamlessly manage multiple Kubernetes clusters through natural language. **Every tool** supports an optional `context` parameter to target any cluster without switching contexts.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kubectl-mcp-server
3
- Version: 1.16.0
3
+ Version: 1.18.0
4
4
  Summary: A Model Context Protocol (MCP) server for Kubernetes with 220+ tools, 8 resources, and 8 prompts
5
5
  Home-page: https://github.com/rohitg00/kubectl-mcp-server
6
6
  Author: Rohit Ghumare
@@ -121,6 +121,7 @@ pip install kubectl-mcp-server[ui]
121
121
  - [In-Cluster Deployment](#in-cluster-deployment)
122
122
  - [Multi-Cluster Support](#multi-cluster-support)
123
123
  - [Architecture](#architecture)
124
+ - [Agent Skills](#agent-skills-24-skills-for-ai-coding-agents)
124
125
  - [Development & Testing](#development--testing)
125
126
  - [Contributing](#contributing)
126
127
  - [Support & Community](#support--community)
@@ -875,6 +876,52 @@ kubectl_mcp_tool/
875
876
  └── cli/ # CLI interface
876
877
  ```
877
878
 
879
+ ## Agent Skills (24 Skills for AI Coding Agents)
880
+
881
+ Extend your AI coding agent with Kubernetes expertise using our [Agent Skills](https://agentskills.io) library. Skills provide specialized knowledge and workflows that agents can load on demand.
882
+
883
+ ### Quick Install
884
+
885
+ ```bash
886
+ # Copy all skills to Claude
887
+ cp -r kubernetes-skills/claude/* ~/.claude/skills/
888
+
889
+ # Or install specific skills
890
+ cp -r kubernetes-skills/claude/k8s-helm ~/.claude/skills/
891
+ ```
892
+
893
+ ### Available Skills (24)
894
+
895
+ | Category | Skills |
896
+ |----------|--------|
897
+ | **Core Resources** | k8s-core, k8s-networking, k8s-storage |
898
+ | **Workloads** | k8s-deploy, k8s-operations, k8s-helm |
899
+ | **Observability** | k8s-diagnostics, k8s-troubleshoot, k8s-incident |
900
+ | **Security** | k8s-security, k8s-policy, k8s-certs |
901
+ | **GitOps** | k8s-gitops, k8s-rollouts |
902
+ | **Scaling** | k8s-autoscaling, k8s-cost, k8s-backup |
903
+ | **Multi-Cluster** | k8s-multicluster, k8s-capi, k8s-kubevirt |
904
+ | **Networking** | k8s-service-mesh, k8s-cilium |
905
+ | **Tools** | k8s-browser, k8s-cli |
906
+
907
+ ### Convert to Other Agents
908
+
909
+ Use [SkillKit](https://github.com/rohitg00/skillkit) to convert skills to your preferred AI agent format:
910
+
911
+ ```bash
912
+ npm install -g skillkit
913
+
914
+ # Convert to Cursor format
915
+ skillkit translate kubernetes-skills/claude --to cursor --output .cursor/rules/
916
+
917
+ # Convert to Codex format
918
+ skillkit translate kubernetes-skills/claude --to codex --output ./
919
+ ```
920
+
921
+ **Supported agents:** Claude, Cursor, Codex, Gemini CLI, GitHub Copilot, Goose, Windsurf, Roo, Amp, and more.
922
+
923
+ See [kubernetes-skills/README.md](kubernetes-skills/README.md) for full documentation.
924
+
878
925
  ## Multi-Cluster Support
879
926
 
880
927
  Seamlessly manage multiple Kubernetes clusters through natural language. **Every tool** supports an optional `context` parameter to target any cluster without switching contexts.
@@ -13,6 +13,8 @@ kubectl_mcp_tool/crd_detector.py
13
13
  kubectl_mcp_tool/diagnostics.py
14
14
  kubectl_mcp_tool/k8s_config.py
15
15
  kubectl_mcp_tool/mcp_server.py
16
+ kubectl_mcp_tool/providers.py
17
+ kubectl_mcp_tool/safety.py
16
18
  kubectl_mcp_tool/auth/__init__.py
17
19
  kubectl_mcp_tool/auth/config.py
18
20
  kubectl_mcp_tool/auth/scopes.py
@@ -22,7 +24,16 @@ kubectl_mcp_tool/cli/__main__.py
22
24
  kubectl_mcp_tool/cli/cli.py
23
25
  kubectl_mcp_tool/cli/errors.py
24
26
  kubectl_mcp_tool/cli/output.py
27
+ kubectl_mcp_tool/config/__init__.py
28
+ kubectl_mcp_tool/config/loader.py
29
+ kubectl_mcp_tool/config/schema.py
30
+ kubectl_mcp_tool/observability/__init__.py
31
+ kubectl_mcp_tool/observability/metrics.py
32
+ kubectl_mcp_tool/observability/stats.py
33
+ kubectl_mcp_tool/observability/tracing.py
25
34
  kubectl_mcp_tool/prompts/__init__.py
35
+ kubectl_mcp_tool/prompts/builtin.py
36
+ kubectl_mcp_tool/prompts/custom.py
26
37
  kubectl_mcp_tool/prompts/prompts.py
27
38
  kubectl_mcp_tool/resources/__init__.py
28
39
  kubectl_mcp_tool/resources/resources.py
@@ -57,8 +68,12 @@ tests/conftest.py
57
68
  tests/test_auth.py
58
69
  tests/test_browser.py
59
70
  tests/test_cli.py
71
+ tests/test_config.py
60
72
  tests/test_ecosystem.py
73
+ tests/test_mcp_integration.py
74
+ tests/test_observability.py
61
75
  tests/test_prompts.py
62
76
  tests/test_resources.py
77
+ tests/test_safety.py
63
78
  tests/test_server.py
64
79
  tests/test_tools.py
@@ -7,7 +7,7 @@ with Kubernetes clusters through natural language commands.
7
7
  For more information, see: https://github.com/rohitg00/kubectl-mcp-server
8
8
  """
9
9
 
10
- __version__ = "1.16.0"
10
+ __version__ = "1.18.0"
11
11
 
12
12
  from .mcp_server import MCPServer
13
13
  from .diagnostics import run_diagnostics, check_kubectl_installation, check_cluster_connection
@@ -37,6 +37,7 @@ from .output import (
37
37
  format_error,
38
38
  format_success,
39
39
  )
40
+ from ..safety import SafetyMode, set_safety_mode, get_mode_info
40
41
 
41
42
  # Logging setup
42
43
  log_file = os.environ.get("MCP_LOG_FILE")
@@ -56,18 +57,49 @@ logging.basicConfig(
56
57
  logger = logging.getLogger("kubectl-mcp-cli")
57
58
 
58
59
 
59
- async def serve_stdio():
60
- server = MCPServer("kubernetes")
60
+ async def serve_stdio(
61
+ read_only: bool = False,
62
+ disable_destructive: bool = False,
63
+ config_file: Optional[str] = None,
64
+ ):
65
+ server = MCPServer(
66
+ "kubernetes",
67
+ read_only=read_only,
68
+ disable_destructive=disable_destructive,
69
+ config_file=config_file,
70
+ )
61
71
  await server.serve_stdio()
62
72
 
63
73
 
64
- async def serve_sse(host: str, port: int):
65
- server = MCPServer("kubernetes")
74
+ async def serve_sse(
75
+ host: str,
76
+ port: int,
77
+ read_only: bool = False,
78
+ disable_destructive: bool = False,
79
+ config_file: Optional[str] = None,
80
+ ):
81
+ server = MCPServer(
82
+ "kubernetes",
83
+ read_only=read_only,
84
+ disable_destructive=disable_destructive,
85
+ config_file=config_file,
86
+ )
66
87
  await server.serve_sse(host=host, port=port)
67
88
 
68
89
 
69
- async def serve_http(host: str, port: int):
70
- server = MCPServer("kubernetes")
90
+ async def serve_http(
91
+ host: str,
92
+ port: int,
93
+ read_only: bool = False,
94
+ disable_destructive: bool = False,
95
+ config_file: Optional[str] = None,
96
+ ):
97
+ server = MCPServer(
98
+ "kubernetes",
99
+ read_only=read_only,
100
+ disable_destructive=disable_destructive,
101
+ config_file=config_file,
102
+ )
71
103
  await server.serve_http(host=host, port=port)
72
104
 
73
105
 
@@ -282,12 +314,16 @@ def cmd_info(args):
282
314
  except Exception:
283
315
  pass
284
316
 
317
+ # Get safety mode info
318
+ mode_info = get_mode_info()
319
+
285
320
  print(format_server_info(
286
321
  version=__version__,
287
322
  tool_count=len(tools),
288
323
  resource_count=len(resources),
289
324
  prompt_count=len(prompts),
290
325
  context=context,
326
+ safety_mode=mode_info,
291
327
  as_json=getattr(args, 'json', False)
292
328
  ))
293
329
  return ErrorCode.SUCCESS
@@ -407,6 +443,16 @@ def cmd_doctor(args):
407
443
  except ImportError:
408
444
  checks.append({"name": "fastmcp", "status": "error", "details": "fastmcp not installed"})
409
445
 
446
+ # Check safety mode
447
+ mode_info = get_mode_info()
448
+ mode = mode_info.get("mode", "normal")
449
+ if mode == "normal":
450
+ checks.append({"name": "safety_mode", "status": "ok", "version": mode, "details": "All operations allowed"})
451
+ elif mode == "read_only":
452
+ checks.append({"name": "safety_mode", "status": "warning", "version": mode, "details": "Write operations blocked"})
453
+ else:
454
+ checks.append({"name": "safety_mode", "status": "warning", "version": mode, "details": "Destructive operations blocked"})
455
+
410
456
  print(format_doctor_results(checks, as_json=getattr(args, 'json', False)))
411
457
 
412
458
  # Return error code if any critical checks failed
@@ -453,6 +499,9 @@ Environment Variables:
453
499
  )
454
500
  serve_parser.add_argument("--host", type=str, default="0.0.0.0", help="Host for SSE/HTTP (default: 0.0.0.0)")
455
501
  serve_parser.add_argument("--port", type=int, default=8000, help="Port for SSE/HTTP (default: 8000)")
502
+ serve_parser.add_argument("--config", type=str, default=None, help="Path to TOML configuration file")
503
+ serve_parser.add_argument("--read-only", action="store_true", help="Enable read-only mode (block all write operations)")
504
+ serve_parser.add_argument("--disable-destructive", action="store_true", help="Disable destructive operations (allow create/update, block delete)")
456
505
 
457
506
  # version command (existing)
458
507
  subparsers.add_parser("version", help="Show version")
@@ -507,12 +556,37 @@ Environment Variables:
507
556
 
508
557
  try:
509
558
  if args.command == "serve":
559
+ # Log safety mode (actual mode is applied in MCPServer)
560
+ if args.read_only:
561
+ logger.info("Starting server in READ-ONLY mode")
562
+ elif args.disable_destructive:
563
+ logger.info("Starting server with destructive operations disabled")
564
+
565
+ if args.config:
566
+ logger.info(f"Loading configuration from: {args.config}")
567
+
510
568
  if args.transport == "stdio":
511
- asyncio.run(serve_stdio())
569
+ asyncio.run(serve_stdio(
570
+ read_only=args.read_only,
571
+ disable_destructive=args.disable_destructive,
572
+ config_file=args.config,
573
+ ))
512
574
  elif args.transport == "sse":
513
- asyncio.run(serve_sse(args.host, args.port))
575
+ asyncio.run(serve_sse(
576
+ host=args.host,
577
+ port=args.port,
578
+ read_only=args.read_only,
579
+ disable_destructive=args.disable_destructive,
580
+ config_file=args.config,
581
+ ))
514
582
  elif args.transport in ("http", "streamable-http"):
515
- asyncio.run(serve_http(args.host, args.port))
583
+ asyncio.run(serve_http(
584
+ host=args.host,
585
+ port=args.port,
586
+ read_only=args.read_only,
587
+ disable_destructive=args.disable_destructive,
588
+ config_file=args.config,
589
+ ))
516
590
 
517
591
  elif args.command == "version":
518
592
  from .. import __version__
@@ -266,6 +266,7 @@ def format_server_info(
266
266
  resource_count: int,
267
267
  prompt_count: int,
268
268
  context: Optional[str] = None,
269
+ safety_mode: Optional[Dict[str, Any]] = None,
269
270
  as_json: bool = False
270
271
  ) -> str:
271
272
  info = {
@@ -276,6 +277,9 @@ def format_server_info(
276
277
  "k8s_context": context,
277
278
  }
278
279
 
280
+ if safety_mode:
281
+ info["safety_mode"] = safety_mode
282
+
279
283
  if as_json:
280
284
  return json.dumps(info, indent=2)
281
285
 
@@ -291,6 +295,16 @@ def format_server_info(
291
295
  if context:
292
296
  lines.append(f" {cyan('K8s Context:')} {context}")
293
297
 
298
+ if safety_mode:
299
+ mode = safety_mode.get("mode", "normal")
300
+ if mode == "normal":
301
+ mode_str = green(mode)
302
+ elif mode == "read_only":
303
+ mode_str = yellow(mode) + " (write operations blocked)"
304
+ else:
305
+ mode_str = yellow(mode) + " (destructive operations blocked)"
306
+ lines.append(f" {cyan('Safety Mode:')} {mode_str}")
307
+
294
308
  return "\n".join(lines)
295
309
 
296
310
 
@@ -0,0 +1,46 @@
1
+ """Configuration management for kubectl-mcp-server.
2
+
3
+ This module provides TOML-based configuration with:
4
+ - Main config file support
5
+ - Drop-in directory for modular configuration
6
+ - SIGHUP reload for runtime updates
7
+ - Environment variable overrides
8
+ """
9
+
10
+ from .loader import (
11
+ Config,
12
+ load_config,
13
+ get_config,
14
+ reload_config,
15
+ get_config_paths,
16
+ setup_sighup_handler,
17
+ register_reload_callback,
18
+ unregister_reload_callback,
19
+ )
20
+ from .schema import (
21
+ ServerConfig,
22
+ SafetyConfig,
23
+ BrowserConfig,
24
+ MetricsConfig,
25
+ LoggingConfig,
26
+ validate_config,
27
+ )
28
+
29
+ __all__ = [
30
+ # Config loading
31
+ "Config",
32
+ "load_config",
33
+ "get_config",
34
+ "reload_config",
35
+ "get_config_paths",
36
+ "setup_sighup_handler",
37
+ "register_reload_callback",
38
+ "unregister_reload_callback",
39
+ # Config schemas
40
+ "ServerConfig",
41
+ "SafetyConfig",
42
+ "BrowserConfig",
43
+ "MetricsConfig",
44
+ "LoggingConfig",
45
+ "validate_config",
46
+ ]