Skip to main content
Glama

MCP Remote Server for Kubernetes

by huchunlinnk
README.md10.7 kB
# MCP Remote Server for Kubernetes 🚀 **通用远程 MCP 服务器** - 基于 MCP (Model Context Protocol) 协议的 Kubernetes 管理服务器,支持通过 HTTP/SSE 协议远程访问,为各种 AI 平台和应用程序提供 Kubernetes 集群的自然语言管理能力。 ## 🌟 核心优势 - **🔌 通用兼容性**: 支持所有遵循 MCP 协议的客户端(Dify、Claude Desktop、自定义客户端等) - **🌐 远程访问**: 通过 HTTP/SSE 协议提供远程 MCP 服务,无需本地部署 - **🔒 企业级安全**: JWT 认证、RBAC 权限控制、速率限制等安全机制 - **☸️ 完整 K8s 支持**: 涵盖 Pod、Service、Deployment 等资源的完整生命周期管理 - **📊 生产就绪**: 健康检查、结构化日志、错误处理、监控告警等企业特性 ## 🚀 主要特性 ### MCP 协议支持 - **标准协议**: 完整实现 MCP 2024-11-05 协议规范 - **多传输方式**: 支持 HTTP POST 和 SSE (Server-Sent Events) - **实时通信**: 支持双向通信和事件推送 ### Kubernetes 集成 - **API 代理**: 通过代理模式提供完整的 Kubernetes API 访问 - **资源管理**: 支持 Pod、Service、Deployment、ConfigMap 等资源操作 - **日志查看**: 实时获取容器日志 - **多集群**: 支持集群内和集群外两种部署模式 ### 安全和认证 - **JWT 认证**: 基于 JSON Web Token 的安全认证 - **RBAC 权限**: 细粒度的角色权限控制 - **速率限制**: 防止 API 滥用和 DDoS 攻击 - **安全传输**: 支持 HTTPS 和安全头部配置 ### 多平台支持 - **🤖 Dify**: 完整的 Dify 平台集成支持 - **💬 Claude Desktop**: 原生 MCP 客户端支持 - **🔧 自定义客户端**: 提供多语言 SDK 和示例 - **🌐 Web 应用**: 支持浏览器直接访问 ## 📋 系统要求 - Node.js >= 18.0.0 - Kubernetes 集群访问权限 - Docker (可选,用于容器化部署) ## 🛠️ 安装和配置 ### 1. 克隆项目 ```bash git clone <repository-url> cd mcp-remote-server-kubernetes ``` ### 2. 安装依赖 ```bash npm install ``` ### 3. 配置环境变量 复制环境变量模板并根据需要修改: ```bash cp .env.example .env ``` 主要配置项: ```env # 服务器配置 PORT=3000 HOST=0.0.0.0 # Kubernetes 配置 KUBECONFIG=/path/to/your/kubeconfig K8S_IN_CLUSTER=false K8S_NAMESPACE=default # 认证配置 AUTH_ENABLED=true JWT_SECRET=your-secret-key JWT_EXPIRES_IN=24h # 日志配置 LOG_LEVEL=info LOG_CONSOLE=true ``` ### 4. 构建项目 ```bash npm run build ``` ### 5. 启动服务 ```bash # 开发模式 npm run dev # 生产模式 npm start ``` ## 🐳 Docker 部署 ### 使用 Docker Compose ```bash # 启动服务 docker-compose up -d # 查看日志 docker-compose logs -f # 停止服务 docker-compose down ``` ### 手动 Docker 部署 ```bash # 构建镜像 docker build -t mcp-kubernetes-server . # 运行容器 docker run -d \ --name mcp-kubernetes-server \ -p 3000:3000 \ -v ~/.kube/config:/app/.kube/config:ro \ -e AUTH_ENABLED=true \ -e JWT_SECRET=your-secret-key \ mcp-kubernetes-server ``` ## ☸️ Kubernetes 部署 ```bash # 应用部署配置 kubectl apply -f k8s/deployment.yaml # 检查部署状态 kubectl get pods -l app=mcp-kubernetes-server # 查看服务 kubectl get svc mcp-kubernetes-server ``` ## 🔌 多平台集成 ### 支持的客户端平台 | 平台 | 状态 | 集成方式 | 文档链接 | |------|------|----------|----------| | 🤖 **Dify** | ✅ 完全支持 | HTTP MCP | [Dify 集成指南](examples/dify-integration.md) | | 💬 **Claude Desktop** | ✅ 完全支持 | 标准 MCP | [MCP 客户端集成](docs/mcp-client-integration.md) | | 🔧 **自定义客户端** | ✅ 完全支持 | HTTP/SSE API | [API 文档](docs/mcp-client-integration.md) | | 🌐 **Web 应用** | ✅ 完全支持 | REST API | [使用示例](examples/usage-examples.md) | ### 快速集成示例 #### 1. Dify 平台集成 在 Dify 中配置 MCP 服务器: ```json { "name": "Kubernetes MCP Server", "endpoint": "http://your-server:3000/mcp", "auth": { "type": "bearer", "token": "YOUR_JWT_TOKEN" }, "capabilities": ["tools"] } ``` **自然语言使用示例**: - "显示默认命名空间中的所有 Pod" - "部署一个 nginx 应用,使用 3 个副本" - "获取 nginx Pod 的最近 100 行日志" - "删除名为 test-pod 的 Pod" #### 2. Claude Desktop 集成 创建 MCP 客户端代理脚本 `mcp-client-proxy.js`: ```javascript const axios = require('axios'); const serverUrl = process.env.MCP_SERVER_URL; const token = process.env.MCP_AUTH_TOKEN; process.stdin.on('data', async (data) => { try { const message = JSON.parse(data.toString()); const response = await axios.post(serverUrl, message, { headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` } }); console.log(JSON.stringify(response.data)); } catch (error) { console.log(JSON.stringify({ jsonrpc: '2.0', id: message?.id || null, error: { code: -32603, message: error.message } })); } }); ``` 然后在 Claude Desktop 配置中: ```json { "mcpServers": { "kubernetes": { "command": "node", "args": ["mcp-client-proxy.js"], "env": { "MCP_SERVER_URL": "http://your-server:3000/mcp", "MCP_AUTH_TOKEN": "YOUR_JWT_TOKEN" } } } } ``` #### 3. 自定义客户端集成 ```javascript class MCPKubernetesClient { constructor(serverUrl, token) { this.serverUrl = serverUrl; this.token = token; this.requestId = 1; } async callTool(name, arguments) { const message = { jsonrpc: '2.0', id: this.requestId++, method: 'tools/call', params: { name, arguments } }; const response = await fetch(this.serverUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${this.token}` }, body: JSON.stringify(message) }); return response.json(); } async getPods(namespace = 'default') { return this.callTool('kubectl_get', { resource: 'pods', namespace }); } } // 使用示例 const client = new MCPKubernetesClient( 'http://your-server:3000/mcp', 'YOUR_JWT_TOKEN' ); const pods = await client.getPods(); console.log(pods.result); ``` ## 📡 API 接口 ### 支持的 MCP 方法 | 方法 | 描述 | 参数 | |------|------|------| | `initialize` | 初始化连接 | 协议版本、客户端信息 | | `tools/list` | 获取工具列表 | 无 | | `tools/call` | 调用工具 | 工具名称、参数 | | `resources/list` | 获取资源列表 | 无 | | `prompts/list` | 获取提示列表 | 无 | ### 可用工具 | 工具名称 | 功能描述 | 必需参数 | 可选参数 | |----------|----------|----------|----------| | `kubectl_get` | 获取 K8s 资源 | `resource` | `namespace`, `name` | | `kubectl_apply` | 应用配置 | `yaml` | `namespace` | | `kubectl_delete` | 删除资源 | `resource`, `name` | `namespace` | | `kubectl_logs` | 获取日志 | `pod` | `namespace`, `container`, `lines` | ### API 端点 - **认证**: `POST /auth/login` - **MCP 协议**: `POST /mcp` - **SSE 实时**: `GET /mcp/sse` - **健康检查**: `GET /health` ## 📡 API 使用 ### 认证 首先获取访问令牌: ```bash curl -X POST http://localhost:3000/auth/login \ -H "Content-Type: application/json" \ -d '{ "username": "admin", "password": "admin123" }' ``` ### MCP 协议调用 使用获取的令牌调用 MCP 接口: ```bash curl -X POST http://localhost:3000/mcp \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }' ``` ### 支持的工具 - `kubectl_get`: 获取 Kubernetes 资源 - `kubectl_apply`: 应用资源配置 - `kubectl_delete`: 删除资源 - `kubectl_logs`: 获取 Pod 日志 #### 示例:获取 Pods ```json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "kubectl_get", "arguments": { "resource": "pods", "namespace": "default" } } } ``` #### 示例:应用部署 ```json { "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "kubectl_apply", "arguments": { "yaml": "apiVersion: v1\nkind: Pod\nmetadata:\n name: test-pod\nspec:\n containers:\n - name: nginx\n image: nginx:latest", "namespace": "default" } } } ``` ## 🔧 开发 ### 项目结构 ``` src/ ├── auth/ # 认证相关 ├── config/ # 配置管理 ├── kubernetes/ # Kubernetes API 代理 ├── middleware/ # 中间件 ├── server/ # MCP 服务器实现 ├── utils/ # 工具类 └── index.ts # 应用入口 ``` ### 开发命令 ```bash # 开发模式(热重载) npm run watch # 代码检查 npm run lint # 修复代码格式 npm run lint:fix # 运行测试 npm test # 构建项目 npm run build ``` ## 🔒 安全考虑 1. **更改默认密钥**: 生产环境中务必更改 `JWT_SECRET` 2. **RBAC 权限**: 根据需要调整 Kubernetes RBAC 权限 3. **网络安全**: 使用 HTTPS 和适当的网络策略 4. **速率限制**: 根据需要调整请求频率限制 5. **日志审计**: 启用详细的访问日志记录 ## 📊 监控和日志 ### 健康检查 ```bash curl http://localhost:3000/health ``` ### 日志配置 支持多种日志级别和输出格式: - `LOG_LEVEL`: error, warn, info, debug, verbose - `LOG_FORMAT`: combined, json, simple - `LOG_FILE`: 日志文件路径(可选) - `LOG_CONSOLE`: 控制台输出开关 ## 🤝 贡献 1. Fork 项目 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 打开 Pull Request ## 📄 许可证 本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。 ## 🆘 故障排除 ### 常见问题 1. **Kubernetes 连接失败** - 检查 `KUBECONFIG` 路径是否正确 - 验证集群访问权限 - 确认网络连接 2. **认证失败** - 检查 JWT 密钥配置 - 验证令牌是否过期 - 确认用户权限 3. **端口冲突** - 修改 `PORT` 环境变量 - 检查端口是否被占用 ### 调试模式 启用详细日志: ```bash LOG_LEVEL=debug npm run dev ``` ## 📞 支持 如有问题或建议,请: 1. 查看 [Issues](../../issues) 页面 2. 创建新的 Issue 3. 联系维护者 --- **注意**: 这是一个开发版本,请在生产环境使用前进行充分测试。

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/huchunlinnk/mcp-remote-server-kubernetes'

If you have feedback or need assistance with the MCP directory API, please join our Discord server