kubernetools MCP Server

ทางการ

ช่วยให้เอเจนต์ AI เขียน Kubernetes manifests ที่ถูกต้องและทันสมัย โดยให้ข้อมูลอ้างอิง Kubernetes API อย่างเป็นทางการ เพื่อให้สามารถค้นหาชนิด ฟิลด์ และประเภทที่ซ้อนกันพร้อมสเปกปัจจุบันใน Kubernetes เวอร์ชันล่าสุดและสามเวอร์ชันก่อนหน้า

เอกสาร

kubernetools/mcp-server

อิมเมจคอนเทนเนอร์สำหรับเซิร์ฟเวอร์ MCP ของ kubernetools

รีจิสทรี: ghcr.io/kubernetools/mcp-server

เริ่มต้นอย่างรวดเร็ว

โหมดไม่ระบุตัวตน (ใช้งานภายใน)

ไม่จำเป็นต้องมีการตรวจสอบสิทธิ์ การเชื่อมต่อทั้งหมดจะถูกจำกัดอัตราตาม IP ต้นทางที่ขีดจำกัดระดับฟรี

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  ghcr.io/kubernetools/mcp-server:latest

ด้วยการตรวจสอบสิทธิ์ด้วยคีย์ API

# 1. Create a key store file
echo '[{"key":"mykey","tier":"free"}]' > keys.json

# 2. Start the server
podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.33,v1.34,v1.35,v1.36 \
  -e KEY_STORE_PATH=/keys.json \
  ghcr.io/kubernetools/mcp-server:latest

การกำหนดค่า

พารามิเตอร์ตัวแปรสภาพแวดล้อมคำอธิบาย
เวอร์ชัน KubernetesK8S_VERSIONSรายการเวอร์ชันที่คั่นด้วยเครื่องหมายจุลภาคเพื่อโหลดล่วงหน้า (เช่น v1.33,v1.34) ค่าเริ่มต้นคือ v1.33
โทเค็น GitHubGITHUB_TOKENโทเค็นการเข้าถึงส่วนบุคคล (ไม่จำเป็นต้องมีขอบเขตเพิ่มเติม) เป็นทางเลือก เพิ่มขีดจำกัดอัตรา GitHub API จาก 60 เป็น 5,000 คำขอ/ชั่วโมง — แนะนำเมื่อโหลดหลายเวอร์ชัน
ที่เก็บคีย์KEY_STORE_PATHพาธไปยังไฟล์ JSON ของคีย์ API (เมาต์เข้าไปในคอนเทนเนอร์) เมื่อละเว้น เซิร์ฟเวอร์จะทำงานในโหมดไม่ระบุตัวตน: ไม่จำเป็นต้องมีการตรวจสอบสิทธิ์ และการเชื่อมต่อทั้งหมดจะถูกจำกัดอัตราตาม IP ต้นทางที่ขีดจำกัดระดับฟรี
โฮสต์ที่อนุญาตALLOWED_HOSTSค่าเฮดเดอร์ Host ที่คั่นด้วยเครื่องหมายจุลภาคที่จะยอมรับ (เช่น mcp.example.com,mcp.example.com:443) เมื่อละเว้น การตรวจสอบโฮสต์จะถูกปิดใช้งาน — เหมาะสำหรับการพัฒนาภายในเท่านั้น ตั้งค่านี้เสมอในการใช้งานจริงเพื่อป้องกันการโจมตี DNS-rebinding
การเปลี่ยนเส้นทางเบราว์เซอร์BROWSER_REDIRECT_URLURL ที่จะเปลี่ยนเส้นทางคำขอ GET ของเบราว์เซอร์ทั่วไปไปยัง ไคลเอนต์ MCP ถูกตรวจพบโดย Accept: text/event-stream; เบราว์เซอร์จะได้รับ 307 ไปยัง URL นี้แทน เมื่อละเว้น เบราว์เซอร์ GET จะส่งคืน 400
ระดับบันทึกRUST_LOGตัวกรองระดับบันทึก (เช่น info, debug, mcp=debug)
พอร์ต--publishเซิร์ฟเวอร์รับฟังบนพอร์ต 3000

การตรวจสอบสิทธิ์

ที่เก็บคีย์ API

ที่เก็บคีย์เป็นอาร์เรย์ JSON แบบแบนที่โหลดครั้งเดียวเมื่อเริ่มต้น:

[
  { "key": "free-key-abc", "tier": "free" },
  { "key": "paid-key-xyz", "tier": "paid" }
]

ทุกคำขอต้องรวมคีย์ในเฮดเดอร์ Authorization:

Authorization: Bearer free-key-abc

คำขอที่ไม่มีคีย์ที่ถูกต้องจะได้รับ 401 Unauthorized

โหมดไม่ระบุตัวตน

เมื่อไม่ได้ตั้งค่า KEY_STORE_PATH เซิร์ฟเวอร์จะทำงานโดยไม่มีการตรวจสอบสิทธิ์ การเชื่อมต่อทั้งหมดจะได้รับการยอมรับและจำกัดอัตราตาม IP ต้นทางที่ขีดจำกัดระดับฟรี สะดวกสำหรับการใช้งานภายใน อย่าเปิดเผยต่อสาธารณะ

ระดับและการจำกัดอัตรา

ระดับขีดจำกัด
free10 คำขอ / นาที, เบิร์สต์ 10
paid~1,000 คำขอ / วินาที, เบิร์สต์ 1,000 (ไม่จำกัดในทางปฏิบัติ)

คำขอที่เกินขีดจำกัดจะได้รับ 429 Too Many Requests ขีดจำกัดถูกติดตามต่อคีย์ API ไม่ใช่ต่อ IP

การเชื่อมต่อไคลเอนต์ MCP

เซิร์ฟเวอร์ใช้ MCP Streamable HTTP transport ปลายทางคือ:

http://<host>:<port>/[?version=<k8s-version>]

พารามิเตอร์คิวรี version เลือกว่าเวอร์ชัน Kubernetes ใดที่จะใช้สำหรับเซสชัน หากละเว้น จะใช้เวอร์ชันแรกที่โหลด เวอร์ชันที่ไม่รู้จักจะส่งคืน 400 Bad Request

Claude Desktop

เพิ่มสิ่งต่อไปนี้ลงใน claude_desktop_config.json:

{
  "mcpServers": {
    "kubernetools": {
      "url": "http://localhost:3000/?version=v1.36",
      "headers": {
        "Authorization": "Bearer mykey"
      }
    }
  }
}

เครื่องมือที่พร้อมใช้งาน

list_resources

การค้นพบแบบเบา — ส่งคืนหนึ่งรายการต่อทรัพยากร เรียงตาม (group, kind, api_version) ใช้สิ่งนี้ก่อนเพื่อค้นหาชื่อชนิด

ตัวกรองเสริม: group (เช่น "apps", "core"), api_version (เช่น "v1")

get_resource

รายละเอียดทรัพยากรแบบเต็ม — ฟิลด์, spec, status และฟิลด์รายการ — เพียงพอที่จะเขียน manifest ในการเรียกครั้งเดียว จำเป็นต้องมี: kind ตัวเลือก: group, api_version (ค่าเริ่มต้นเป็นล่าสุด)

ฟิลด์ที่มี type_ref ที่ไม่ใช่ค่าว่างและ sub_fields ว่างเปล่า ควรเจาะลึกด้วย get_type

get_type

เจาะลึกเข้าไปในชนิดข้อมูลประกอบเดียวที่อ้างอิงผ่าน type_ref ในเอาต์พุต get_resource จำเป็นต้องมี: type_name (เช่น "Container", "PodFailurePolicy")

ขั้นตอนการคิวรีทั่วไป

list_resources                          → discover kind names and groups
  └─ get_resource(kind="Deployment")   → see all top-level fields + spec/status
       └─ get_type(type_name="...")    → drill into any complex type_ref

การตรวจสอบความสมบูรณ์

GET /healthz บนพอร์ต 3000

  • ส่งคืน 503 Service Unavailable (เนื้อหา: loading) ในขณะที่เอกสาร Kubernetes API กำลังโหลด
  • ส่งคืน 200 OK (เนื้อหา: ok) เมื่อเซิร์ฟเวอร์พร้อม

ปลายทางนี้ข้ามการตรวจสอบสิทธิ์และการจำกัดอัตรา

ใช้สำหรับโพรบเริ่มต้น ความพร้อม และความมีชีวิต:

startupProbe:
  httpGet:
    path: /healthz
    port: 3000
  failureThreshold: 30   # allow up to 5 min for version loading
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /healthz
    port: 3000
livenessProbe:
  httpGet:
    path: /healthz
    port: 3000
  initialDelaySeconds: 10

การตอบสนองข้อผิดพลาด

สถานะ HTTPสาเหตุ
307 Temporary Redirectเบราว์เซอร์ GET เมื่อตั้งค่า BROWSER_REDIRECT_URL
400 Bad Requestเบราว์เซอร์ GET เมื่อไม่ได้ตั้งค่า BROWSER_REDIRECT_URL หรือพารามิเตอร์ version ระบุชื่อเวอร์ชันที่ไม่ได้โหลดเมื่อเริ่มต้น
401 Unauthorizedเฮดเดอร์ Authorization: Bearer <key> หายไปหรือไม่ถูกต้อง
429 Too Many Requestsเกินขีดจำกัดอัตราสำหรับระดับของคีย์

ข้อผิดพลาดระดับ MCP (ชื่อเครื่องมือที่ไม่รู้จัก, อาร์กิวเมนต์ที่จำเป็นหายไป, ไม่พบชนิด) จะถูกส่งคืนเป็นเนื้อหาข้อผิดพลาด MCP ภายในการตอบสนอง 200 ปกติ

ตัวอย่าง

หลายเวอร์ชัน Kubernetes

podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.33,v1.34,v1.35,v1.36 \
  -e GITHUB_TOKEN=ghp_... \
  -e KEY_STORE_PATH=/keys.json \
  ghcr.io/kubernetools/mcp-server:latest

การตั้งค่าการใช้งานจริงพร้อมการตรวจสอบโฮสต์

podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.36 \
  -e KEY_STORE_PATH=/keys.json \
  -e ALLOWED_HOSTS=mcp.example.com,mcp.example.com:443 \
  -e BROWSER_REDIRECT_URL=https://example.com/docs \
  ghcr.io/kubernetools/mcp-server:latest

การบันทึกดีบัก

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  -e RUST_LOG=debug \
  ghcr.io/kubernetools/mcp-server:latest

ตรึงไปยังรุ่นเฉพาะ

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  ghcr.io/kubernetools/mcp-server:0.1.0

อิมเมจ

สร้างบน registry.access.redhat.com/hi/core-runtime:2.42-openssl — รันไทม์ glibc + OpenSSL แบบ distroless ที่น้อยที่สุด ไม่มีเชลล์หรือตัวจัดการแพ็คเกจ