---
title: เชื่อมต่อ AI client (MCP)
description: เชื่อมต่อ Claude Code, Codex CLI, Gemini CLI, Cursor, Claude Desktop, claude.ai, ChatGPT หรือ OpenAI SDK เข้ากับแอดมิน MCP เอ็นด์พอยต์ของพาเนลคุณ พร้อมรายการเครื่องมือแบบเต็ม
url: https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/
applies_to: NexCMP 1.6.1
updated: 2026-11-02
---

# เชื่อมต่อ AI client (MCP) {#connect-an-ai-client-mcp}

> **ตำแหน่งในแอดมิน:** System › Settings › API & AI agents (`/agent/keys`), แท็บ **Connect an AI** แสดง URL เอ็นด์พอยต์และสนิปเพ็ตพร้อมคัดลอกสำหรับแต่ละไคลเอนต์ ซึ่งใส่คีย์ที่คุณเพิ่งสร้างไว้

## What it does {#what-it-does}

**Model Context Protocol (MCP)** ช่วยให้ AI client สามารถเรียกใช้เครื่องมือต่างๆ ได้ พาเนลของคุณทำหน้าที่เป็นแอดมิน MCP เซิร์ฟเวอร์ที่ `https://cloud.example.com/mcp/admin` เชื่อมต่อเครื่องมือ AI ของคุณเองแล้วถามด้วยภาษาธรรมชาติ: "what is left to set up?", "add my Proxmox cluster", "create plans with a 40% margin" ไคลเอนต์จะเรียกใช้เครื่องมือแอดมินด้านล่าง พาเนลจะตรวจสอบสิทธิ์ขอบเขต สอบถามคุณก่อนดำเนินการที่มีความเสี่ยง และบันทึกทุกการเรียกใช้

::: info MCP เอ็นด์พอยต์สองชุด
`/mcp` คือเอ็นด์พอยต์ฝั่ง **ลูกค้า** (คีย์ API ลูกค้า, `vk_`; ดู [MCP server](https://nexcmp.com/th/docs/developers/mcp/)) ส่วน `/mcp/admin` คือเอ็นด์พอยต์ฝั่ง **แอดมิน** ที่อธิบายไว้ที่นี่ (คีย์แอดมิน `ak_` หรือ OAuth) ทั้งสองส่วนนี้จะไม่ปะปนกัน: เครื่องมือแอดมินจะไม่แสดงบน `/mcp` และ `/mcp/admin` จะยอมรับเฉพาะคีย์แอดมินเท่านั้น
:::

## ข้อกำหนด {#requirements}

| Item | Requirement |
|---|---|
| Endpoint | `https://cloud.example.com/mcp/admin` บนโดเมนของพาเนลคุณเอง คัดลอก URL แบบเต็มจากแท็บ **Connect an AI** หน้าเดียวกันนี้จะแสดง URL ท้องถิ่น (`http://127.0.0.1:<port>/mcp/admin`) สำหรับเครื่องมือที่รันบนเซิร์ฟเวอร์เอง |
| ข้อมูลประจำตัว | [admin API key](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/) (`ak_...`) ที่มีสิทธิ์ขอบเขตที่คุณต้องการ **หรือ** เข้าสู่ระบบผ่าน OAuth สำหรับเว็บคอนเนกเตอร์ ([OAuth connectors](https://nexcmp.com/th/docs/configure-with-ai/oauth-connectors/)) |
| ไคลเอนต์ | MCP client ใดๆ ที่รองรับการรับส่งข้อมูลแบบ **Streamable HTTP** และเฮดเดอร์ `Authorization` แบบกำหนดเอง รองรับโปรโตคอลเวอร์ชัน 2025-11-25, 2025-06-18 และ 2025-03-26 |
| Network | หากคุณใช้รีเวอร์สพร็อกซี่ของคุณเองหน้าพาเนล รีเวอร์สพร็อกซี่นั้นจะต้องส่งต่อ `/mcp/admin` เว็บคอนเนกเตอร์ (claude.ai, ChatGPT) จะเชื่อมต่อมาจากเซิร์ฟเวอร์ของผู้ให้บริการ ดังนั้น URL จึงต้องเข้าถึงได้จากอินเทอร์เน็ต |

## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure}

ไม่ต้องติดตั้งสิ่งใดบนเซิร์ฟเวอร์ หากคุณจำกัดคีย์ด้วย IP โปรดตรวจสอบว่าไอพีที่ไคลเอนต์ของคุณเชื่อมต่อมานั้นอยู่ในช่วงดังกล่าว ทดสอบการเข้าถึงก่อน:

```bash
curl -i -X POST https://cloud.example.com/mcp/admin
```

การตอบกลับด้วย `401` พร้อมเฮดเดอร์ `WWW-Authenticate: Bearer ... resource_metadata=...` หมายความว่าเอ็นด์พอยต์ทำงานอยู่และต้องการข้อมูลรับรอง

## เชื่อมต่อใน NexCMP {#connect-in-nexcmp}

1. สร้างคีย์: **System › Settings › API & AI agents › API keys › New key** สำหรับการใช้งานครั้งแรก ให้ใช้ `admin:read` เท่านั้น แล้วค่อยเพิ่มสิทธิ์การเขียนเมื่อจำเป็น ดูเพิ่มเติมที่ [Admin API keys](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/)
2. เปิดแท็บ **Connect an AI** ในขณะที่หน้าต่าง "key created" ยังใช้งานอยู่ สนิปเพ็ตทั้งหมดด้านล่างจะมีคีย์จริงของคุณอยู่แล้ว มิฉะนั้นจะแสดงตัวยึดตำแหน่ง `ak_YOUR_KEY` แทน
3. คัดลอกสนิปเพ็ตสำหรับไคลเอนต์ของคุณ แล้วรันหรือวางตามขั้นตอนถัดไป

![แท็บ Connect an AI พร้อม URL ของ MCP และการ์ดที่มีปุ่มคัดลอกสำหรับแต่ละไคลเอนต์](https://nexcmp.com/th/docs/images/configure-with-ai/mcp-admin-01-connect.webp)

### Claude Code {#claude-code}

```bash
claude mcp add --transport http nexcmp https://cloud.example.com/mcp/admin \
  --header "Authorization: Bearer ak_XXXX"
```

จากนั้นเริ่ม `claude` และถามว่า "list the tools from nexcmp" หรือ "what is left to set up?"

ตรวจสอบเมื่อ 30/10/2026 ด้วย Claude Code 2.1: `claude mcp add --transport http …` เขียนเซิร์ฟเวอร์ (เพิ่ม `-s project` เพื่อเก็บบันทึกไว้ใน `.mcp.json` ของโปรเจกต์ — Claude Code จะขอให้คุณอนุมัติเซิร์ฟเวอร์โปรเจกต์ในครั้งแรก) สำหรับสคริปต์ `claude -p "…" --mcp-config .mcp.json --strict-mcp-config --allowedTools "mcp__nexcmp__*"` สามารถรันได้โดยไม่ต้องมีข้อความขออนุมัติและอนุญาตให้ Claude ใช้เฉพาะเครื่องมือของพาเนลเท่านั้น

### Claude Desktop {#claude-desktop}

ต้องใช้ Node.js 18 ขึ้นไป เพิ่มข้อมูลนี้ลงใน `claude_desktop_config.json` (ใช้บริดจ์ `mcp-remote`) แล้วรีสตาร์ท Claude Desktop:

```json
{
  "mcpServers": {
    "nexcmp": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://cloud.example.com/mcp/admin", "--header", "Authorization:Bearer ak_XXXX"]
    }
  }
}
```

หากระบบของคุณจัดการช่องว่างในอาร์กิวเมนต์ของเฮดเดอร์ไม่ถูกต้อง ให้ใส่ค่าทั้งหมดลงในตัวแปรสภาพแวดล้อมแทน เช่นเดียวกับเอ็นด์พอยต์ลูกค้า: `"args": [..., "--header", "Authorization:${NEXCMP_AUTH_HEADER}"]` พร้อม `"env": { "NEXCMP_AUTH_HEADER": "Bearer ak_XXXX" }`

### claude.ai (custom connector) {#claude-ai-custom-connector}

ไม่ต้องใช้คีย์: เข้าสู่ระบบด้วย OAuth ใน claude.ai ให้เปิดการตั้งค่าคอนเนกเตอร์ เพิ่ม custom connector วาง `https://cloud.example.com/mcp/admin` จากนั้นเข้าสู่ระบบด้วยบัญชีแอดมิน NexCMP ของคุณและเลือกสิทธิ์บนหน้าจอขอความยินยอม รายละเอียด: [OAuth connectors](https://nexcmp.com/th/docs/configure-with-ai/oauth-connectors/)

### ChatGPT (developer mode) {#chatgpt-developer-mode}

ไม่ต้องใช้คีย์ ใน ChatGPT ให้เปิดโหมดนักพัฒนาซอฟต์แวร์ เพิ่ม MCP คอนเนกเตอร์ด้วย URL `https://cloud.example.com/mcp/admin` เลือก OAuth และเข้าสู่ระบบด้วยบัญชีแอดมิน NexCMP ของคุณ รายละเอียด: [OAuth connectors](https://nexcmp.com/th/docs/configure-with-ai/oauth-connectors/)

### Codex CLI {#codex-cli}

เพิ่มลงใน `~/.codex/config.toml`:

```toml
[mcp_servers.nexcmp]
url = "https://cloud.example.com/mcp/admin"
bearer_token_env_var = "NEXCMP_KEY"
```

จากนั้นส่งออกคีย์ในเชลล์ที่เริ่ม Codex:

```bash
export NEXCMP_KEY=ak_XXXX
codex
codex mcp list   # shows nexcmp with "Bearer token" auth
```

::: tip โหมดไม่โต้ตอบ `codex exec`
ใน `codex exec` (สคริปต์, CI) Codex จะไม่ถามก่อนเรียกใช้เครื่องมือ และจะข้ามเครื่องมือที่เปลี่ยนแปลงข้อมูล เพิ่ม `default_tools_approval_mode = "approve"` ใต้ `[mcp_servers.nexcmp]` เพื่ออนุญาตให้เรียกใช้เครื่องมือเหล่านั้น แผงควบคุมยังคงแสดงตัวอย่างและขอการยืนยันสำหรับการดำเนินการด้านเงิน ความปลอดภัย และการลบ ตรวจสอบแล้วด้วย Codex CLI 0.166 เมื่อ 30/10/2026
:::

### Gemini CLI {#gemini-cli}

เพิ่มลงใน `~/.gemini/settings.json`:

```json
{
  "mcpServers": {
    "nexcmp": {
      "httpUrl": "https://cloud.example.com/mcp/admin",
      "headers": { "Authorization": "Bearer ak_XXXX" }
    }
  }
}
```

Gemini CLI จะปิดการใช้งานเซิร์ฟเวอร์ MCP ในโฟลเดอร์ที่ไม่เชื่อถือ เริ่มต้นในโฟลเดอร์ที่คุณเชื่อถือ (หรือเชื่อถือโฟลเดอร์เมื่อมี prompt ถาม) จากนั้นตรวจสอบด้วย `gemini mcp list` — ระบบจะแสดง `nexcmp … Connected` คุณสามารถเก็บคีย์ไว้นอกไฟล์ได้โดยใช้ `"Authorization": "Bearer $NEXCMP_KEY"` ตรวจสอบแล้วด้วย Gemini CLI 0.66 เมื่อ 30/10/2026

### Cursor {#cursor}

เพิ่มลงใน `~/.cursor/mcp.json` (หรือ `.cursor/mcp.json` ในโปรเจกต์):

```json
{
  "mcpServers": {
    "nexcmp": {
      "url": "https://cloud.example.com/mcp/admin",
      "headers": { "Authorization": "Bearer ak_XXXX" }
    }
  }
}
```

::: tip เก็บคีย์ไว้นอกไฟล์กำหนดค่า
ในกรณีที่ไคลเอนต์รองรับ ให้่อ่านคีย์จากตัวแปรสภาพแวดล้อมแทนการเขียนลงในไฟล์โดยตรง โดย Codex รองรับวิธีนี้เป็นค่าเริ่มต้น (`bearer_token_env_var`) และ Cursor รองรับ `"Bearer ${env:NEXCMP_KEY}"` ห้ามคอมมิตไฟล์ที่มีคีย์เก็บไว้เด็ดขาด
:::

### OpenAI Agents SDK (Python) {#openai-agents-sdk-python}

```python
from agents.mcp import MCPServerStreamableHttp

nexcmp = MCPServerStreamableHttp(
    params={"url": "https://cloud.example.com/mcp/admin",
            "headers": {"Authorization": "Bearer ak_XXXX"}},
    name="nexcmp",
)
```

การทำงานที่สมบูรณ์ (ตรวจสอบแล้วด้วย `openai-agents` 0.24 เมื่อ 30/10/2026 — เครื่องมืออ่าน จากนั้นการเปลี่ยนแปลงยอดเงินที่ส่งคืนตัวอย่างการยืนยันและถูกนำไปใช้ในการเรียกครั้งที่สองด้วย `confirm_token`):

```python
import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp

async def main():
    async with MCPServerStreamableHttp(params={"url": "https://cloud.example.com/mcp/admin",
            "headers": {"Authorization": "Bearer ak_XXXX"}}, name="nexcmp") as nexcmp:
        agent = Agent(name="admin", model="gpt-5", mcp_servers=[nexcmp],
                      instructions="You operate a hosting panel through the nexcmp tools. Ask me before confirming money actions.")
        result = await Runner.run(agent, "Run system_health and summarise it in one line.")
        print(result.final_output)

asyncio.run(main())
```

### OpenAI Responses API {#openai-responses-api}

ส่งเซิร์ฟเวอร์เป็นเครื่องมือประเภท `mcp` คง `require_approval` ไว้ที่ `always` เพื่อให้โปรแกรมของคุณถามคุณก่อนการเรียกใช้แต่ละครั้ง:

```json
{
  "type": "mcp",
  "server_label": "nexcmp",
  "server_url": "https://cloud.example.com/mcp/admin",
  "headers": { "Authorization": "Bearer ak_XXXX" },
  "require_approval": "always"
}
```

### อื่นๆ (HTTP ทั่วไป) {#anything-else-plain-http}

ไคลเอนต์ที่ไม่มี MCP สามารถเรียกใช้เครื่องมือเดียวกันผ่าน HTTP ได้ โดย `GET /v1/admin/agent/tools` ใช้แสดงรายการเครื่องมือ, `POST /v1/admin/agent/tools/<name>` ใช้เรียกใช้เครื่องมือด้วยเนื้อหา JSON ของอาร์กิวเมนต์ และ `GET /v1/admin/openapi.json` จะส่งคืนคำอธิบาย OpenAPI 3.1 (เครื่องมือละหนึ่งการทำงาน) ทั้งหมดต้องใช้ `Authorization: Bearer ak_...`

## ตรวจสอบ {#verify}

1. หากไม่มีไคลเอนต์ ให้แสดงรายการเครื่องมือ:

   ```bash
   curl -s https://cloud.example.com/mcp/admin \
     -H "Authorization: Bearer ak_XXXX" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json, text/event-stream" \
     -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
   ```

   คำตอบคือผลลัพธ์ JSON-RPC พร้อมเครื่องมือที่ขอบเขต (scopes) ของคุณอนุญาต
2. ในไคลเอนต์ของคุณ ให้พิมพ์คำว่า "run system_health" ซึ่งจะแสดงการแจ้งเตือน, สถานะสุขภาพของโครงสร้างพื้นฐานที่เชื่อมต่อ, การชำระเงิน, อีเมล, AI และสถานะไลเซนส์
3. เปิด **API & AI agents › Activity**: การเรียกใช้จะแสดงรายการพร้อมชื่อไคลเอนต์และ `mcp`
4. บนเซิร์ฟเวอร์ `sudo nexcmp status` จะพิมพ์บรรทัด "MCP admin" ซึ่งระบุว่า `ready` เมื่อเอ็นด์พอยต์ตอบกลับ (HTTP 401 โดยไม่มีคีย์ถือเป็นสถานะปกติ)

## เครื่องมือ {#tools}

เซิร์ฟเวอร์มีเครื่องมือให้บริการ 58 รายการ ไคลเอนต์จะมองเห็นเฉพาะเครื่องมือที่ขอบเขตของคีย์อนุญาตเท่านั้น: เครื่องมืออ่านต้องใช้ `admin:read` ส่วนเครื่องมือเขียนต้องใช้ขอบเขตของตนเอง นอกจากนี้ เครื่องมือเขียนยังมีอาร์กิวเมนต์เสริม `confirm_token` (ดู [Confirmation](#confirmation-confirm-token)) อาร์กิวเมนต์จะถูกตรวจสอบกับสีมาของแต่ละเครื่องมือ: อาร์กิวเมนต์ที่ไม่รู้จักหรือพิมพ์ผิดจะถูกปฏิเสธพร้อมข้อความระบุชื่ออาร์กิวเมนต์นั้น

ราคาแสดงเป็น USD: ราคาแพ็กเกจเป็นดอลลาร์ต่อชั่วโมง (`hourly_usd`), ยอดเงินคงเหลือเป็นเซนต์ สามารถตั้งค่าข้อมูลลับได้แต่จะไม่ถูกส่งคืนกลับมา

### ภาพรวมและบันทึก {#overview-and-logs}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `system_health` | การแจ้งเตือนที่ต้องสนใจ, สถานะสุขภาพของโครงสร้างพื้นฐาน, การชำระเงิน, อีเมล, AI, ไลเซนส์ และสถานะการอัปเดต | `admin:read` | ไม่ | ไม่ |
| `setup_checklist` | สิ่งที่กำหนดค่าไว้และสิ่งที่เหลืออยู่: ไลเซนส์, โครงสร้างพื้นฐาน, โซน, เทมเพลต OS, แพ็กเกจ, การชำระเงิน, อีเมล, การสร้างแบรนด์, ข้อกำหนดทางกฎหมาย, คำสั่งซื้อทดสอบ | `admin:read` | ไม่ | ไม่ |
| `license_status` | สถานะไลเซนส์และระบุว่ามี NexCMP เวอร์ชันใหม่กว่าหรือไม่ | `admin:read` | ไม่ | ไม่ |
| `audit_search` | ค้นหาบันทึกการตรวจสอบของผู้ดูแลระบบและบันทึกคีย์ API | `admin:read` | ไม่ | ไม่ |

### การตั้งค่า, การสร้างแบรนด์, ข้อกำหนดทางกฎหมาย, โมดูล {#settings-branding-legal-modules}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `settings_get` | อ่านการตั้งค่าทั่วไป (`keys` ตัวกรอง; อักขระ `*` ต่อท้ายจะจับคู่คำนำหน้า) | `admin:read` | ไม่ | ไม่ |
| `settings_update` | เปลี่ยนการตั้งค่าทั่วไปจากออบเจ็กต์ `values` แบบแบน ยอมรับเฉพาะคีย์ที่ระบุโดย `settings_get` เท่านั้น | `settings:write` | ใช่ | เมื่อคีย์เกี่ยวข้องกับการชำระเงิน, ความปลอดภัยในการเข้าสู่ระบบ, สวิตช์ทั่วทั้งไซต์ หรือราคา |
| `branding_get` | ชื่อแบรนด์, สี,สกุลเงินที่แสดง, ชื่อผู้ขาย, โลโก้ และ URL ของ favicon | `admin:read` | ไม่ | ไม่ |
| `branding_update` | ตั้งค่าชื่อแบรนด์ (สูงสุด 60 ตัวอักษร), สี (`#rrggbb`),สกุลเงินที่แสดง (`usd` หรือ `vnd`) และชื่อผู้ขาย | `settings:write` | ใช่ | ไม่ |
| `branding_logo_set` | อัปโหลดโลโก้แบบสว่างหรือมืด หรือฟาฟิคอนจาก HTTPS URL หรือ base64 (PNG, JPEG, WEBP, ICO หรือ SVG สูงสุด 512 KB) | `settings:write` | ใช่ | ไม่ |
| `legal_get` | เงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัว (ภาษาอังกฤษและภาษาเวียดนาม) รวมถึงค่าเริ่มต้นที่เป็นกลาง | `admin:read` | ไม่ | ไม่ |
| `legal_update` | กำหนดข้อความเงื่อนไขและนโยบายความเป็นส่วนตัว (Markdown อย่างง่าย ไม่มี HTML อย่างละไม่เกิน 50 KB) ค่าว่างจะคืนค่าเริ่มต้น | `settings:write` | ใช่ | ไม่ |
| `modules_get` | โมดูลเสริมใดที่เปิดใช้งานอยู่และโมดูลใดที่สามารถสลับได้ | `admin:read` | ไม่ | ไม่ |
| `module_set` | เปิดหรือปิดโมดูลเสริม (`key` ต้องเป็นหนึ่งใน `settable`) | `settings:write` | ใช่ | ไม่ |

### อีเมลและการแจ้งเตือน {#email-and-alerts}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `smtp_get` | การตั้งค่าอีเมลขาออก (ซ่อนรหัสผ่านไว้) และสถานะคิว | `admin:read` | ไม่ | ไม่ |
| `smtp_configure` | ตั้งค่าเซิร์ฟเวอร์ SMTP การเปลี่ยนโฮสต์ พอร์ต หรือความปลอดภัยจะต้องใส่รหัสผ่านใหม่อีกครั้ง | `settings:write` (+ `secrets:write` สำหรับรหัสผ่าน) | ใช่ | ไม่ |
| `smtp_test` | ส่งอีเมลทดสอบจริงด้วยการตั้งค่าที่บันทึกไว้ | `settings:write` | ส่งอีเมล | ไม่ |
| `telegram_get` | ช่องทางการแจ้งเตือนของผู้ดูแลระบบ (รหัสแชท ส่วนโทเค็นบอทจะไม่แสดงกลับมา) | `admin:read` | ไม่ | ไม่ |
| `telegram_configure` | เพิ่มหรืออัปเดตช่องทางการแจ้งเตือนผ่าน Telegram (โทเค็นบอทและรหัสแชท) และเปิดหรือปิดการแจ้งเตือนของผู้ดูแลระบบ | `settings:write` (+ `secrets:write` สำหรับโทเค็น) | ใช่ | ไม่ |
| `telegram_test` | ส่งข้อความทดสอบไปยังช่องทาง Telegram | `settings:write` | ส่งข้อความ | ไม่ |

### การชำระเงินและสกุลเงิน {#payments-and-currency}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `payments_get` | สถานะของ Stripe, PayPal, คริปโต (USDT) และการโอนเงินผ่านธนาคาร พร้อมทั้งช่องทางและค่าธรรมเนียมที่เปิดใช้งาน | `admin:read` | ไม่ | ไม่ |
| `payment_configure` | ตั้งค่าข้อมูลรับรองของเกตเวย์หนึ่งรายการ (`stripe`, `paypal`, `crypto` หรือ `bank`) | `billing:write` (+ `secrets:write`) | ใช่ | เสมอ |
| `payment_test` | ตรวจสอบข้อมูลรับรองที่บันทึกไว้ของเกตเวย์กับผู้ให้บริการ | `billing:write` | ไม่ | ไม่ |
| `currency_get` | สกุลเงินที่แสดงและอัตราแลกเปลี่ยน USD เป็น VND (แบบอัตโนมัติหรือกำหนดเอง) | `admin:read` | ไม่ | ไม่ |
| `currency_set` | กำหนดสกุลเงินที่แสดงและ/หรืออัตราแลกเปลี่ยนแบบกำหนดเอง (0 หมายถึงอัตโนมัติ นอกเหนือจากนั้นคือ 15000 ถึง 50000) | `billing:write` | ใช่ | เมื่อคุณเปลี่ยนอัตราแลกเปลี่ยนแบบกำหนดเอง |

### โครงสร้างพื้นฐานและโซน {#infrastructure-and-zones}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `cloudstack_get` | Endpoint ของ CloudStack รวมถึงรหัสโซนและเครือข่ายที่บันทึกไว้ (ซ่อนคีย์ไว้) | `admin:read` | ไม่ | ไม่ |
| `cloudstack_test` | ทดสอบ Endpoint ด้วย API key และ secret โดยไม่ต้องบันทึก ระบบจะแสดงรายการโซน | `infra:write` (+ `secrets:write` เนื่องจากคุณส่งคีย์เข้ามา) | ไม่ | ไม่ |
| `cloudstack_connect` | บันทึกการเชื่อมต่อ CloudStack | `infra:write` (+ `secrets:write`) | ใช่ | เสมอ |
| `proxmox_list` | คลัสเตอร์ Proxmox VE ที่เพิ่มเป็นแหล่งข้อมูล พร้อมสถานะความพร้อมใช้งาน | `admin:read` | ไม่ | ไม่ |
| `proxmox_add` | เพิ่มคลัสเตอร์ Proxmox VE ด้วย API token (`user@realm!tokenid`) และ secret ของมัน | `infra:write` (+ `secrets:write`) | ใช่ | ไม่ |
| `proxmox_test` | เชื่อมต่อกับคลัสเตอร์ตามรหัส การเชื่อมต่อที่สำเร็จครั้งแรกจะตรึงใบรับรอง TLS ไว้ | `infra:write` | ใช่ | ไม่ |
| `proxmox_attach_zone` | ขายคลัสเตอร์ Proxmox ในโซนที่มีอยู่ โดยเลือกโหนดเป็นภูมิภาคได้ | `infra:write` | ใช่ | ไม่ |
| `zones_list` | โซน (สถานที่) ที่ลูกค้าสามารถเลือกได้ | `admin:read` | ไม่ | ไม่ |
| `zone_create` | สร้างโซน | `infra:write` | ใช่ | ไม่ |

### แคตตาล็อกและแพ็กเกจ {#catalog-and-plans}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `templates_list` | เทมเพลต OS ที่ลูกค้าสามารถติดตั้งได้ | `admin:read` | ไม่ | ไม่ |
| `templates_sync` | นำเข้าเทมเพลต OS จาก CloudStack | `catalog:write` | ใช่ | ไม่ |
| `template_update` | เปิดใช้งานหรือซ่อนเทมเพลต เปลี่ยนชื่อ ตั้งค่าผู้ใช้สำหรับเข้าสู่ระบบ หรือลำดับ | `catalog:write` | ใช่ | ไม่ |
| `offerings_list` | Service offering ของ CloudStack (CPU, หน่วยความจำ, ดิสก์รูท) สำหรับใช้สร้างแพ็กเกจ | `admin:read` | ไม่ | ไม่ |
| `plans_list` | แพ็กเกจพร้อมราคาต่อชั่วโมงและต่อเดือน ขนาด โซน และจำนวนเซิร์ฟเวอร์ที่ใช้งานอยู่ | `admin:read` | ไม่ | ไม่ |
| `plan_create` | สร้างแพ็กเกจ กำหนดราคาในรูปแบบ `hourly_usd` แพ็กเกจ CloudStack ต้องใช้ `cs_offering_id` ส่วนแพ็กเกจ Proxmox ต้องใช้ `backend_id` | `catalog:write` | ใช่ | ไม่ |
| `plan_update` | เปลี่ยนชื่อ แสดงหรือซ่อน เปิดหรือปิดใช้งาน หรือเปลี่ยนราคาแพ็กเกจ การเปลี่ยนแปลงขนาดบนแพ็กเกจที่กำลังใช้งานอยู่จำเป็นต้องคัดลอก | `catalog:write` | ใช่ | เมื่อราคาเปลี่ยนแปลง |
| `plans_from_offerings` | สร้างตารางแพ็กเกจเริ่มต้นจาก offerings (หรือขนาดของ Proxmox) โดยใช้ต้นทุนและเปอร์เซ็นต์มาร์จินของคุณ ระบบจะแสดงตัวอย่าง เรียกใช้อีกครั้งด้วย `apply=true` เพื่อสร้างแพ็กเกจ | `catalog:write` | ด้วย `apply=true` | เสมอเมื่อปรับใช้ |
| `quota_defaults_get` | ขีดจำกัดเริ่มต้นสำหรับลูกค้า | `admin:read` | ไม่ | ไม่ |
| `quota_defaults_set` | เปลี่ยนการตั้งค่า `quota_*` | `catalog:write` | ใช่ | ไม่ |
| `coupons_list` | ชุดโค้ดส่วนลดและโค้ดของขวัญ | `admin:read` | ไม่ | ไม่ |
| `coupon_create` | สร้างชุดโค้ด: ประเภท `money` (มูลค่าหน้าบัตรเป็นหน่วยเซนต์ USD) หรือ `percent` (1 ถึง 100 พร้อมส่วนลดสูงสุด) | `catalog:write` | ใช่ | เสมอ |

### ลูกค้าและตัวแทนจำหน่าย {#customers-and-resellers}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `customers_search` | ค้นหาลูกค้าตามอีเมล ชื่อ หรือ IP | `admin:read` | ไม่ | ไม่ |
| `customer_get` | บัญชี ยอดคงเหลือ เซิร์ฟเวอร์ และประวัติการเรียกเก็บเงินล่าสุดของลูกค้ารายหนึ่ง | `admin:read` | ไม่ | ไม่ |
| `customer_adjust_balance` | เพิ่ม (ค่าบวก) หรือลด (ค่าลบ) เครดิตในหน่วยเซนต์ USD จำเป็นต้องระบุเหตุผล | `billing:write` | ใช่ | เสมอ |
| `customer_block` | บล็อกลูกค้า และสามารถเลือกหยุดการทำงานของเซิร์ฟเวอร์ได้ จำเป็นต้องระบุเหตุผล | `customers:write` | ใช่ | เสมอ |
| `customer_unblock` | ปลดบล็อกลูกค้า | `customers:write` | ใช่ | ไม่ |
| `resellers_list` | ตัวแทนจำหน่ายพร้อมกระเป๋าเงินและสถานะ | `admin:read` | ไม่ | ไม่ |
| `reseller_get` | เว็บไซต์ กระเป๋าเงิน ผู้ใช้งาน และเกตเวย์ของตัวแทนจำหน่ายรายหนึ่ง | `admin:read` | ไม่ | ไม่ |

### ผู้ให้บริการ AI {#ai-provider}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `ai_provider_get` | ผู้ให้บริการที่เข้ากันได้กับ OpenAI ซึ่งใช้งานโดย AI Chat และ AI Agent ของลูกค้า (มาสก์คีย์ไว้) | `admin:read` | ไม่ | ไม่ |
| `ai_provider_set` | ตั้งค่าผู้ให้บริการ: base URL, model, API key, fallback models, reasoning effort, enabled | `ai:write` (+ `secrets:write` สำหรับคีย์) | ใช่ | ไม่ |
| `ai_provider_test` | ส่งคำถามหนึ่งข้อไปยังผู้ให้บริการที่บันทึกไว้เพื่อตรวจสอบว่าใช้งานได้หรือไม่ | `ai:write` | ไม่ | ไม่ |

### ไฟล์การกำหนดค่า {#configuration-files}

| เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ |
|---|---|---|---|---|
| `config_export` | ส่งออกการกำหนดค่าเป็น YAML (ข้อมูลลับจะกลายเป็นการอ้างอิง `secret://`) | `admin:read` | ไม่ | ไม่ |
| `config_plan` | เปรียบเทียบการกำหนดค่า YAML กับพาเนลที่ใช้งานจริงและแสดงรายการสิ่งที่จะเปลี่ยนแปลง | `admin:read` | ไม่ | ไม่ |
| `config_apply` | ใช้งานการกำหนดค่า YAML ทีละส่วน โดยแต่ละการเปลี่ยนแปลงจะเป็นไปตามกฎขอบเขตและการยืนยันตามปกติ | `admin:read` + ขอบเขตของทุกการเปลี่ยนแปลง | ใช่ | ต่อการเปลี่ยนแปลง |

ดูรูปแบบไฟล์ได้ที่ [Configuration as code](https://nexcmp.com/th/docs/configure-with-ai/config-as-code/)

## Prompts {#prompts}

เซิร์ฟเวอร์ยังมีพรอมต์สำเร็จรูป 3 รายการที่ไคลเอนต์สามารถแสดงเป็นทางลัดได้:

| พรอมต์ | อาร์กิวเมนต์ | สิ่งที่สั่งให้ AI ดำเนินการ |
|---|---|---|
| `initial-setup` | ไม่มี | เรียกใช้ `setup_checklist`, อธิบายแต่ละขั้นตอนที่ค้างอยู่ในหนึ่งประโยค, ขอข้อมูลที่จำเป็นจากคุณ, ดำเนินการตามขั้นตอนด้วยเครื่องมือที่ตรงกัน, แสดงตัวอย่างการเปลี่ยนแปลงทางการเงินหรือความปลอดภัย และสิ้นสุดด้วย `system_health` |
| `add-proxmox` | `endpoint` (ทางเลือก, `https://host:8006`) | ขอ API token จากนั้นเรียกใช้ `proxmox_add`, `proxmox_test`, เครื่องมือโซน และ `proxmox_attach_zone` จากนั้นเสนอแพ็กเกจด้วย `plans_from_offerings` และรอการอนุมัติจากคุณ |
| `launch-pricing` | `margin_pct` (ทางเลือก, ค่าเริ่มต้น 40) | สอบถามต้นทุนรายเดือนของคุณต่อ vCPU, ต่อ GB ของ RAM และต่อ GB ของดิสก์ แสดงตารางตัวอย่างพร้อมต้นทุน ราคาต่อเดือน และราคาต่อชั่วโมง แล้วจึงสร้างแพ็กเกจหลังจากที่คุณอนุมัติ |

## การยืนยัน (`confirm_token`) {#confirmation-confirm-token}

การดำเนินการที่มีการย้ายเงิน ลบข้อมูล เปลี่ยนข้อมูลการชำระเงิน หรือความปลอดภัยในการเข้าสู่ระบบ จะเป็นแบบ 2 ขั้นตอน:

1. การเรียกใช้ครั้งแรกจะไม่มีการเปลี่ยนแปลงใดๆ ผลลัพธ์ของเครื่องมือจะขึ้นต้นด้วย "CONFIRMATION REQUIRED" และมี **ตัวอย่าง** (สิ่งที่จะถูกเรียกใช้, เหตุผลที่ละเอียดอ่อน, ค่าใหม่และค่าปัจจุบัน) รวมถึง `confirm_token`
2. ไคลเอนต์จะต้องแสดงตัวอย่างให้คุณดู และหลังจากที่คุณอนุมัติแล้วเท่านั้น จึงจะเรียกใช้เครื่องมือเดิมอีกครั้งด้วยอาร์กิวเมนต์เดิมพร้อมกับ `confirm_token`
3. โทเค็นสามารถใช้ได้ครั้งเดียว สำหรับคำขอดังกล่าวโดยเฉพาะเท่านั้น และจะหมดอายุหลังจาก 5 นาที

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

::: warning ไม่อนุมัติอัตโนมัติ
ไคลเอนต์บางตัวสามารถอนุมัติการเรียกเครื่องมือทุกรายการได้โดยอัตโนมัติ สำหรับเครื่องมือที่มีการเขียน ให้เปิดการอนุมัติรายครั้งไว้ หรือใช้คีย์แบบอ่านอย่างเดียว เพื่อไม่ให้แผนการที่ผิดพลาดจาก AI เข้าถึงแผงควบคุมของคุณได้โดยไม่ผ่านการตรวจสอบ
:::

## วิธีการทำงาน {#how-it-works}

| Item | Detail |
|---|---|
| การรับส่งข้อมูล | `POST /mcp/admin` ด้วยข้อความ JSON-RPC 2.0; คำตอบคือ `application/json` สูงสุด 20 ข้อความต่อหนึ่งแบทช์ `GET /mcp/admin` ตอบกลับ 405 (ไม่มีสตรีมเซิร์ฟเวอร์); `DELETE /mcp/admin` สิ้นสุดเซสชัน |
| การยืนยันตัวตน | `Authorization: Bearer ak_...` (คีย์แบบกำหนดเองหรือโทเค็นการเข้าถึง OAuth) ข้อมูลประจำตัวที่ขาดหายไปหรือไม่ถูกต้องจะส่งคืน 401 พร้อมกับ `WWW-Authenticate: Bearer ... resource_metadata=...` ซึ่งช่วยให้ไคลเอนต์ OAuth สามารถเริ่มเข้าสู่ระบบได้ด้วยตนเอง |
| เซสชัน | `Mcp-Session-Id` ออกโดย `initialize` ซึ่งผูกอยู่กับคีย์นั้นและมีอายุใช้งาน 24 ชั่วโมง |
| ความสามารถ | เครื่องมือและพรอมต์ ไม่มีทรัพยากร |
| ขนาด | เนื้อหาคำขอสูงสุด 1 MB; ผลลัพธ์ของเครื่องมือจะถูกตัดทอนหลังจากประมาณ 100 KB |
| ต้นทาง | คำขอที่มีส่วนหัว `Origin` จากเว็บไซต์อื่นจะถูกปฏิเสธ (`origin_not_allowed`) ไคลเอนต์บรรทัดคำสั่งและเดสก์ท็อปจะไม่ส่งข้อมูลนี้ |
| เกตเวย์เดียวกับ REST | การเรียกเครื่องมือแต่ละรายการจะถูกส่งผ่านท่อส่งคำขอของแผงควบคุมเองด้วยคีย์ของคุณ เพื่อให้ขอบเขต ช่วง IP ขีดจำกัดอัตรา การยืนยัน และบันทึกกิจกรรมทำงานตรงกันทุกประการเช่นเดียวกับการเรียก API โดยตรง |

## ขีดจำกัดและหมายเหตุ {#limits-notes}

- เครื่องมือที่คุณมองไม่เห็นคือขอบเขตที่คุณไม่ได้ให้สิทธิ์ โปรดเพิ่มขอบเขตดังกล่าวลงในคีย์ใหม่
- การตั้งรหัสผ่านหรือ API key ผ่านทาง AI client หมายความว่าข้อมูลลับจะผ่านระบบ AI นั้น หากต้องการ คุณสามารถปิด `secrets:write` ไว้และป้อนข้อมูลลับด้วยตนเองในหน้าผู้ดูแลระบบ หรือใช้ฟิลด์ **Secret** ของ AI Chat ([AI Chat ในระบบผู้ดูแลระบบ](https://nexcmp.com/th/docs/configure-with-ai/ai-chat-in-admin/#secrets)) หรือการอ้างอิง `secret://` ([การกำหนดค่าเป็นโค้ด](https://nexcmp.com/th/docs/configure-with-ai/config-as-code/#secrets))
- ไคลเอนต์ไม่ได้ใช้เซสชันร่วมกัน: แต่ละการเชื่อมต่อเริ่มต้นด้วย `initialize`
- เพิกถอนคีย์ใน **API & AI agents** เพื่อตัดการเชื่อมต่อไคลเอนต์ AI ทันที

## การแก้ Problme {#troubleshooting}

| อาการ | สาเหตุ | วิธีแก้ปัญหา |
|---|---|---|
| 401 `invalid_key` | คีย์ที่ไม่ถูกต้อง ถูกตัดทอน หรือไม่ใช่คีย์ผู้ดูแลระบบ (เช่น คีย์ `vk_`) | ใช้คีย์ `ak_` |
| 401 `key_expired` หรือ `key_revoked` | คีย์หมดอายุหรือถูกเพิกถอน | สร้างคีย์ใหม่. |
| 403 `ip_not_allowed` | IP ของคุณอยู่นอกช่วง IP ของคีย์ | เชื่อมต่อจาก IP ที่ได้รับอนุญาต |
| 403 `origin_not_allowed` | หน้าเว็บเบราว์เซอร์จากต้นทางอื่นเรียกใช้เอนด์จุดนี้ | ใช้ไคลเอนต์เดสก์ท็อปหรือ CLI |
| 404 ในคำขอที่มี `Mcp-Session-Id` | เซสชันเป็นของคีย์อื่นหรือหมดอายุแล้ว | ส่ง `initialize` อีกครั้ง |
| 400 ไม่รองรับ `MCP-Protocol-Version` | ไคลเอนต์ใช้เวอร์ชันที่เซิร์ฟเวอร์ไม่รู้จัก | อัปเดตไคลเอนต์; เวอร์ชันที่รองรับ: 2025-11-25, 2025-06-18, 2025-03-26 |
| รายการเครื่องมือสั้นเกินไป | ขอบเขตของคีย์ | สร้างคีย์ที่มีขอบเขตเพิ่มเติม |
| `insufficient_scope` ในการเรียกใช้งาน | เครื่องมือต้องการขอบเขตที่สอง เช่น `secrets:write` | เพิ่มขอบเขตดังกล่าวลงในคีย์ใหม่ |
| 429 `rate_limited` | จำนวนการเรียกต่อนาทีเกินกว่าที่คีย์อนุญาต | รอ `Retry-After` หรือเพิ่มขีดจำกัดบนคีย์ใหม่ |
| claude.ai หรือ ChatGPT ไม่สามารถเชื่อมต่อได้ | ไม่สามารถเข้าถึง URL ได้จากอินเทอร์เน็ต หรือพร็อกซีบล็อก `/mcp/admin` หรือ `/oauth-admin/` | ตรวจสอบ DNS, TLS และรีเวอร์สพร็อกซี |

สำหรับรหัสข้อผิดพลาดทั้งหมด โปรดดูที่ [Admin API keys](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#errors)


