- MCP(Model Context Protocol) คือวิธีการเชื่อมต่อมาตรฐานที่ช่วยให้ LLM โต้ตอบกับโลกภายนอกได้
- ช่วงหลังมานี้มีมาตรฐานลักษณะใกล้เคียงกันอย่าง ACP ของ IBM และ A2A ของ Google ปรากฏขึ้น ทำให้การนำ MCP ไปใช้งานและเครื่องมือที่เกี่ยวข้องเพิ่มขึ้นอย่างรวดเร็ว
- อย่างไรก็ตาม มีการชี้ให้เห็นปัญหาเรื่อง ความสับสนในการออกแบบ เอกสารไม่เพียงพอ และการขาดสเปกโปรโตคอลที่ชัดเจนในทางปฏิบัติ ซึ่งสะท้อนถึงแนวปฏิบัติด้านวิศวกรรมที่ยังไม่สุกงอม
- วิธีการขนส่งที่เสนออยู่ในปัจจุบัน เช่น HTTP+SSE และ Streamable HTTP กลับเพิ่มทั้งความซับซ้อนและประเด็นด้านความปลอดภัย โดยมีการแนะนำให้ใช้ WebSocket เป็นทางเลือก
- โปรโตคอลล่าสุดยังเพิ่มความไม่สอดคล้องและความซับซ้อนเกินจำเป็นในเรื่อง การอนุญาตและการจัดการเซสชัน
ทบทวน MCP และแนวโน้มล่าสุด
- MCP เป็นโปรโตคอลเปิดที่สร้างขึ้นเพื่อทำให้วิธีที่แอปพลิเคชันมอบบริบทให้กับ โมเดลภาษาขนาดใหญ่ (LLM) เป็นมาตรฐานเดียวกัน
- ในช่วงหนึ่งเดือนที่ผ่านมา MCP ได้ก้าวขึ้นมาเป็นมาตรฐานสำคัญในการทำให้ LLM กลายเป็น เอเจนต์ และกำลังถูกนำไปใช้รวมถึงพัฒนาอิมพลีเมนเทชันอย่างรวดเร็ว
- มาตรฐานที่มีจุดประสงค์คล้ายกัน เช่น ACP ของ IBM หรือ A2A ของ Google ก็เกิดขึ้นอย่างรวดเร็วเช่นกัน
ปัญหาด้านแนวปฏิบัติทางวิศวกรรมและสเปกโปรโตคอล
- หลายจุดเผยให้เห็นว่าระดับของการอิมพลีเมนต์และการจัดทำเอกสารยังต่ำ
- บริษัทเทคโนโลยีขนาดใหญ่ลงทุนมหาศาลกับการฝึกโมเดล แต่ SDK และเอกสาร กลับมีคุณภาพต่ำจนสร้างความสับสนให้ผู้ใช้
- MCP ก็มีปัญหาคล้ายกัน โดยบางส่วนของการออกแบบไม่สมเหตุสมผล และยังขาดสเปก ตัวอย่าง และแนวทางปฏิบัติ
การอภิปรายเรื่องโปรโตคอลขนส่ง (Transport)
วิธีขนส่งแบบ stdio
- Stdio เป็นวิธีดั้งเดิมที่เชื่อม MCP server และ client ในเครื่องเดียวกันโดยตรงผ่าน pipe (
stdout, stdin)
- มีภาระเรื่องการจัดการ socket หรือปัญหาเฉพาะระบบปฏิบัติการน้อยกว่า และตั้งค่าสภาพแวดล้อมได้ เรียบง่าย ทั้งตัวแปรแวดล้อมและสตรีมอินพุต/เอาต์พุต
วิธี HTTP+SSE / Streamable HTTP
- ด้วยความตั้งใจที่จะรองรับโลกเว็บ จึงมีการนำวิธีแบบ HTTP+SSE และ Streamable HTTP มาใช้บนฐาน HTTP
- แต่แนวทางนี้ซึ่งตั้งใจจะมาแทน WebSocket กลับก่อให้เกิดความกำกวม ความสับสนเชิงออกแบบ และความซับซ้อนมากยิ่งขึ้น
- เซสชันและการเชื่อมต่อหนึ่งชุดสามารถถูกสร้างและปิดได้หลายรูปแบบ ส่งผลให้เกิด ภาระอย่างมาก ต่อการจัดการสถานะของเซิร์ฟเวอร์และด้านความปลอดภัย
ความยากลำบากจากกรณีตัวอย่างการอิมพลีเมนต์ MCP server/client
- ปัญหาการรองรับในหลายภาษาเด่นชัด เช่น การไม่มี Go SDK อย่างเป็นทางการ
- เอกสารและสเปกไม่ชัดเจนจนหลายกรณีต้องอิมพลีเมนต์ผ่านการ reverse engineering
- แม้เซิร์ฟเวอร์ตัวอย่างส่วนใหญ่จะอิงกับ Python, JavaScript แต่ก็ยากต่อการใช้ในสภาพแวดล้อมการทำงานจริงเพราะปัญหาเรื่อง dependency และ portability
- เมื่อต้องอิมพลีเมนต์เซิร์ฟเวอร์ SSE/Streamable HTTP พยายามทำตัวเสมือน socket แต่ในความเป็นจริงกลับรักษาเซสชันและสถานะการเชื่อมต่อให้คงเส้นคงวาได้ยาก และยังต้องมีโครงสร้างพื้นฐานแยกอย่าง message queue เพิ่มเติม
โครงสร้างและปัญหาของ HTTP+SSE และ Streamable HTTP
โหมด HTTP+SSE
- client จะเปิดเซสชัน SSE กับเซิร์ฟเวอร์ จากนั้นเมื่อส่งคำขอเขียนไปยัง endpoint แยก เซิร์ฟเวอร์จะตอบกลับด้วย 202 และส่งผลตอบกลับผ่านการเชื่อมต่อ SSE เดิม
- แม้จำเป็นต้องรักษาการเชื่อมต่อเซสชันและการซิงก์สถานะ แต่ขั้นตอนนี้กลับมีเอกสารไม่เพียงพอและมีความซับซ้อนในการปฏิบัติการสูงมาก
โหมด Streamable HTTP
- ทั้ง การสร้างเซสชัน การเปิด SSE และการส่งคำตอบกลับ ถูกปะปนกันหลายวิธี ทำให้ลำดับการทำงานของคำขอหนึ่งชุดจนถึงการตอบกลับไม่มีความสอดคล้อง
- การปะปนกันของการจัดการสถานะหลายแบบ รวมถึง endpoint และ header ที่หลากหลาย กลายเป็นอุปสรรคอย่างร้ายแรงต่อ การอิมพลีเมนต์จริงและความสามารถในการขยายระบบ
นัยทั่วไป
- เมื่อความซับซ้อนทางเทคนิคเพิ่มขึ้น ก็ทำให้ ภาระทางความคิดและการบำรุงรักษา ของนักพัฒนาเพิ่มขึ้น และก่อปัญหาเรื่อง ความเข้ากันไม่ได้และพฤติกรรมที่คาดเดาไม่ได้ ระหว่างการอิมพลีเมนต์ server/client ที่หลากหลาย
- เซิร์ฟเวอร์ต้องติดตามทุกสถานะและทุกสถานการณ์ของการเชื่อมต่อ และในสภาพแวดล้อมแบบกระจาย การขยายระบบอย่างมีประสิทธิภาพและการซิงก์สถานะยิ่งทำได้ยากขึ้น
นัยด้านความปลอดภัย
- วิธีการเชื่อมต่อและเซสชันที่ย่อยและหลากหลายเพิ่มความเสี่ยงของ ช่องโหว่ด้านการจัดการสถานะ เช่น session hijacking, replay attack และการปฏิเสธการให้บริการ (DoS)
- จุดเข้าสู่ระบบและวิธีตอบกลับที่หลากหลายยังขยายพื้นผิวการโจมตี และเอื้อให้ ซ่อนกิจกรรมที่เป็นอันตราย ไว้ในลำดับการทำงานที่ไม่ตั้งใจได้
ความสับสนของโปรโตคอลการจัดการสิทธิ์ (Authorization)
- สเปกปัจจุบันใช้กติกาที่ไม่สอดคล้องกัน เช่น บังคับใช้ OAuth2 เฉพาะเมื่อเป็น การขนส่งผ่าน HTTP แต่เมื่อเป็น การขนส่งผ่าน STDIO กลับปล่อยให้ใช้ตัวแปรแวดล้อมตามสะดวก
- จึงเกิดความสับสนและความไม่สมเหตุสมผล เช่น เหตุใดจึงบังคับให้เฉพาะการขนส่งผ่าน HTTP ต้องรองรับ OAuth2 ที่ซับซ้อน
ข้อเสนอแนะเพื่อการปรับปรุง
- ควรทำให้เหลือ โปรโตคอล JSON RPC เดียว และทำให้วิธีขนส่งเรียบง่ายโดยเน้นเพียง Stdio และ WebSocket เท่านั้น
- วิธีที่เหมาะสมคือแมปตัวแปรในสภาพแวดล้อม Stdio ไปเป็น header ในสภาพแวดล้อม HTTP และแมปอินพุต/เอาต์พุตไปเป็นสตรีมสองทิศทางของ WebSocket ตามลำดับ
- จะช่วยตัดความจำเป็นของการติดตามเซสชัน การจัดการสถานะ และการจัดการกรณียกเว้นจำนวนมากที่ไม่จำเป็น
- WebSocket ควรเป็นตัวเลือกมาตรฐานสำหรับการขนส่งทั้งหมดบนฐาน HTTP และยังช่วยแก้ปัญหาความซับซ้อนของการซิงก์สถานะได้ด้วย
เปรียบเทียบกับโปรโตคอลทางเลือกและแนวโน้มตลาด
- ACP ของ IBM และ A2A ของ Google มีการออกแบบ Transport ที่กระชับกว่าและมีความสามารถในการค้นหาเอเจนต์ในแง่ของการเชื่อมต่อระหว่างเอเจนต์
- แต่โดยแก่นแล้ว ส่วนใหญ่ยังเป็นเพียงระดับที่สามารถรวมเข้าเป็นเครื่องมือแยกภายในสภาพแวดล้อมการสร้าง MCP ได้
- การที่มีโปรโตคอลใหม่เกิดขึ้นอย่างต่อเนื่องมีความเสี่ยงที่จะนำไปสู่ ความกระจัดกระจายของมาตรฐาน ดังนั้นการให้ความสำคัญกับความเรียบง่ายของ Transport จึงสำคัญต่อการเติบโตของอุตสาหกรรม
1 ความคิดเห็น
ความเห็นจาก Hacker News
agents.jsonไว้ที่ web root แล้วให้เอเจนต์จัดการกันเองผ่านการสนทนาเชิงความหมาย สุดท้าย HTTP ก็จะกลายเป็นมาตรฐาน input/output ของเอเจนต์