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
การกำหนดค่า
| พารามิเตอร์ | ตัวแปรสภาพแวดล้อม | คำอธิบาย |
|---|---|---|
| เวอร์ชัน Kubernetes | K8S_VERSIONS | รายการเวอร์ชันที่คั่นด้วยเครื่องหมายจุลภาคเพื่อโหลดล่วงหน้า (เช่น v1.33,v1.34) ค่าเริ่มต้นคือ v1.33 |
| โทเค็น GitHub | GITHUB_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_URL | URL ที่จะเปลี่ยนเส้นทางคำขอ 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 ต้นทางที่ขีดจำกัดระดับฟรี สะดวกสำหรับการใช้งานภายใน อย่าเปิดเผยต่อสาธารณะ
ระดับและการจำกัดอัตรา
| ระดับ | ขีดจำกัด |
|---|---|
free | 10 คำขอ / นาที, เบิร์สต์ 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 ที่น้อยที่สุด ไม่มีเชลล์หรือตัวจัดการแพ็คเกจ