---
title: "เซิร์ฟเวอร์ MCP - ให้ AI agent แจ้งเตือนหรือโทรหาคุณ"
sidebarTitle: เซิร์ฟเวอร์ MCP
description: "เชื่อมต่อ Claude Code, Codex, Cursor, VS Code, ChatGPT และ AI agent อื่น ๆ เข้ากับเซิร์ฟเวอร์ MCP อย่างเป็นทางการของ Echobell เพื่อให้มันส่งการแจ้งเตือนแบบพุชหรือโทรหาคุณได้"
---

# เซิร์ฟเวอร์ MCP สำหรับ AI agent

Echobell มีเซิร์ฟเวอร์ [Model Context Protocol](https://modelcontextprotocol.io) (MCP) อย่างเป็นทางการ เมื่อเชื่อมต่อเข้ากับ AI agent ของคุณ ไม่ว่าจะเป็น Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude, ChatGPT หรือ MCP client ตัวอื่น agent จะได้เครื่องมือหนึ่งตัวชื่อ `notify` ซึ่งใช้ส่งการแจ้งเตือนผ่านช่อง Echobell ช่องหนึ่งของคุณ

สั่งให้ agent รีแฟกเตอร์งานใหญ่ รันชุดทดสอบ หรือ deploy แล้วลุกไปทำอย่างอื่นได้เลย เพียงบอกให้มันแจ้งคุณเมื่อเสร็จ มือถือจะสั่นเมื่องานเสร็จ แสดงการแจ้งเตือนแบบสำคัญตามเวลาเมื่อ agent ต้องการคุณ หรือดังเหมือนสายโทรเข้าเมื่อเกิดปัญหาร้ายแรง

## หลักการทำงาน

- นี่คือเซิร์ฟเวอร์ MCP แบบ**ระยะไกล**ที่ `https://mcp.echobell.one/mcp` ใช้การส่งข้อมูลแบบ Streamable HTTP ไม่ต้องติดตั้งอะไรเลย ไม่มีแพ็กเกจ npm ไม่มี `npx` และไม่มีโปรเซสที่รันบนเครื่อง
- MCP URL แต่ละอันผูกกับ**ช่องเดียว** เมื่อ agent เรียก `notify` ทุกคนที่ติดตามช่องนั้นจะได้รับการแจ้งเตือน ตาม[ประเภทการแจ้งเตือน](/docs/notification)ที่แต่ละคนเลือกไว้
- ข้อมูลยืนยันตัวตนคือ**โทเค็นทริกเกอร์**ของช่อง ซึ่งเป็นโทเค็นเดียวกับที่อยู่ท้าย webhook URL ของช่อง เซิร์ฟเวอร์ MCP ทำงานเหมือน [webhook](/docs/webhook) ของช่อง เพียงแต่มาในรูปเครื่องมือที่ agent รู้วิธีเรียกใช้

<Callout type="info">
  สร้างช่องแยกไว้สำหรับ agent โดยเฉพาะ เช่น "AI Agents" แล้วติดตามช่องนั้นในระดับ
  **โทรเข้า** จากนั้น agent จะเลือกระดับใดก็ได้สูงสุดถึงการโทร
  และคุณยังแชร์ช่องนี้ให้เพื่อนร่วมทีมที่อยากได้รับการแจ้งเตือนเดียวกันได้ด้วย
</Callout>

## รับ MCP URL

### จากแอป

1. เปิดแอป Echobell แล้วแตะช่องที่ต้องการให้ agent ใช้
2. ในหน้ารายละเอียดช่อง ให้หาส่วน **เชื่อมต่อเอเจนต์ AI**
3. คัดลอก **URL ของเซิร์ฟเวอร์ MCP** หรือคัดลอกโค้ดตั้งค่าสำเร็จรูปสำหรับ agent ของคุณ

### จาก webhook URL

MCP URL ใช้โทเค็นเดียวกับ webhook URL ของช่อง นำโทเค็นที่อยู่ท้าย webhook URL มาต่อท้าย `https://mcp.echobell.one/mcp/`:

```
Webhook URL: https://hook.echobell.one/t/<channel-token>
MCP URL:     https://mcp.echobell.one/mcp/<channel-token>
```

<Callout type="warn">
  MCP URL มีโทเค็นทริกเกอร์ของช่องอยู่ด้วย
  ใครก็ตามที่มีมันสามารถส่งการแจ้งเตือนถึงผู้ติดตามของช่องได้
  จึงควรเก็บเป็นความลับเหมือนรหัสผ่าน ดู[ความปลอดภัย](#ความปลอดภัย)
</Callout>

## ตั้งค่า agent ของคุณ

โค้ดตั้งค่าทั้งหมดด้านล่างใช้รูปแบบ URL ให้แทนที่ `<channel-token>` ด้วยโทเค็นทริกเกอร์ของช่อง หรือวางโค้ดที่แอปให้มา ซึ่งใส่โทเค็นไว้ให้แล้ว

### Claude Code

```bash
claude mcp add --transport http echobell https://mcp.echobell.one/mcp/<channel-token>
```

เพิ่ม `--scope user` หากต้องการให้ใช้เซิร์ฟเวอร์นี้ได้ในทุกโปรเจกต์ ไม่ใช่เฉพาะโปรเจกต์ปัจจุบัน

### Codex

เพิ่มโค้ดนี้ใน `~/.codex/config.toml`:

```toml
[mcp_servers.echobell]
url = "https://mcp.echobell.one/mcp/<channel-token>"
```

### Cursor

เพิ่มโค้ดนี้ใน `~/.cursor/mcp.json` หรือใน `.cursor/mcp.json` ของโปรเจกต์:

```json
{
  "mcpServers": {
    "echobell": {
      "url": "https://mcp.echobell.one/mcp/<channel-token>"
    }
  }
}
```

### VS Code (GitHub Copilot)

เพิ่มโค้ดนี้ใน `.vscode/mcp.json` ของ workspace แล้วใช้เครื่องมือนี้จาก Copilot Chat ในโหมด agent:

```json
{
  "servers": {
    "echobell": {
      "type": "http",
      "url": "https://mcp.echobell.one/mcp/<channel-token>"
    }
  }
}
```

หากไฟล์ `.vscode/mcp.json` ถูก commit เข้า repository ให้ใช้[รูปแบบ header พร้อมช่องกรอกโทเค็น](#รูปแบบ-header)แทน เพื่อไม่ให้โทเค็นอยู่ในไฟล์

### Windsurf

เพิ่มโค้ดนี้ใน `~/.codeium/windsurf/mcp_config.json`:

```json
{
  "mcpServers": {
    "echobell": {
      "serverUrl": "https://mcp.echobell.one/mcp/<channel-token>"
    }
  }
}
```

### Gemini CLI

เพิ่มโค้ดนี้ใน `~/.gemini/settings.json`:

```json
{
  "mcpServers": {
    "echobell": {
      "httpUrl": "https://mcp.echobell.one/mcp/<channel-token>"
    }
  }
}
```

### Claude Desktop และ claude.ai

1. เปิด **Settings → Connectors**
2. เลือก **Add custom connector**
3. ใส่ชื่อ `Echobell` และ URL `https://mcp.echobell.one/mcp/<channel-token>` แล้วกดเพิ่ม

connector นี้ใช้ได้ทั้งใน Claude บนเว็บและในแอปเดสก์ท็อป

### ChatGPT

1. เปิดโหมดนักพัฒนา (developer mode) ในการตั้งค่าของ ChatGPT
2. เปิด **Settings → Connectors** แล้วเลือก **Create**
3. ใส่ URL `https://mcp.echobell.one/mcp/<channel-token>` และตั้งค่าการยืนยันตัวตนเป็น **No authentication** เพราะโทเค็นใน URL คือข้อมูลยืนยันตัวตนอยู่แล้ว

### MCP client อื่น ๆ

client ใดก็ตามที่รองรับการส่งข้อมูลแบบ Streamable HTTP ใช้งานได้ทั้งหมด ให้ใส่ URL `https://mcp.echobell.one/mcp/<channel-token>` หรือใช้รูปแบบ header ด้านล่าง

### รูปแบบ header

แทนที่จะใส่โทเค็นไว้ใน URL คุณสามารถส่งโทเค็นผ่าน header `Authorization` ได้ ทั้งสองรูปแบบให้ผลเหมือนกัน

```
URL:            https://mcp.echobell.one/mcp
Authorization:  Bearer <channel-token>
```

สำหรับ Claude Code:

```bash
claude mcp add --transport http echobell https://mcp.echobell.one/mcp \
  --header "Authorization: Bearer <channel-token>"
```

ใน VS Code การใช้ช่องกรอกข้อมูล (input prompt) จะช่วยให้โทเค็นไม่อยู่ใน `.vscode/mcp.json` จึง commit ไฟล์นี้ได้อย่างปลอดภัย VS Code จะถามโทเค็นเมื่อเริ่มเซิร์ฟเวอร์ครั้งแรกและเก็บไว้อย่างปลอดภัย:

```json
{
  "inputs": [
    {
      "type": "promptString",
      "id": "echobell-token",
      "description": "Echobell channel trigger token",
      "password": true
    }
  ],
  "servers": {
    "echobell": {
      "type": "http",
      "url": "https://mcp.echobell.one/mcp",
      "headers": {
        "Authorization": "Bearer ${input:echobell-token}"
      }
    }
  }
}
```

## เครื่องมือ `notify`

เซิร์ฟเวอร์มีเครื่องมือเพียงตัวเดียวคือ `notify` agent จะตัดสินใจเองว่าจะกรอกค่าอย่างไรจาก prompt ของคุณ

| อาร์กิวเมนต์ | ชนิด | จำเป็น | คำอธิบาย |
|---|---|---|---|
| `title` | string | ใช่ | หัวข้อการแจ้งเตือน |
| `body` | string | ไม่ | เนื้อหาการแจ้งเตือน |
| `link` | string (URL) | ไม่ | ลิงก์ที่จะเปิดเมื่อคุณแตะการแจ้งเตือน เช่น pull request, log ของ build หรือแดชบอร์ด |
| `urgency` | string | ไม่ | `normal`, `time-sensitive` หรือ `calling` ไม่ต้องใส่หากต้องการใช้ระดับของผู้ติดตามแต่ละคน ดู[ระดับความเร่งด่วน](#ระดับความเร่งด่วน) |

## ระดับความเร่งด่วน

ทุกคนที่ติดตามช่องจะเลือกประเภทการแจ้งเตือนของช่องนั้นในแอป ได้แก่ ปกติ สำคัญตามเวลา หรือโทรเข้า ตัวเลือกนี้คือระดับ**สูงสุด**ที่ช่องจะติดต่อคนคนนั้นได้

- เมื่อ agent ไม่ได้ส่ง `urgency` ผู้ติดตามแต่ละคนจะได้รับตามระดับที่ตนเลือกไว้
- เมื่อ agent ส่ง `urgency` มา จะทำได้เพียง**ลด**ระดับของผู้ติดตามเท่านั้น ไม่สามารถเพิ่มได้ หากคุณติดตามในระดับโทรเข้า `"urgency": "normal"` จะมาถึงเป็นการแจ้งเตือนปกติ หากคุณติดตามในระดับปกติ `"urgency": "calling"` ก็ยังมาถึงเป็นการแจ้งเตือนปกติ

ด้วยวิธีนี้ ช่องเดียวก็ครอบคลุมได้ทุกกรณี ติดตามในระดับโทรเข้า แล้วบอก agent ให้ส่งอัปเดตทั่วไปเป็น `normal` และใช้ `calling` เฉพาะเมื่อมีบางอย่างพังเท่านั้น

ต่างจาก `notificationType` ในคำขอ webhook ตรงที่ `urgency` ใช้ได้กับช่องที่เปิดใช้เทมเพลตแบบกำหนดเองด้วย

### การโทรเข้าต้องใช้ Echobell Premium

การแจ้งเตือนแบบโทรเข้าเป็นฟีเจอร์ของ Echobell Premium เมื่อ agent ขอ `calling` ผู้ติดตามที่ไม่มี Premium จะได้รับการแจ้งเตือนแบบ**สำคัญตามเวลา**แทน ซึ่งเป็นพฤติกรรมเดียวกับในแอปและ webhook

### โทรเข้าได้ 1 ครั้งต่อนาทีต่อช่อง

ช่องหนึ่งจะโทรหาผู้ติดตามแต่ละคนได้ไม่เกิน 1 ครั้งต่อนาที หาก agent ขอโทรอีกครั้งภายในนาทีนั้น เช่น เพราะติดอยู่กับการลองใหม่ซ้ำ ๆ ผู้ติดตามจะได้รับการแจ้งเตือนแบบ**สำคัญตามเวลา**แทน ซึ่งยังทะลุโหมดโฟกัสได้ webhook และทริกเกอร์อีเมลก็ใช้กฎเดียวกัน

agent จะได้รับแจ้งทั้งสองกรณี ผลลัพธ์ของเครื่องมือจะระบุทุกกรณีที่ถูกลดระดับ agent จึงรู้ว่ามือถือไม่ได้ดัง และบอกคุณตามจริงได้ แทนที่จะเข้าใจไปเองว่าโทรหาคุณแล้ว

## สิ่งที่ agent ได้รับกลับมา

การเรียก `notify` แต่ละครั้งจะส่งข้อความสรุปสั้น ๆ ให้ agent พร้อมข้อมูลแบบมีโครงสร้าง:

```json
{
  "notificationTriggered": true,
  "reason": null,
  "requestedUrgency": "calling",
  "recipients": 1,
  "deliveredUrgency": { "normal": 0, "time-sensitive": 1, "calling": 0 },
  "fallbacks": [
    {
      "from": "calling",
      "to": "time-sensitive",
      "reason": "premium-required",
      "recipients": 1
    }
  ]
}
```

| ฟิลด์ | ความหมาย |
|---|---|
| `notificationTriggered` | เป็น `true` เมื่อส่งการแจ้งเตือนแล้ว |
| `reason` | เหตุผลที่ไม่มีการส่ง: `conditions-not-met` ([เงื่อนไข](/docs/conditions)ของช่องไม่ตรง) หรือ `no-subscribers` (ไม่มีใครติดตามช่องนี้) เป็น `null` เมื่อส่งการแจ้งเตือนแล้ว |
| `requestedUrgency` | ค่า `urgency` ที่ agent ขอ หรือ `null` เมื่อไม่ได้ส่งมา |
| `recipients` | จำนวนผู้ติดตามที่ได้รับการแจ้งเตือน |
| `deliveredUrgency` | จำนวนผู้ติดตามที่ได้รับในแต่ละระดับ |
| `fallbacks` | ผู้ติดตามที่ได้รับระดับต่ำกว่าที่ขอ พร้อมเหตุผล: `premium-required` (การโทรเข้าต้องใช้ Premium) `subscriber-setting` (ระดับที่ผู้ติดตามตั้งไว้สำหรับช่องนี้ต่ำกว่า) หรือ `call-cooldown` (ช่องนี้โทรหาผู้ติดตามคนนั้นไปแล้วภายใน 1 นาทีที่ผ่านมา) |

## ช่องแบบส่งผ่านและช่องแบบเทมเพลต

เซิร์ฟเวอร์ MCP ใช้ได้กับช่องทั้งสองแบบ:

- **ช่องแบบส่งผ่าน** (ค่าเริ่มต้น) จะแสดง `title` และ `body` ตามที่ agent ส่งมาทุกประการ
- **ช่องแบบเทมเพลต** (ที่เปิด **เทมเพลตกำหนดเอง** ใน **การตั้งค่าขั้นสูง**) จะสร้างการแจ้งเตือนจาก[เทมเพลต](/docs/template)ของคุณ โดยมี `title`, `body`, `link`, `externalLink` และ `urgency` ให้ใช้เป็นตัวแปรในเทมเพลต และ[เงื่อนไข](/docs/conditions)ของช่องก็ยังมีผลเหมือนเดิม เมื่อเงื่อนไขไม่ตรง จะไม่มีการส่งอะไร และ agent จะได้รับ `reason: "conditions-not-met"`

## ตัวอย่าง prompt

เมื่อเชื่อมต่อเซิร์ฟเวอร์แล้ว ก็ขอการแจ้งเตือนด้วยภาษาธรรมดาได้เลย:

- "รันชุดทดสอบทั้งหมด แล้วแจ้งฉันผ่าน Echobell เมื่อเสร็จ"
- "รีแฟกเตอร์โมดูลการชำระเงิน ถ้าต้องให้ฉันตัดสินใจอะไร ให้ส่งการแจ้งเตือน Echobell แบบสำคัญตามเวลามา"
- "Deploy ขึ้น staging ถ้า deploy ล้มเหลวให้โทรหาฉัน ถ้าไม่มีปัญหาให้ส่งการแจ้งเตือนปกติพร้อม URL"
- "เมื่อ migration เสร็จ แจ้งฉันพร้อมสรุปและลิงก์ไปยัง pull request"

ถ้าอยากให้เป็นนิสัยของ agent ให้เพิ่มข้อความประมาณนี้ลงในไฟล์คำสั่งของ agent (`CLAUDE.md`, `AGENTS.md`, `.cursorrules` เป็นต้น):

```
When a task takes longer than a few minutes, call the Echobell notify tool when it finishes.
Use urgency "calling" only when something is broken and needs me right away.
```

## ความปลอดภัย

- **โทเค็นคือข้อมูลยืนยันตัวตน** ใครก็ตามที่มี MCP URL (หรือโทเค็น) สามารถส่งการแจ้งเตือนถึงผู้ติดตามของช่องได้ แต่อ่านข้อมูลใด ๆ หรือแก้ไขบัญชีของคุณไม่ได้ สิ่งเดียวที่ทำได้คือส่งการแจ้งเตือน
- **อย่าใส่ไว้ในไฟล์ที่แชร์กัน** อย่า commit ไฟล์ตั้งค่าที่มี URL แบบมีโทเค็น สำหรับการตั้งค่าระดับโปรเจกต์ ให้ใช้[รูปแบบ header](#รูปแบบ-header)ร่วมกับช่องกรอกข้อมูลหรือตัวแปรสภาพแวดล้อม
- **เพิกถอนสิทธิ์ด้วยการรีเซ็ตโทเค็นทริกเกอร์** เปิดช่องในแอปแล้วรีเซ็ตโทเค็นทริกเกอร์ MCP URL เดิมจะใช้งานไม่ได้ทันที (คำขอจะได้รับ `401 Unauthorized`) และ webhook URL เดิมก็เช่นกัน จากนั้นอัปเดตโทเค็นใหม่ให้ agent และระบบที่เรียก webhook

## ขีดจำกัดและข้อผิดพลาด

- **ขีดจำกัดอัตรา**: แต่ละโทเค็นรับคำขอ MCP ได้สูงสุด 120 ครั้งต่อนาที คำขอ MCP มีโควตาของตัวเอง แยกจากคำขอ webhook ของช่อง
- **401 Unauthorized**: ไม่มีโทเค็น โทเค็นไม่ถูกต้อง หรือโทเค็นถูกรีเซ็ตไปแล้ว

## เนื้อหาที่เกี่ยวข้อง

- [Webhook](/docs/webhook) — ทริกเกอร์ช่องเดียวกันจากสคริปต์ CI และบริการอื่น ๆ
- [ประเภทการแจ้งเตือน](/docs/notification) — ความแตกต่างระหว่างปกติ สำคัญตามเวลา และโทรเข้า
- [เทมเพลต](/docs/template) และ[เงื่อนไข](/docs/conditions) — กำหนดรูปแบบและกรองการแจ้งเตือน
