LINE MCP Tools — คู่มือย่อสำหรับ AI (ค่าเริ่มต้นของโปรเจกต์)
เอกสารหน้านี้เป็นความรู้เริ่มต้นสำหรับ AI เพื่อเลือกและใช้งานเครื่องมือ (tools) ของ LINE Messaging API ผ่าน MCP ได้อย่างถูกต้อง ปลอดภัย และตรงความต้องการ โดยตั้งใจให้ใช้ “คำสั่งเดียว” คือ `gemini_command` เพื่อวางแผนและลงมือทำทีละหนึ่งแอคชัน
จงเลือกทำเพียงหนึ่งอย่างต่อไปนี้ในแต่ละคำสั่ง (plan-and-execute one action):
- get_profile(userId?) — ดูโปรไฟล์ผู้ใช้
- get_rich_menu_list() — ดูรายการ Rich Menu ทั้งหมดของ OA
- get_message_quota() — เช็กโควตารายเดือนและการใช้งานข้อความ
- push_text(userId?, text) — ส่งข้อความตัวอักษรให้ผู้ใช้คนเดียว
- push_flex(userId?, altText, contents) — ส่ง Flex Message ให้ผู้ใช้คนเดียว
- broadcast_text(text) — ส่งข้อความตัวอักษรถึงผู้ติดตามทุกคน
- broadcast_flex(altText, contents) — ส่ง Flex Message ถึงผู้ติดตามทุกคน
หมายเหตุสำคัญ
- ถ้าไม่ได้ระบุ `userId` ให้ใช้ค่าปลายทางเริ่มต้นของระบบ (DESTINATION_USER_ID) สำหรับ push/get_profile
- การใช้ broadcast_* จะส่งถึงทุกคน โปรดใช้เฉพาะกรณีประกาศสาธารณะจริง ๆ
- `altText` ต้องเป็นข้อความสั้น อ่านเข้าใจง่าย (แสดงเมื่อ Flex เปิดไม่ได้)
- `contents` ของ Flex ต้องเป็นไปตาม LINE Flex Message (ประเภท `bubble` หรือ `carousel`)
- หากมี `filePath` แนบมา (เช่น docs/data-learning/knowledge.md) ให้ใช้เฉพาะเป็นข้อมูลอ้างอิง ถ้าไม่เกี่ยวข้องให้ไม่ต้องใช้
## gemini_command — คำสั่งรวมเดียว
- ชื่อเครื่องมือ: `gemini_command`
- พารามิเตอร์
- `instruction` ข้อความธรรมชาติ (TH/EN) อธิบายสิ่งที่อยากให้ทำ เช่น “ส่งข้อความโปรโมชันให้ผู้ใช้”, “สร้าง Flex แนะนำเมนูอาหาร 3 รายการและส่งให้ฉัน”
- `model` ชื่อโมเดล Gemini (ค่าเริ่มต้น: `gemini-2.0-flash`)
- `filePath` (ไม่บังคับ) ไฟล์ Markdown สำหรับความรู้ประกอบ เช่น `docs/data-learning/knowledge.md`
- `mode` เลือกการทำงาน: `auto` (ให้โมเดลตัดสินใจ), `actions` (บังคับโหมดวางแผนการทำ LINE), `qa` (ตอบคำถามจากไฟล์ความรู้และ push เป็นข้อความ)
- ผลลัพธ์ที่ต้องวางแผน: ให้ตัดสินใจเลือก “หนึ่งแอคชัน” จากรายการด้านบน แล้วกำหนดอาร์กิวเมนต์ให้ครบถ้วน
แนวทางตัดสินใจ
- ต้องปลอดภัยก่อน: หากคำสั่งมีผลกระทบวงกว้าง ให้หลีกเลี่ยง broadcast ยกเว้นผู้ใช้ขอชัดเจน
- เลือก push_* สำหรับการส่งถึงคนเดียว เลือก broadcast_* สำหรับประกาศสาธารณะ
- ถ้าผู้ใช้ถามสถานะหรือรายการ ให้เลือก get_* (เช่น quota, rich menu, profile)
- ถ้าคำสั่งเกี่ยวกับคอนเทนต์รูปแบบสวยงาม ให้เลือก Flex (push_flex/broadcast_flex)
ตัวอย่างคำสั่ง (instruction) ที่ถูกต้อง
- “ส่งข้อความว่า ‘สวัสดีครับ’ ให้ฉัน” → `push_text`
- “ประกาศปิดปรับปรุงระบบคืนนี้ 22:00-23:00” → `broadcast_text`
- “ขอรายการ Rich Menu ตอนนี้มีอะไรบ้าง” → `get_rich_menu_list`
- “เช็กโควตาส่งข้อความของเดือนนี้ และแจ้งฉันสั้น ๆ” → `get_message_quota`
- “ส่ง Flex แนะนำเมนูพิเศษ 3 รายการให้ฉัน” → `push_flex`
- “ส่ง Flex โปรโมชัน 9.9 ให้ผู้ติดตามทุกคน” → `broadcast_flex`
- “ดูโปรไฟล์ของฉัน” → `get_profile`
## กติกาที่ตัววางแผน (Planner Rules) ใช้ตัดสินใจ
- ตอบออกมาเป็น JSON เคร่งครัดเท่านั้น: `{"action":"...","args":{...}}` ห้ามมี Markdown/คำอธิบายแทรก
- ถ้าเป็น “คำถาม/ขอข้อมูล” ให้ “แต่งคำตอบจริง” แล้วส่งด้วย `push_text` โดย
- เติม `args.text` ด้วยคำตอบสั้น ชัดเจน (ไทยถ้าเหมาะสม) ไม่ใช่การคัดลอกคำสั่ง
- ถ้ามี `filePath` ให้ยึดข้อมูลจากไฟล์นั้นก่อน ถ้าไม่พอให้บอก “ไม่ทราบ” แบบสั้น
- หลีกเลี่ยง `broadcast_*` เว้นผู้ใช้สั่งชัดเจน เช่น “broadcast/ประกาศ/ทุกคน”
- ถ้าเป็นงานรูปแบบสวยงามหรือหลายรายการ ให้ใช้ Flex (`push_flex`/`broadcast_flex`)
- ต้องมี `altText` ที่สั้นและเข้าใจง่าย
- ต้องมี `contents` ที่ถูกสเปก LINE Flex (bubble/carousel) และ “อิงจากไฟล์ความรู้ถ้ามี” ห้ามเดาข้อมูลใหม่
- Bubble ใช้โครงขั้นต่ำได้: `{ type: "bubble", body: { type: "box", layout: "vertical", contents: [...] } }`
- ถ้าคลุมเครือ ให้เริ่มจาก `push_text` เพื่อสอบถาม/ยืนยันก่อน
หมายเหตุ: เอกสารนี้เป็น “ความรู้เริ่มต้น” สำหรับโปรเจกต์ แต่จะถูกฉีดเข้าเป็นบริบทความรู้ก็ต่อเมื่อส่ง `filePath` ให้ `gemini_command` เท่านั้น
## รูปแบบข้อมูลข้อความ (Text)
- `text` ต้องเป็นข้อความธรรมชาติสั้น ชัดเจน ไม่ควรยาวเกินจำเป็น
- ตัวอย่าง (push_text/broadcast_text)
```
{ "text": "สวัสดีครับ ขอบคุณที่ติดตามเรา!" }
```
## รูปแบบ Flex Message (สรุปย่อสำหรับ AI)
- โครงสร้างหลัก
- `type`: ต้องเป็น `flex`
- `altText`: ข้อความสำรอง กรณีแสดง Flex ไม่ได้
- `contents`: วัตถุ Flex Container แบบ `bubble` หรือ `carousel`
- `bubble` พื้นฐาน (ตัวอย่างเรียบง่าย)
```
{
"type": "bubble",
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ "type": "text", "text": "เมนูพิเศษวันนี้" },
{ "type": "text", "text": "ยำแซลมอน" }
]
}
}
```
- `carousel` คือรายการ `bubble` หลายอัน แบบเลื่อนดู
```
{
"type": "carousel",
"contents": [ { /* bubble 1 */ }, { /* bubble 2 */ } ]
}
```
- เคล็ดลับการออกแบบ Flex สำหรับ AI
- ใช้ตัวอักษรไทยชัดเจน กะทัดรัด
- อย่าใส่ปุ่ม/ลิงก์ที่ไม่ทำงานจริง
- สำหรับการ์ดหลายรายการ ให้ชื่อสั้น + ราคา/คุณค่าหลัก
- `altText` ต้องสรุปใจความ เช่น “โปรโมชัน 9.9 ลดสูงสุด 50%”
## Mapping การใช้งานอย่างรวดเร็ว
- แจ้งข่าว/ประกาศกว้าง → `broadcast_text` หรือ `broadcast_flex`
- คุย 1:1 หรือทดสอบบนบัญชีเดียว → `push_text` หรือ `push_flex`
- ขอข้อมูลระบบ → `get_message_quota`, `get_rich_menu_list`, `get_profile`
## ข้อควรระวัง
- Broadcast ส่งถึงผู้ติดตามทุกคน: ใช้เมื่อได้รับคำสั่งชัดเจนเท่านั้น
- Flex ผิดรูปแบบจะแสดงผลไม่ได้: ยึด `bubble`/`carousel` และโครงสร้าง LINE Flex มาตรฐาน
- อย่าเดา `userId`: ถ้าไม่ระบุ ให้ใช้ปลายทางเริ่มต้นของระบบเท่านั้น
- หาก `filePath` มีข้อมูล แต่ไม่เกี่ยวข้องกับงาน ให้ละเว้น
## สรุปการเติมอาร์กิวเมนต์ที่ต้องมี (โดยย่อ)
- push_text: `text`
- push_flex: `altText`, `contents`
- broadcast_text: `text`
- broadcast_flex: `altText`, `contents`
- get_profile: `userId?` (ไม่ใส่ได้ ใช้ค่าเริ่มต้น)
- get_rich_menu_list: ไม่มีอาร์กิวเมนต์
- get_message_quota: ไม่มีอาร์กิวเมนต์
เมื่อผู้ใช้สั่งงาน ให้เลือกเพียงหนึ่งแอคชันด้านบน และเติมอาร์กิวเมนต์ให้ครบตามชนิดงานนั้น ๆ เท่านั้น