mcp-server-kubernetes 1.6.2 → 2.1.0
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.
- package/README.md +46 -22
- package/dist/config/container-templates.d.ts +2 -2
- package/dist/index.d.ts +314 -736
- package/dist/index.js +93 -200
- package/dist/models/resource-models.d.ts +6 -6
- package/dist/tools/kubectl-apply.d.ts +46 -0
- package/dist/tools/kubectl-apply.js +110 -0
- package/dist/tools/kubectl-context.d.ts +49 -0
- package/dist/tools/kubectl-context.js +233 -0
- package/dist/tools/kubectl-create.d.ts +150 -0
- package/dist/tools/kubectl-create.js +321 -0
- package/dist/tools/kubectl-delete.d.ts +77 -0
- package/dist/tools/kubectl-delete.js +177 -0
- package/dist/tools/kubectl-describe.d.ts +47 -0
- package/dist/tools/kubectl-describe.js +96 -0
- package/dist/tools/kubectl-generic.d.ts +71 -0
- package/dist/tools/kubectl-generic.js +121 -0
- package/dist/tools/kubectl-get.d.ts +72 -0
- package/dist/tools/kubectl-get.js +251 -0
- package/dist/tools/kubectl-list.d.ts +61 -0
- package/dist/tools/kubectl-list.js +189 -0
- package/dist/tools/{get_logs.d.ts → kubectl-logs.d.ts} +35 -19
- package/dist/tools/kubectl-logs.js +312 -0
- package/dist/tools/kubectl-patch.d.ts +57 -0
- package/dist/tools/kubectl-patch.js +128 -0
- package/dist/tools/kubectl-rollout.d.ts +67 -0
- package/dist/tools/kubectl-rollout.js +115 -0
- package/dist/tools/{scale_deployment.d.ts → kubectl-scale.d.ts} +13 -3
- package/dist/tools/kubectl-scale.js +73 -0
- package/dist/utils/kubernetes-manager.d.ts +4 -0
- package/dist/utils/kubernetes-manager.js +21 -3
- package/package.json +1 -1
- package/dist/tools/create_configmap.d.ts +0 -33
- package/dist/tools/create_configmap.js +0 -66
- package/dist/tools/create_cronjob.d.ts +0 -47
- package/dist/tools/create_cronjob.js +0 -93
- package/dist/tools/create_deployment.d.ts +0 -135
- package/dist/tools/create_deployment.js +0 -162
- package/dist/tools/create_namespace.d.ts +0 -22
- package/dist/tools/create_namespace.js +0 -48
- package/dist/tools/create_pod.d.ts +0 -130
- package/dist/tools/create_pod.js +0 -153
- package/dist/tools/create_service.d.ts +0 -74
- package/dist/tools/create_service.js +0 -102
- package/dist/tools/delete_configmap.d.ts +0 -26
- package/dist/tools/delete_configmap.js +0 -49
- package/dist/tools/delete_cronjob.d.ts +0 -26
- package/dist/tools/delete_cronjob.js +0 -48
- package/dist/tools/delete_deployment.d.ts +0 -31
- package/dist/tools/delete_deployment.js +0 -47
- package/dist/tools/delete_namespace.d.ts +0 -27
- package/dist/tools/delete_namespace.js +0 -44
- package/dist/tools/delete_pod.d.ts +0 -31
- package/dist/tools/delete_pod.js +0 -45
- package/dist/tools/delete_service.d.ts +0 -32
- package/dist/tools/delete_service.js +0 -46
- package/dist/tools/describe_cronjob.d.ts +0 -27
- package/dist/tools/describe_cronjob.js +0 -83
- package/dist/tools/describe_deployment.d.ts +0 -26
- package/dist/tools/describe_deployment.js +0 -40
- package/dist/tools/describe_node.d.ts +0 -22
- package/dist/tools/describe_node.js +0 -84
- package/dist/tools/describe_pod.d.ts +0 -33
- package/dist/tools/describe_pod.js +0 -81
- package/dist/tools/describe_service.d.ts +0 -34
- package/dist/tools/describe_service.js +0 -85
- package/dist/tools/get_configmap.d.ts +0 -27
- package/dist/tools/get_configmap.js +0 -48
- package/dist/tools/get_current_context.d.ts +0 -23
- package/dist/tools/get_current_context.js +0 -55
- package/dist/tools/get_events.d.ts +0 -28
- package/dist/tools/get_events.js +0 -66
- package/dist/tools/get_job_logs.d.ts +0 -40
- package/dist/tools/get_job_logs.js +0 -104
- package/dist/tools/get_logs.js +0 -150
- package/dist/tools/list_contexts.d.ts +0 -23
- package/dist/tools/list_contexts.js +0 -39
- package/dist/tools/list_cronjobs.d.ts +0 -23
- package/dist/tools/list_cronjobs.js +0 -35
- package/dist/tools/list_deployments.d.ts +0 -23
- package/dist/tools/list_deployments.js +0 -30
- package/dist/tools/list_jobs.d.ts +0 -29
- package/dist/tools/list_jobs.js +0 -77
- package/dist/tools/list_nodes.d.ts +0 -15
- package/dist/tools/list_nodes.js +0 -21
- package/dist/tools/list_pods.d.ts +0 -23
- package/dist/tools/list_pods.js +0 -29
- package/dist/tools/list_services.d.ts +0 -23
- package/dist/tools/list_services.js +0 -31
- package/dist/tools/scale_deployment.js +0 -50
- package/dist/tools/set_current_context.d.ts +0 -23
- package/dist/tools/set_current_context.js +0 -35
- package/dist/tools/update_configmap.d.ts +0 -33
- package/dist/tools/update_configmap.js +0 -71
- package/dist/tools/update_deployment.d.ts +0 -113
- package/dist/tools/update_deployment.js +0 -155
- package/dist/tools/update_service.d.ts +0 -72
- package/dist/tools/update_service.js +0 -125
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
-
import { ContainerTemplate, containerTemplates, CustomContainerConfig, } from "../config/container-templates.js";
|
|
3
|
-
export const updateDeploymentSchema = {
|
|
4
|
-
name: "update_deployment",
|
|
5
|
-
description: "Update an existing kubernetes deployment in cluster",
|
|
6
|
-
inputSchema: {
|
|
7
|
-
type: "object",
|
|
8
|
-
required: ["name", "namespace", "template"],
|
|
9
|
-
properties: {
|
|
10
|
-
name: { type: "string" },
|
|
11
|
-
namespace: { type: "string" },
|
|
12
|
-
template: {
|
|
13
|
-
type: "string",
|
|
14
|
-
enum: ContainerTemplate.options,
|
|
15
|
-
},
|
|
16
|
-
containerName: {
|
|
17
|
-
type: "string",
|
|
18
|
-
description: "Name of the container to update",
|
|
19
|
-
},
|
|
20
|
-
replicas: { type: "number" },
|
|
21
|
-
customConfig: {
|
|
22
|
-
type: "object",
|
|
23
|
-
properties: {
|
|
24
|
-
image: { type: "string" },
|
|
25
|
-
command: { type: "array", items: { type: "string" } },
|
|
26
|
-
args: { type: "array", items: { type: "string" } },
|
|
27
|
-
ports: {
|
|
28
|
-
type: "array",
|
|
29
|
-
items: {
|
|
30
|
-
type: "object",
|
|
31
|
-
properties: {
|
|
32
|
-
containerPort: { type: "number" },
|
|
33
|
-
name: { type: "string" },
|
|
34
|
-
protocol: { type: "string" },
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
resources: {
|
|
39
|
-
type: "object",
|
|
40
|
-
properties: {
|
|
41
|
-
limits: {
|
|
42
|
-
type: "object",
|
|
43
|
-
additionalProperties: { type: "string" },
|
|
44
|
-
},
|
|
45
|
-
requests: {
|
|
46
|
-
type: "object",
|
|
47
|
-
additionalProperties: { type: "string" },
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
env: {
|
|
52
|
-
type: "array",
|
|
53
|
-
items: {
|
|
54
|
-
type: "object",
|
|
55
|
-
properties: {
|
|
56
|
-
name: { type: "string" },
|
|
57
|
-
value: { type: "string" },
|
|
58
|
-
valueFrom: { type: "object" },
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
export async function updateDeployment(k8sManager, params) {
|
|
68
|
-
// Get existing deployment
|
|
69
|
-
const { body: existingDeployment } = await k8sManager
|
|
70
|
-
.getAppsApi()
|
|
71
|
-
.readNamespacedDeployment(params.name, params.namespace)
|
|
72
|
-
.catch((error) => {
|
|
73
|
-
console.error("Deployment read error:", {
|
|
74
|
-
status: error.response?.statusCode,
|
|
75
|
-
message: error.response?.body?.message || error.message,
|
|
76
|
-
details: error.response?.body,
|
|
77
|
-
});
|
|
78
|
-
throw error;
|
|
79
|
-
});
|
|
80
|
-
// Find target container
|
|
81
|
-
const containers = existingDeployment.spec.template.spec.containers;
|
|
82
|
-
let targetContainerIndex = params.containerName
|
|
83
|
-
? containers.findIndex(c => c.name === params.containerName)
|
|
84
|
-
: 0;
|
|
85
|
-
if (targetContainerIndex === -1) {
|
|
86
|
-
throw new McpError(ErrorCode.InvalidRequest, `Container '${params.containerName}' not found in deployment`);
|
|
87
|
-
}
|
|
88
|
-
// Prepare container config
|
|
89
|
-
const templateConfig = containerTemplates[params.template];
|
|
90
|
-
let containerConfig;
|
|
91
|
-
if (params.template === "custom") {
|
|
92
|
-
if (!params.customConfig) {
|
|
93
|
-
throw new McpError(ErrorCode.InvalidRequest, "Custom container configuration is required when using 'custom' template");
|
|
94
|
-
}
|
|
95
|
-
const validatedConfig = CustomContainerConfig.parse(params.customConfig);
|
|
96
|
-
containerConfig = {
|
|
97
|
-
...containers[targetContainerIndex],
|
|
98
|
-
...templateConfig,
|
|
99
|
-
image: validatedConfig.image,
|
|
100
|
-
command: validatedConfig.command,
|
|
101
|
-
args: validatedConfig.args,
|
|
102
|
-
ports: validatedConfig.ports,
|
|
103
|
-
resources: validatedConfig.resources,
|
|
104
|
-
env: validatedConfig.env,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
containerConfig = {
|
|
109
|
-
...containers[targetContainerIndex],
|
|
110
|
-
...templateConfig,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
// Update deployment
|
|
114
|
-
const updatedContainers = [...containers];
|
|
115
|
-
updatedContainers[targetContainerIndex] = containerConfig;
|
|
116
|
-
const updatedDeployment = {
|
|
117
|
-
...existingDeployment,
|
|
118
|
-
spec: {
|
|
119
|
-
...existingDeployment.spec,
|
|
120
|
-
replicas: params.replicas ?? existingDeployment.spec.replicas,
|
|
121
|
-
template: {
|
|
122
|
-
...existingDeployment.spec.template,
|
|
123
|
-
spec: {
|
|
124
|
-
...existingDeployment.spec.template.spec,
|
|
125
|
-
containers: updatedContainers,
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
},
|
|
129
|
-
};
|
|
130
|
-
const { body } = await k8sManager
|
|
131
|
-
.getAppsApi()
|
|
132
|
-
.replaceNamespacedDeployment(params.name, params.namespace, updatedDeployment)
|
|
133
|
-
.catch((error) => {
|
|
134
|
-
if (error instanceof McpError)
|
|
135
|
-
throw error;
|
|
136
|
-
throw new McpError(ErrorCode.InternalError, `Failed to update deployment: ${error}`);
|
|
137
|
-
});
|
|
138
|
-
return {
|
|
139
|
-
content: [
|
|
140
|
-
{
|
|
141
|
-
type: "text",
|
|
142
|
-
text: JSON.stringify({
|
|
143
|
-
message: "Deployment updated successfully",
|
|
144
|
-
deployment: {
|
|
145
|
-
name: body.metadata?.name,
|
|
146
|
-
namespace: body.metadata?.namespace,
|
|
147
|
-
replicas: body.spec?.replicas,
|
|
148
|
-
image: body.spec?.template.spec?.containers[targetContainerIndex].image,
|
|
149
|
-
containerName: body.spec?.template.spec?.containers[targetContainerIndex].name,
|
|
150
|
-
},
|
|
151
|
-
}, null, 2),
|
|
152
|
-
},
|
|
153
|
-
],
|
|
154
|
-
};
|
|
155
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { KubernetesManager } from "../types.js";
|
|
2
|
-
export declare const updateServiceSchema: {
|
|
3
|
-
name: string;
|
|
4
|
-
description: string;
|
|
5
|
-
inputSchema: {
|
|
6
|
-
type: string;
|
|
7
|
-
required: string[];
|
|
8
|
-
properties: {
|
|
9
|
-
name: {
|
|
10
|
-
type: string;
|
|
11
|
-
};
|
|
12
|
-
namespace: {
|
|
13
|
-
type: string;
|
|
14
|
-
default: string;
|
|
15
|
-
};
|
|
16
|
-
type: {
|
|
17
|
-
type: string;
|
|
18
|
-
enum: string[];
|
|
19
|
-
};
|
|
20
|
-
selector: {
|
|
21
|
-
type: string;
|
|
22
|
-
additionalProperties: {
|
|
23
|
-
type: string;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
ports: {
|
|
27
|
-
type: string;
|
|
28
|
-
items: {
|
|
29
|
-
type: string;
|
|
30
|
-
properties: {
|
|
31
|
-
port: {
|
|
32
|
-
type: string;
|
|
33
|
-
};
|
|
34
|
-
targetPort: {
|
|
35
|
-
type: string;
|
|
36
|
-
};
|
|
37
|
-
protocol: {
|
|
38
|
-
type: string;
|
|
39
|
-
enum: string[];
|
|
40
|
-
default: string;
|
|
41
|
-
};
|
|
42
|
-
name: {
|
|
43
|
-
type: string;
|
|
44
|
-
};
|
|
45
|
-
nodePort: {
|
|
46
|
-
type: string;
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
|
-
required: string[];
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
};
|
|
53
|
-
};
|
|
54
|
-
};
|
|
55
|
-
export declare function updateService(k8sManager: KubernetesManager, params: {
|
|
56
|
-
name: string;
|
|
57
|
-
namespace: string;
|
|
58
|
-
type?: "ClusterIP" | "NodePort" | "LoadBalancer";
|
|
59
|
-
selector?: Record<string, string>;
|
|
60
|
-
ports?: Array<{
|
|
61
|
-
port: number;
|
|
62
|
-
targetPort?: number;
|
|
63
|
-
protocol?: string;
|
|
64
|
-
name?: string;
|
|
65
|
-
nodePort?: number;
|
|
66
|
-
}>;
|
|
67
|
-
}): Promise<{
|
|
68
|
-
content: {
|
|
69
|
-
type: string;
|
|
70
|
-
text: string;
|
|
71
|
-
}[];
|
|
72
|
-
}>;
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
-
export const updateServiceSchema = {
|
|
3
|
-
name: "update_service",
|
|
4
|
-
description: "Update an existing kubernetes service in cluster",
|
|
5
|
-
inputSchema: {
|
|
6
|
-
type: "object",
|
|
7
|
-
required: ["name", "namespace"],
|
|
8
|
-
properties: {
|
|
9
|
-
name: { type: "string" },
|
|
10
|
-
namespace: { type: "string", default: "default" },
|
|
11
|
-
type: {
|
|
12
|
-
type: "string",
|
|
13
|
-
enum: ["ClusterIP", "NodePort", "LoadBalancer"],
|
|
14
|
-
},
|
|
15
|
-
selector: {
|
|
16
|
-
type: "object",
|
|
17
|
-
additionalProperties: { type: "string" },
|
|
18
|
-
},
|
|
19
|
-
ports: {
|
|
20
|
-
type: "array",
|
|
21
|
-
items: {
|
|
22
|
-
type: "object",
|
|
23
|
-
properties: {
|
|
24
|
-
port: { type: "number" },
|
|
25
|
-
targetPort: { type: "number" },
|
|
26
|
-
protocol: {
|
|
27
|
-
type: "string",
|
|
28
|
-
enum: ["TCP", "UDP"],
|
|
29
|
-
default: "TCP"
|
|
30
|
-
},
|
|
31
|
-
name: { type: "string" },
|
|
32
|
-
nodePort: { type: "number" }
|
|
33
|
-
},
|
|
34
|
-
required: ["port"]
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
export async function updateService(k8sManager, params) {
|
|
41
|
-
// Get existing service
|
|
42
|
-
const { body: existingService } = await k8sManager
|
|
43
|
-
.getCoreApi()
|
|
44
|
-
.readNamespacedService(params.name, params.namespace)
|
|
45
|
-
.catch((error) => {
|
|
46
|
-
console.error("Service read error:", {
|
|
47
|
-
status: error.response?.statusCode,
|
|
48
|
-
message: error.response?.body?.message || error.message,
|
|
49
|
-
details: error.response?.body,
|
|
50
|
-
});
|
|
51
|
-
if (error.response?.statusCode === 404) {
|
|
52
|
-
throw new McpError(ErrorCode.InvalidRequest, `Service '${params.name}' not found in namespace '${params.namespace}'`);
|
|
53
|
-
}
|
|
54
|
-
throw new McpError(ErrorCode.InternalError, `Failed to retrieve service: ${error.response?.body?.message || error.message}`);
|
|
55
|
-
});
|
|
56
|
-
// Process ports if provided
|
|
57
|
-
let servicePorts;
|
|
58
|
-
if (params.ports) {
|
|
59
|
-
servicePorts = params.ports.map((portConfig, index) => {
|
|
60
|
-
const existingPort = existingService.spec?.ports?.[index];
|
|
61
|
-
const name = portConfig.name || (existingPort?.name || `port-${index}`);
|
|
62
|
-
return {
|
|
63
|
-
port: portConfig.port,
|
|
64
|
-
targetPort: portConfig.targetPort !== undefined
|
|
65
|
-
? portConfig.targetPort
|
|
66
|
-
: portConfig.port,
|
|
67
|
-
protocol: portConfig.protocol || "TCP",
|
|
68
|
-
name: name,
|
|
69
|
-
...(existingService.spec?.type === "NodePort" || params.type === "NodePort" ?
|
|
70
|
-
{ nodePort: portConfig.nodePort !== undefined ? portConfig.nodePort : existingPort?.nodePort } : {})
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
const updatedService = {
|
|
75
|
-
...existingService,
|
|
76
|
-
spec: {
|
|
77
|
-
...existingService.spec,
|
|
78
|
-
type: params.type || existingService.spec.type,
|
|
79
|
-
selector: params.selector || existingService.spec.selector,
|
|
80
|
-
ports: servicePorts || existingService.spec.ports,
|
|
81
|
-
clusterIP: existingService.spec.clusterIP,
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
try {
|
|
85
|
-
const { body } = await k8sManager
|
|
86
|
-
.getCoreApi()
|
|
87
|
-
.replaceNamespacedService(params.name, params.namespace, updatedService);
|
|
88
|
-
return {
|
|
89
|
-
content: [
|
|
90
|
-
{
|
|
91
|
-
type: "text",
|
|
92
|
-
text: JSON.stringify({
|
|
93
|
-
message: "Service updated successfully",
|
|
94
|
-
service: {
|
|
95
|
-
name: body.metadata?.name,
|
|
96
|
-
namespace: body.metadata?.namespace,
|
|
97
|
-
type: body.spec?.type,
|
|
98
|
-
clusterIP: body.spec?.clusterIP,
|
|
99
|
-
ports: body.spec?.ports,
|
|
100
|
-
},
|
|
101
|
-
}, null, 2),
|
|
102
|
-
},
|
|
103
|
-
],
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
console.error("Service update error:", {
|
|
108
|
-
status: error.response?.statusCode,
|
|
109
|
-
message: error.response?.body?.message || error.message,
|
|
110
|
-
details: error.response?.body,
|
|
111
|
-
});
|
|
112
|
-
if (error instanceof McpError)
|
|
113
|
-
throw error;
|
|
114
|
-
// Handle specific Kubernetes API errors
|
|
115
|
-
if (error.response?.body?.message) {
|
|
116
|
-
if (error.response.body.message.includes("field is immutable")) {
|
|
117
|
-
throw new McpError(ErrorCode.InvalidRequest, `Update failed: Attempted to modify immutable field. ${error.response.body.message}`);
|
|
118
|
-
}
|
|
119
|
-
if (error.response.statusCode === 422) {
|
|
120
|
-
throw new McpError(ErrorCode.InvalidRequest, `Invalid service configuration: ${error.response.body.message}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
throw new McpError(ErrorCode.InternalError, `Failed to update service: ${error.response?.body?.message || error.message}`);
|
|
124
|
-
}
|
|
125
|
-
}
|