ข้าม​ไป​ยัง​เนื้อหา

เมื่อไร​ควร (และ​ไม่​ควร) ทำ MCP server

เจ็ด​บท​ที่​ผ่าน​มา​คอร์ส​นี้​ขาย MCP ให้​คุณ — วิธี​ออกแบบ primitive, tool เป็น ACL, server surface เป็น​ภาษา​ที่​เผยแพร่, ความ​ปลอดภัย​เป็น​สถาปัตยกรรม บท​สุดท้าย​นี้​ทำ​สิ่ง​ที่​คอร์ส​ซื่อสัตย์​ต้อง​ทำ: บอกว่า​เมื่อไร​อย่า​เพิ่ง​ทำ เพราะ MCP เป็น​มาตรฐาน​ที่​ทรง​พลัง​ก็​จริง แต่​มัน​เป็น​เครื่องมือ​เฉพาะ​ทาง ไม่ใช่​ค้อน​ที่​ตอก​ได้​ทุก​ตะปู (การ​หยิบ MCP มา​ตอก​ทุก​โจทย์​คือ antipattern แบบ golden hammer ชัดๆ) การ​รู้​ว่า​เมื่อไร ไม่ ควรใช้มันสำคัญพอๆ กับ​การ​รู้​ว่า​จะ​ออกแบบ​มัน​ยังไง

📦 code ตัวอย่าง (กำลัง​จัด​ทำ)

บท​นี้​ต่อยอด​จาก domain เดิม​ที่ repo kaen-food-ordering (กำลัง​จัด​ทำ) — code ใน​บท​เป็น ภาพร่าง ของโทโพโล​ยี​และ decision rubric ไม่ใช่ server ที่​รัน​ได้​จริง เรา​จะ​เทียบ​สอง​ทาง​เลือก​บน​โจทย์​เดิม: ops-copilot ที่​เรียก​ไม่​กี่ endpoint ภายใน​แบบ​ตายตัว จะ​คุ้ม​กับ​การ​ยก MCP stack ทั้ง​ชุด​มา​ไหม หรือ function-calling agent ตรงๆ ชนะ

MCPModel Context Protocol (MCP)มาตรฐาน​เปิด​ที่​นิยาม​วิธี​ให้ app AI เชื่อม​ต่อ​กับ​เครื่องมือ​และ​ระบบ​ภายนอก​อย่าง​เป็น​ระบบ​เดียวกัน แทน​การ​เขียน​สาย​เชื่อม​เฉพาะ​กิจ​ที​ละ​คู่ — Anthropic เป็น​ผู้​เปิด​ตัว (พ.ย. 2024) แล้ว​บริจาค​ให้ Agentic AI Foundation (AAIF) ภาย​ใต้ Linux Foundation ดูแล​ต่อ (9 ธ.ค. 2025) ปัจจุบัน​จึง​เป็น​มาตรฐาน​ที่​เป็นกลาง​ทาง​ค่าย ไม่ใช่ 'โพรโทคอล​ของ Anthropic' อีก​ต่อ​ไป — spec ฉบับ​ปัจจุบัน​คือ 2025-11-25Strategic Design ออกแบบ​มา​สำหรับ​สถานการณ์​ที่ agent ต้อง ค้นหา (discover) และ​เลือก​เครื่องมือ​เอง​แบบ runtime ข้าม host และ server หลาย​ตัว​ที่​พูด​มาตรฐาน​เดียวกัน จุด​แข็ง​ทั้งหมด​ของ​มัน — capability negotiation, tools/list, การ​สลับ server ได้​โดย​ไม่​แก้ host — จะ​กลาย​เป็น​น้ำหนัก​ส่วนเกิน​ทันที​เมื่อ​โจทย์​ไม่​ต้องการ​ความ​ยืดหยุ่น​นั้น สี่​กรณี​ที่​วงการ​ภาค​ปฏิบัติ​เห็น​ตรง​กัน​ว่า MCP มัก เป็น​เครื่องมือ​ผิด:

  • Integration ตายตัว​จุด​เดียว — ถ้า​คุณ​ต่อ​กับ​ปลายทาง​ที่​รู้จัก​ไม่​กี่​จุด​และ​จะ​ไม่​เปลี่ยน การ​เรียก REST ตรงๆ ชัด​กว่า ไม่​ต้อง​มี discovery layer ให้​เปลือง
  • Pipeline A→B→C ที่ deterministic — ถ้า​ลำดับ​ขั้น​ตายตัว รู้​ล่วงหน้า​ครบ ไม่มี​การ​ตัดสิน​ใจ​ตอน runtime ว่า​จะ​เรียก​อะไร​ต่อ นั่น​คือ orchestration ธรรมดา ไม่ใช่​งาน​ที่​ต้อง​ให้ model เลือก tool เอง
  • Batch throughput สูง — งาน​อย่าง sync 50,000 records ต้องการ throughput และ​ความ deterministic ไม่ใช่​การ​ค้นหา tool แบบ runtime การ​ยัด​มัน​ผ่าน​ชั้น JSON-RPC + session ของ MCP มี​แต่​เพิ่ม overhead กับ latency
  • Deploy ที่​ไม่มี MCP-aware client — ถ้า​ไม่มี host ที่​พูด MCP มา​เรียก​ใช้ (เช่น​เป็น service ให้​ระบบ backend อื่น​เรียก) การ​เปิด​เป็น MCP server ก็​เปิด​ไป​ให้​ไม่มี​ใคร​ใช้ — REST endpoint หรือ library function ตรง​ประเด็น​กว่า

ใน​ทั้ง​สี่​กรณี REST/function-call ตรงๆ ง่าย​กว่า เร็ว​กว่า และ​รักษา​ความ​ปลอดภัย​กับ debug ได้​ง่าย​กว่า เพราะ​มัน​ไม่มี​ชิ้น​ส่วน​เคลื่อนไหว​ที่ MCP บังคับ​ให้​มี

flowchart TD
  START["จะตั้ง MCP server ไหม?"]
  Q1{"มี MCP-aware client<br/>มาเรียกใช้จริงไหม?"}
  Q2{"งานเป็น pipeline A→B→C<br/>ที่ลำดับตายตัวไหม?"}
  Q3{"เป็น integration จุดเดียว<br/>ปลายทางตายตัวไม่กี่จุดไหม?"}
  Q4{"เป็น batch throughput สูง<br/>เช่น sync 50k records ไหม?"}
  YES["ควรทำ MCP server<br/>agent ต้อง discover + เลือก tool เอง<br/>ข้าม host หลายตัวแบบ runtime"]
  NO["อย่าเพิ่งทำ MCP server<br/>REST/function-call ตรง ๆ<br/>ง่าย เร็ว และปลอดภัยกว่า"]
  START --> Q1
  Q1 -->|"ไม่มี"| NO
  Q1 -->|"มี"| Q2
  Q2 -->|"ใช่ ตายตัว"| NO
  Q2 -->|"ไม่ ต้องตัดสินใจตอน runtime"| Q3
  Q3 -->|"ใช่ จุดเดียว"| NO
  Q3 -->|"ไม่ หลากหลาย"| Q4
  Q4 -->|"ใช่ batch"| NO
  Q4 -->|"ไม่"| YES
  classDef no fill:#fecaca,stroke:#991b1b,color:#1a1a1f;
  classDef yes fill:#bbf7d0,stroke:#065f46,color:#1a1a1f;
  classDef q fill:#e0e7ff,stroke:#3730a3,color:#1a1a1f;
  class NO no;
  class YES yes;
  class Q1,Q2,Q3,Q4 q;

คำ​บรรยาย​ภาพ: ต้นไม้​ตัดสิน​ใจ “ควร​ตั้ง MCP server ไหม” — ทุก​ทาง​ที่​นำ​ไป​สู่ ตายตัว / batch / ไม่มี client วิ่ง​เข้า​ช่อง “อย่า​เพิ่ง​ทำ” (แดง) มี​เพียง​ทาง​เดียว​ที่​ไป​ถึง “ควร​ทำ” (เขียว) คือ​เมื่อ agent ต้อง​ค้นหา​และ​เลือก tool เอง​แบบ runtime โดย​มี MCP-aware client มา​เรียก​ใช้​จริง — สังเกต​ว่า​เงื่อนไข “ควร​ทำ” แคบกว่าที่​คอนเทนต์​ขาย MCP ส่วน​ใหญ่​ทำให้​เข้าใจ

การ​ตั้ง MCP server ใน​โปร​ดัก​ชัน​ไม่​ได้​ฟรี มัน​เพิ่ม พื้น​ผิว distributed-systems ที่ REST/function-call ใน​กระบวนการ​เดียว​ไม่มี: ตัว server เอง​ที่​ต้อง deploy/monitor, ชั้น registry/discovery (tools/list) ที่​ต้อง​ดูแล, และ​ชั้น auth ที่​ต้อง​จัดการ token กับ scope ทุก​ชิ้น​เป็น​ของ​ที่​ต้อง deploy ให้​ทำงาน ต้อง​เฝ้า​ดู​เมื่อ​พัง และ​ต้อง​รักษา​ความ​ปลอดภัย​เพิ่ม — ต้นทุน​ที่​คุ้ม​ก็​ต่อ​เมื่อ​คุณ​ได้​ความ​ยืดหยุ่น​ของ runtime discovery กลับ​มา​แลก​จริง

แต่​ต้นทุน​ที่​ลึก​กว่า​คือ ต้นทุน​ด้าน​ความ​ปลอดภัย และ​นี่​คือ​เหตุผล​ที่​ควร​ยับยั้ง​เป็น​พิเศษ ใน​บท​ที่ 6 เรา​พูด​ถึง Lethal TrifectaLethal Trifectaเงื่อนไข​สาม​อย่าง​ที่​พบ​พร้อม​กัน​แล้ว​อันตราย​ถึง​ขั้น​ข้อมูล​รั่วไหล: (1) เข้าถึง​ข้อมูล​ลับ/ส่วนตัว​ได้ (2) รับ​เนื้อหา​ที่​ควบคุม​ไม่​ได้​เข้า​มา (เสี่ยง prompt injection) และ (3) มี​ช่อง​ทาง​ส่ง​ข้อมูล​ออก​สู่​ภายนอก​ได้ — มี​ครบ​สาม​ข้อ​เมื่อไร agent ที่​ต่อ MCP Server หลาย​ตัว​ก็​เสี่ยง​ถูก​หลอก​ให้​ขโมย​ข้อมูล​ออก​ไป​เอง ทาง​แก้​คือ​ถอด​ขา​ใด​ขา​หนึ่ง​ออก​เสมอ แนวคิด​โดย Simon WillisonProcess — เงื่อนไข​สาม​อย่าง​ที่​พอ​อยู่​พร้อม​กัน​แล้ว agent ถูก​หลอก​ให้​ขโมย​ข้อมูล​ออก​ไป​เอง​ได้: (1) เข้าถึง​ข้อมูล​ลับ (2) รับ​เนื้อหา​ที่​ควบคุม​ไม่​ได้ และ (3) มี​ช่อง​ส่ง​ข้อมูล​ออก​ภายนอก การ​ประกอบ (composition) ทวีคูณ​พื้น​ผิว​การ​โจมตี​นี้​โดยตรง ยิ่ง​คุณ​เสียบ MCP server เข้า​กับ agent ตัว​เดียว​มาก​เท่าไร โอกาส​ที่​ครบ​สามขา​พร้อม​กัน​โดย​ไม่​ตั้งใจ​ก็​ยิ่ง​สูง — server ตัว​หนึ่ง​เปิด​ข้อมูล​ลับ อีก​ตัว​รับ input จาก​ภายนอก อีก​ตัว​มี​ช่อง​ส่ง​ออก การ​รวม​ทั้งหมด​เข้า​ด้วย​กัน​จึง​เป็นการ​ประกอบ trifecta ให้​ครบ​โดยที่​ไม่มี server ตัว​ไหน​ตั้งใจ Simon Willison สรุป​ทาง​แก้​ไว้​ตรง​ว่า “ทาง​เดียว​ที่​จะ​ปลอดภัย​คือ​เลี่ยง​การ​รวม lethal trifecta นี้​ให้​ครบ​ไป​เลย” (Willison, “The lethal trifecta”, มิ.ย. 2025) กรณี GitHub MCP server ที่​ถูก​ยึด​ผ่าน issue สาธารณะ​ที่​เป็น​อันตราย​เป็น​ตัวอย่าง​จริง​ว่าการ​ต่อ server เพิ่ม​โดย​ไม่​จำกัด​สิทธิ์​เปิด​ช่อง​โจมตี​เชิง​สถาปัตยกรรม​ได้​อย่างไร (Invariant Labs, “MCP GitHub vulnerability”) — “ไม่​ต่อ server ที่​ไม่​จำเป็น” จึง​เป็น​มาตรการ​ความ​ปลอดภัย ไม่ใช่​แค่​การ​ประหยัด overhead

กลับ​มา​ที่ ops-copilot สมมติ​มัน​ทำงาน​เดียว: รับ​หมายเลข​ออเดอร์ แล้ว เรียก3 endpoint ภายใน​ตาม​ลำดับ​ตายตัว​เสมอ — ดึง​ออเดอร์ → เช็ก​สถานะ​ครัว → แจ้ง​ลูกค้า ไม่มี​การ​ตัดสิน​ใจ​ตอน runtime ว่า​จะ​เรียก​อะไร​ต่อ ไม่มี tool ให้​เลือก ไม่มี​อะไร​ให้ discover นี่​คือ pipeline ตายตัวชัดๆ

ถ้า​ยก MCP stack ทั้ง​ชุด​มา​ห่อ​โจทย์​นี้ คุณ​จ่าย​ค่า server + registry + auth เต็ม​ราคา​เพื่อ​ความ​สามารถ (runtime discovery) ที่​ไม่​ได้​ใช้​เลย:

❌ version ดิบ: ยก MCP stack ทั้ง​ชุด​มา​เรียก 3 endpoint ตายตัว
ops-copilot
└─ MCP client ── JSON-RPC ── MCP server (ต้อง deploy + monitor)
├─ auth layer (ต้องดูแล token/scope)
├─ registry/discovery (tools/list)
└─ ห่อ endpoint: get_order → check_kitchen → notify
# ปลายทางตายตัว 3 จุด เรียงตายตัว → discovery ไม่ถูกใช้เลย
# แต่ต้องดูแล server + auth + registry เพิ่มมาเปล่า ๆ พร้อมพื้นผิวโจมตีที่โตขึ้น

เทียบ​กับ agent function-calling ธรรมดา​ที่​เรียก3 function ตรง​จาก​กระบวนการ​เดียว — ไม่มี server, registry หรือ auth layer แยก​ให้​ดูแล​หรือ​ให้​ใคร​โจมตี:

✅ function-calling agent ตรง ๆ: ไม่มี server ให้​ดูแล
ops-copilot (function-calling loop ในกระบวนการเดียว)
├─ get_order(orderId) → REST ภายใน
├─ check_kitchen(orderId) → REST ภายใน
└─ notify_customer(orderId) → REST ภายใน
# 3 function ตายตัว เรียกตรง ๆ
# ไม่มีชั้น distributed-systems เพิ่ม ไม่มี trifecta ให้ประกอบโดยไม่ตั้งใจ

หลัก​คิด​ง่ายๆ: ถ้า agent ไม่​ได้​ตัดสิน​ใจ​เอง​ว่า​จะ​เรียก​อะไร​ตอน runtime และ​ไม่มี MCP-aware client มา​ใช้​ประโยชน์​จาก discovery การ​ตั้ง MCP server ก็​เพิ่ม​ชิ้น​ส่วน​ที่​ต้อง​ดูแล​และ​พื้น​ผิว​โจมตี โดย​ไม่​ได้​อะไร​กลับ​มา​แลก — function-calling agent ตรงๆ อาจ​เป็น​คำ​ตอบ​ที่​ดี​กว่า แต่​ถ้า​ถ้า​วัน1 copilot ต้อง​เลือก​จาก​เครื่องมือ​หลาย​สิบ​ตัว​แบบ dynamic หรือ​ถูก​เรียก​จาก​หลาย host ที่​พูด MCP สมการ​ก็​พลิก​กลับ​ไป​ฝั่ง MCP ทันที

ต้อง​พูด​ให้​ชัด: ไม่มี​เอกสาร spec หรือ​ประกาศ​ทางการ​ของ MCP ที่​ระบุ “เมื่อไร​ไม่​ควร​ใช้ MCP” คำ​แนะนำ​ทั้ง​บท​นี้​เป็น ความเห็น​ภาค​ปฏิบัติ (practitioner consensus) ที่​สังเคราะห์​จาก​การ​เปรียบเทียบ MCP-vs-API หลาย​แหล่ง​ของ​ทั้ง​ผู้​ให้​บริการ​และ​นัก​พัฒนา​อิสระ​ใน​ช่วง​ปี 2025–2026 ประกอบ​กับ​หลัก​ความ​ปลอดภัย​เรื่อง lethal trifecta ไม่ใช่​ถ้อยคำ normative จาก spec ฉบับ 2025-11-25 และ​ไม่ใช่​คำ​สั่ง​ระดับ MUST จาก​ใคร

การ​ระบุ​ขอบเขต​ของ​ตัวเอง​แบบ​นี้​ไม่​ได้​ทำให้​คอร์ส​อ่อน​ลง — มัน​ทำให้ น่า​เชื่อถือ​ขึ้น คอร์ส​ที่​กล้า​บอกว่า “ตรง​นี้​เป็น​วิจารณญาณ​เชิง​วิศวกรรม ไม่ใช่​กฎ​ที่​เขียน​ไว้​ใน spec” คือ​คอร์ส​ที่​คุณ​เชื่อ​ได้​ว่า​จะ​ไม่​พอง​ข้อ​อ้าง​ส่วน​อื่น​เกิน​จริง เอา​ความเห็น​นี้​ไป​ชั่ง​กับ​บริบท​ของ​คุณ​เอง อย่า​รับ​มา​เป็น​กฎ​ตายตัว — ซึ่ง​ย้อน​แย้ง​กันเอง​พอดี​ถ้า​เรา​จะ​ให้​คุณ​ท่อง “ห้าม​ใช้ MCP กับ pipeline ตายตัว” แบบ doctrine

แปดบท​นี้​ไม่ใช่​ทัวร์ SDK แต่​เป็น​คอร์ส​เรื่อง วิจารณญาณ: ใคร​ควบคุม primitive ไหน (model/app/ผู้​ใช้), tool ใน​ฐานะ ACL และ​ภาษา​ที่​เผยแพร่​ของ bounded context, ความ​ปลอดภัย​ใน​ฐานะ​สมบัติ​เชิง​สถาปัตยกรรม (lethal trifecta, คำ​อธิบาย​ที่​ไม่​ควร​เชื่อ​โดย​ปริยาย, sandbox ที่​จำกัด​ความ​เสียหาย​ไม่ใช่​ป้องกัน) และ​บท​สุดท้าย​นี้ — วินัย​ที่​จะ ไม่ หยิบ MCP มา​ใช้​เมื่อ​ไม่​จำเป็น ทั้ง​สาม​ความคิด​นี้​อยู่​ยง​ข้าม​ทุก​การ​เปลี่ยน version ของ spec ต่าง​จาก​รายละเอียด​สายส่ง/session ที่​กำลัง​ขยับ ถ้า​คุณ​จำ​ได้​อย่าง​เดียว​จาก​คอร์ส​นี้ ขอ​ให้​เป็น​ข้อ​นี้: server surface ที่​ดี​คือ​ภาษา​ที่​เผยแพร่​ของ bounded context, tool ทุก​ตัว​คือ ACL และ​ความ​ปลอดภัย​ที่​ดี​ที่สุด​คือ​การ​ไม่​ประกอบ lethal trifecta ให้​ครบ​ตั้งแต่​แรก — และ​บาง​ครั้ง​วิธี​ที่​ดี​ที่สุด​ใน​การ​รักษา​สิ่ง​เหล่า​นั้น​คือ​ไม่​ตั้ง MCP server เลย


🔗 แหล่ง​อ้างอิง​หลัก​ของ​บท​นี้

บท​นี้​พึ่ง​แหล่ง ทุติย​ภูมิ/สังเคราะห์ เป็น​หลัก และระบุไว้ตรงๆ ว่า​เป็น​ความเห็น​ภาค​ปฏิบัติ ไม่ใช่ spec doctrine (ยัง​ไม่มี​การ์ด DevIQ สำหรับ​หัวข้อ MCP โดย​เฉพาะ):

  • Willison, “The lethal trifecta” (มิ.ย. 2025) — เหตุผล​ด้าน​ความ​ปลอดภัย​ที่​ให้​ยับยั้ง​การ​ประกอบ server หลาย​ตัว
  • Invariant Labs, “MCP GitHub vulnerability” — กรณี​จริง​ที่​การ​ต่อ server โดย​ไม่​จำกัด​สิทธิ์​เปิด​ช่อง​โจมตี​เชิง​สถาปัตยกรรม
  • การ​เปรียบเทียบ MCP-vs-API ของ​ผู้​ปฏิบัติ​หลาย​แหล่ง (2025–2026) — ที่มา​ของ “สี่​กรณี​ที่ MCP เป็น​เครื่องมือ​ผิด” ใน​ฐานะ practitioner consensus ไม่ใช่​ถ้อยคำ​จาก spec

เช็กความเข้าใจ — บทที่ 8

ข้อ 1 / 3

กรณีใดต่อไปนี้ที่ MCP มักเป็นเครื่องมือผิด และควรใช้ REST/function-call ตรงๆ แทน?