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.
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/PKG-INFO +48 -1
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/README.md +47 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/PKG-INFO +48 -1
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/SOURCES.txt +15 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/__init__.py +1 -1
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/cli.py +83 -9
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/output.py +14 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/config/__init__.py +46 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/config/loader.py +386 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/config/schema.py +184 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/k8s_config.py +127 -1
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/mcp_server.py +219 -8
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/observability/__init__.py +59 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/observability/metrics.py +223 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/observability/stats.py +255 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/observability/tracing.py +335 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/prompts/__init__.py +48 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/prompts/builtin.py +695 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/prompts/custom.py +298 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/prompts/prompts.py +180 -4
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/providers.py +347 -0
- kubectl_mcp_server-1.18.0/kubectl_mcp_tool/safety.py +155 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/cluster.py +384 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/setup.py +1 -1
- kubectl_mcp_server-1.18.0/tests/test_config.py +386 -0
- kubectl_mcp_server-1.18.0/tests/test_mcp_integration.py +251 -0
- kubectl_mcp_server-1.18.0/tests/test_observability.py +521 -0
- kubectl_mcp_server-1.18.0/tests/test_prompts.py +1252 -0
- kubectl_mcp_server-1.18.0/tests/test_safety.py +218 -0
- kubectl_mcp_server-1.16.0/kubectl_mcp_tool/prompts/__init__.py +0 -5
- kubectl_mcp_server-1.16.0/tests/test_prompts.py +0 -536
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/LICENSE +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/dependency_links.txt +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/entry_points.txt +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/requires.txt +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/top_level.txt +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/__main__.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/auth/__init__.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/auth/config.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/auth/scopes.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/auth/verifier.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/__init__.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/__main__.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/cli/errors.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/crd_detector.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/diagnostics.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/resources/__init__.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/resources/resources.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/__init__.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/backup.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/browser.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/capi.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/certs.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/cilium.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/core.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/cost.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/deployments.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/diagnostics.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/gitops.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/helm.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/keda.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/kiali.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/kubevirt.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/networking.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/operations.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/pods.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/policy.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/rollouts.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/security.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/storage.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/tools/ui.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/utils/__init__.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_tool/utils/helpers.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/setup.cfg +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/__init__.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/conftest.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_auth.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_browser.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_cli.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_ecosystem.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_resources.py +0 -0
- {kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/tests/test_server.py +0 -0
- {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.
|
|
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.
|
{kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kubectl-mcp-server
|
|
3
|
-
Version: 1.
|
|
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.
|
{kubectl_mcp_server-1.16.0 → kubectl_mcp_server-1.18.0}/kubectl_mcp_server.egg-info/SOURCES.txt
RENAMED
|
@@ -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.
|
|
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
|
-
|
|
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(
|
|
65
|
-
|
|
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(
|
|
70
|
-
|
|
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(
|
|
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(
|
|
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
|
+
]
|