Skip to content

Commit 4197b39

Browse files
authored
Merge pull request #21 from StacklokLabs/k8s-delete
Add resource deletion capabilities
2 parents 1c82be2 + 504ef5b commit 4197b39

File tree

4 files changed

+400
-0
lines changed

4 files changed

+400
-0
lines changed

pkg/k8s/client.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,22 @@ func (c *Client) ApplyNamespacedResource(ctx context.Context, gvr schema.GroupVe
186186
return c.dynamicClient.Resource(gvr).Namespace(namespace).Create(ctx, obj, metav1.CreateOptions{})
187187
}
188188

189+
// DeleteClusteredResource deletes a clustered resource
190+
func (c *Client) DeleteClusteredResource(ctx context.Context, gvr schema.GroupVersionResource, name string) error {
191+
c.mu.RLock()
192+
defer c.mu.RUnlock()
193+
194+
return c.dynamicClient.Resource(gvr).Delete(ctx, name, metav1.DeleteOptions{})
195+
}
196+
197+
// DeleteNamespacedResource deletes a namespaced resource
198+
func (c *Client) DeleteNamespacedResource(ctx context.Context, gvr schema.GroupVersionResource, namespace, name string) error {
199+
c.mu.RLock()
200+
defer c.mu.RUnlock()
201+
202+
return c.dynamicClient.Resource(gvr).Namespace(namespace).Delete(ctx, name, metav1.DeleteOptions{})
203+
}
204+
189205
// SetDynamicClient sets the dynamic client (for testing purposes)
190206
func (c *Client) SetDynamicClient(dynamicClient dynamic.Interface) {
191207
c.mu.Lock()

pkg/mcp/delete_resource.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package mcp
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/mark3labs/mcp-go/mcp"
8+
"k8s.io/apimachinery/pkg/runtime/schema"
9+
)
10+
11+
// HandleDeleteResource handles the delete_resource tool
12+
func (m *Implementation) HandleDeleteResource(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
13+
// Parse parameters
14+
resourceType := mcp.ParseString(request, "resource_type", "")
15+
group := mcp.ParseString(request, "group", "")
16+
version := mcp.ParseString(request, "version", "")
17+
resource := mcp.ParseString(request, "resource", "")
18+
namespace := mcp.ParseString(request, "namespace", "")
19+
name := mcp.ParseString(request, "name", "")
20+
21+
// Validate parameters
22+
if resourceType == "" {
23+
return mcp.NewToolResultError("resource_type is required"), nil
24+
}
25+
if version == "" {
26+
return mcp.NewToolResultError("version is required"), nil
27+
}
28+
if resource == "" {
29+
return mcp.NewToolResultError("resource is required"), nil
30+
}
31+
if name == "" {
32+
return mcp.NewToolResultError("name is required"), nil
33+
}
34+
if resourceType == "namespaced" && namespace == "" {
35+
return mcp.NewToolResultError("namespace is required for namespaced resources"), nil
36+
}
37+
38+
// Create GVR
39+
// Validate resource_type
40+
if resourceType != "clustered" && resourceType != "namespaced" {
41+
return mcp.NewToolResultError("Invalid resource_type: " + resourceType), nil
42+
}
43+
44+
gvr := schema.GroupVersionResource{
45+
Group: group,
46+
Version: version,
47+
Resource: resource,
48+
}
49+
50+
// Delete resource
51+
var err error
52+
switch resourceType {
53+
case "clustered":
54+
err = m.k8sClient.DeleteClusteredResource(ctx, gvr, name)
55+
case "namespaced":
56+
err = m.k8sClient.DeleteNamespacedResource(ctx, gvr, namespace, name)
57+
default:
58+
return mcp.NewToolResultError(fmt.Sprintf("Invalid resource_type: %s", resourceType)), nil
59+
}
60+
61+
if err != nil {
62+
return mcp.NewToolResultErrorFromErr("Failed to delete resource", err), nil
63+
}
64+
65+
return mcp.NewToolResultText(fmt.Sprintf("Successfully deleted %s resource %s", resourceType, name)), nil
66+
}
67+
68+
// NewDeleteResourceTool creates a new delete_resource tool
69+
func NewDeleteResourceTool() mcp.Tool {
70+
return mcp.NewTool("delete_resource",
71+
mcp.WithDescription("Delete a Kubernetes resource"),
72+
mcp.WithString("resource_type",
73+
mcp.Description("Type of resource to delete (clustered or namespaced)"),
74+
mcp.Required()),
75+
mcp.WithString("group",
76+
mcp.Description("API group (e.g., apps, networking.k8s.io)")),
77+
mcp.WithString("version",
78+
mcp.Description("API version (e.g., v1, v1beta1)"),
79+
mcp.Required()),
80+
mcp.WithString("resource",
81+
mcp.Description("Resource name (e.g., deployments, services)"),
82+
mcp.Required()),
83+
mcp.WithString("namespace",
84+
mcp.Description("Namespace (required for namespaced resources)")),
85+
mcp.WithString("name",
86+
mcp.Description("Name of the resource to delete"),
87+
mcp.Required()),
88+
)
89+
}

0 commit comments

Comments
 (0)