mcp-server-kubernetes
Version:
MCP server for interacting with Kubernetes clusters via kubectl
97 lines (96 loc) • 3.59 kB
JavaScript
import { execSync } from "child_process";
import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
export const kubectlDescribeSchema = {
name: "kubectl_describe",
description: "Describe Kubernetes resources by resource type, name, and optionally namespace",
inputSchema: {
type: "object",
properties: {
resourceType: {
type: "string",
description: "Type of resource to describe (e.g., pods, deployments, services, etc.)"
},
name: {
type: "string",
description: "Name of the resource to describe"
},
namespace: {
type: "string",
description: "Namespace of the resource (optional - defaults to 'default' for namespaced resources)",
default: "default"
},
allNamespaces: {
type: "boolean",
description: "If true, describe resources across all namespaces",
default: false
}
},
required: ["resourceType", "name"],
},
};
export async function kubectlDescribe(k8sManager, input) {
try {
const resourceType = input.resourceType.toLowerCase();
const name = input.name;
const namespace = input.namespace || "default";
const allNamespaces = input.allNamespaces || false;
// Build the kubectl command
let command = "kubectl describe ";
// Add resource type
command += resourceType;
// Add name
command += ` ${name}`;
// Add namespace flag unless all namespaces is specified
if (allNamespaces) {
command += " --all-namespaces";
}
else if (namespace && !isNonNamespacedResource(resourceType)) {
command += ` -n ${namespace}`;
}
// Execute the command
try {
const result = execSync(command, { encoding: "utf8", env: { ...process.env, KUBECONFIG: process.env.KUBECONFIG } });
return {
content: [
{
type: "text",
text: result,
},
],
};
}
catch (error) {
if (error.status === 404 || error.message.includes("not found")) {
return {
content: [
{
type: "text",
text: JSON.stringify({
error: `Resource ${resourceType}/${name} not found`,
status: "not_found",
}, null, 2),
},
],
isError: true,
};
}
throw new McpError(ErrorCode.InternalError, `Failed to describe resource: ${error.message}`);
}
}
catch (error) {
throw new McpError(ErrorCode.InternalError, `Failed to execute kubectl describe command: ${error.message}`);
}
}
// Helper function to determine if a resource is non-namespaced
function isNonNamespacedResource(resourceType) {
const nonNamespacedResources = [
"nodes", "node", "no",
"namespaces", "namespace", "ns",
"persistentvolumes", "pv",
"storageclasses", "sc",
"clusterroles",
"clusterrolebindings",
"customresourcedefinitions", "crd", "crds"
];
return nonNamespacedResources.includes(resourceType.toLowerCase());
}