Kubernetes MCP服务器

在KiloCode工作空间中设置本地Kubernetes MCP服务器,通过AI辅助命令管理Kubernetes集群。

  • by ashishpatel26
  • HTML
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 ashishpatel26/Kubernetes-mcp-in-kilocode

使用说明

Kubernetes mcp(千码)

如何在kilocode中设置Kubernetes MCP

在KiloCode中设置Kubernetes MCP服务器

本指南提供了在KiloCode工作区中设置本地Kubernetes MCP服务器的分步说明,允许您通过AI辅助命令管理Kubernetes集群。

先决条件

  • 已安装Node.js和npm
  • 访问npm注册表(@modelcontextprotocol/sdk可能需要IT批准)
  • kubectl已配置并连接到Kubernetes集群
  • KiloCode工作区

步骤1:创建MCP服务器目录结构

mkdir -p mcp/kubernetes-server/src

第二步:创建package.json

创建 mcp/kubernetes-server/package.json 内容如下:

{
  "name": "kubernetes-server",
  "version": "0.1.0",
  "type": "module",
  "scripts": {
    "build": "tsc && chmod +x build/index.js"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^0.4.0",
    "zod": "^3.22.4"
  },
  "devDependencies": {
    "@types/node": "^20.0.0",
    "typescript": "^5.0.0"
  }
}

步骤3:创建tsconfig.json

创建 mcp/kubernetes-server/tsconfig.json 内容如下:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ES2022",
    "moduleResolution": "node",
    "outDir": "./build",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "build"]
}

步骤4:创建服务器实现

创建 mcp/kubernetes-server/src/index.ts 内容如下:

#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { execSync } from "child_process";

// Create an MCP server
const server = new McpServer({
  name: "kubernetes-server",
  version: "0.1.0"
});

// Tool for getting pods
server.tool(
  "get_pods",
  {
    namespace: z.string().optional().describe("Namespace to list pods from"),
    selector: z.string().optional().describe("Label selector"),
    output: z.string().optional().describe("Output format (json, yaml, wide, etc.)")
  },
  async ({ namespace, selector, output = "wide" }) => {
    try {
      let cmd = `kubectl get pods`;
      if (namespace) cmd += ` -n ${namespace}`;
      if (selector) cmd += ` -l ${selector}`;
      cmd += ` -o ${output}`;
      const result = execSync(cmd, { encoding: 'utf8' });
      return {
        content: [{ type: "text", text: result }]
      };
    } catch (error: any) {
      return {
        content: [{ type: "text", text: `Error: ${error.message}` }],
        isError: true
      };
    }
  }
);

// Tool for describing a pod
server.tool(
  "describe_pod",
  {
    name: z.string().describe("Pod name"),
    namespace: z.string().optional().describe("Namespace")
  },
  async ({ name, namespace }) => {
    try {
      let cmd = `kubectl describe pod ${name}`;
      if (namespace) cmd += ` -n ${namespace}`;
      const result = execSync(cmd, { encoding: 'utf8' });
      return {
        content: [{ type: "text", text: result }]
      };
    } catch (error: any) {
      return {
        content: [{ type: "text", text: `Error: ${error.message}` }],
        isError: true
      };
    }
  }
);

// Tool for getting logs
server.tool(
  "logs",
  {
    name: z.string().describe("Pod name"),
    namespace: z.string().optional().describe("Namespace"),
    container: z.string().optional().describe("Container name"),
    tail: z.number().optional().describe("Number of lines to tail")
  },
  async ({ name, namespace, container, tail }) => {
    try {
      let cmd = `kubectl logs ${name}`;
      if (namespace) cmd += ` -n ${namespace}`;
      if (container) cmd += ` -c ${container}`;
      if (tail) cmd += ` --tail=${tail}`;
      const result = execSync(cmd, { encoding: 'utf8' });
      return {
        content: [{ type: "text", text: result }]
      };
    } catch (error: any) {
      return {
        content: [{ type: "text", text: `Error: ${error.message}` }],
        isError: true
      };
    }
  }
);

// Tool for getting services
server.tool(
  "get_services",
  {
    namespace: z.string().optional().describe("Namespace"),
    output: z.string().optional().describe("Output format")
  },
  async ({ namespace, output = "wide" }) => {
    try {
      let cmd = `kubectl get services`;
      if (namespace) cmd += ` -n ${namespace}`;
      cmd += ` -o ${output}`;
      const result = execSync(cmd, { encoding: 'utf8' });
      return {
        content: [{ type: "text", text: result }]
      };
    } catch (error: any) {
      return {
        content: [{ type: "text", text: `Error: ${error.message}` }],
        isError: true
      };
    }
  }
);

// Start the server
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('Kubernetes MCP server running on stdio');

步骤5:安装依赖项

导航到服务器目录并安装依赖项:

cd mcp/kubernetes-server
npm install

注: 如果遇到403错误,请联系您的IT管理员,以允许访问npmjs.org上的@modelcontextprotocol/sdk包。

步骤6:构建服务器

编译TypeScript代码:

npm run build

步骤7:配置KiloCode MCP设置

更新 .kilocode/mcp.json 在工作区根目录中包含本地服务器:

{
  "mcpServers": {
    "kubernetes-mcp-server": {
      "command": "node",
      "args": ["mcp/kubernetes-server/build/index.js"]
    }
  }
}

步骤8:验证设置

重新启动KiloCode或重新加载窗口以加载新的MCP服务器。现在,您可以使用以下命令:

  • “获取顾问命名空间中的所有Pod”
  • “描述顾问服务舱”
  • “显示特定pod的日志”
  • “列出群集中的服务”

故障排除

  • 403 npm错误: 阻止包访问的安全策略
  • 构建失败: 确保安装了TypeScript和依赖项
  • MCP未加载: 检查.kilocode/mcp.json语法和路径

可用工具

  • get_pods:列出带有可选命名空间和标签过滤器的Pod
  • describe_pod:获取详细的pod信息
  • logs:检索容器日志
  • get_services:列出命名空间中的服务