เชื่อม Go Service เข้ากับ AI ด้วย MCP Adapter โดยไม่แก้ Domain
วิธีเพิ่ม Model Context Protocol (MCP) ให้บริการภาษา Go เวอร์ชัน v1.8.0 โดยไม่ต้องแก้ไขโค้ดการจัดการภายใน พร้อมตัวอย่างการทดสอบ CI

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- เพิ่มช่องทางเชื่อมต่อ Model Context Protocol (MCP) โดยไม่แตะต้องโค้ด Domain ภายใน
- ใช้ Official MCP Go SDK v1.8.0 สร้าง Adapter แยกต่างหาก
- จัดการข้อผิดพลาดให้โมเดล AI อ่านเข้าใจและแก้ไขตัวเองได้
- เขียนตรวจสอบ CI เพื่อป้องกันไม่ให้แพ็กเกจภายในนำเข้า SDK ภายนอก
เมื่อมีตั๋วงานเข้ามาว่า "ทำให้สั่งคืนเงินจากผู้ช่วย AI ได้" บริการคืนเงินของคุณอาจจะมีช่องทางใช้งานอยู่แล้วสองทาง เช่น ทีมสนับสนุนเรียกใช้ผ่าน POST /orders/{id}/refund และวิศวกรบนเวรเรียกใช้งานผ่านคำสั่งเทอร์มินัล แต่ตอนนี้เอเจนต์เขียนโค้ดหรือแชทไคลเอนต์ต้องการช่องทางที่สาม ซึ่งรองรับโปรโตคอล Model Context Protocol (MCP)
สถานการณ์นี้มักจะแบ่งออกเป็นสองแนวทาง ในแบบแรก ใครบางคนอาจจะเพิ่มแท็ก jsonschema ลงในโครงสร้างโดเมน ส่งค่าพอยเตอร์ *mcp.CallToolRequest เข้าไปยังชั้นบริการเพียงเพื่อเอาเมตาเดตาทั้งที่กฎการคืนเงินต้องนำเข้า SDK เพิ่ม ส่วนในแบบที่สอง คุณเขียนแพ็กเกจใหม่ขึ้นมาข้างๆ ตัวจัดการ HTTP และเมื่อรันคำสั่ง git diff --stat จะพบว่าไม่มีบรรทัดใดในโค้ดการผลิตภายใต้โฟลเดอร์ internal/domain และ internal/app ที่ถูกเปลี่ยนแปลงเลย

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
บทความนี้แสดงวิธีการสร้างแนวทางที่สองโดยใช้ Official MCP Go SDK ณ เวอร์ชัน v1.8.0 พร้อมทั้งตั้งค่าการตรวจสอบ CI ให้ล้มเหลวทันทีหากแพ็กเกจภายในมีการนำเข้า SDK ดังกล่าว โดยโดเมนจะรู้เพียงว่าการคืนเงินคืออะไรและอนุญาตให้ทำได้เมื่อไหร่ โดยมีการนำเข้าเฉพาะแพ็กเกจจัดการข้อผิดพลาด (errors) เท่านั้น
เซิร์ฟเวอร์ MCP จะทำหน้าที่เปิดเผยเครื่องมือต่างๆ ให้ไคลเอนต์เรียกใช้งาน โมเดลจะเลือกเครื่องมือที่เหมาะสมแล้วส่งคำขอมาพร้อมกับอาร์กิวเมนต์ JSON ใน Go SDK ฟังก์ชัน mcp.AddTool จะทำหน้าที่ลงทะเบียนตัวจัดการที่ระบุชนิดข้อมูลไว้แล้ว โดยเอกสารประกอบระบุว่าสีมาของข้อมูลนำเข้าจะถูกอนุมานจากชนิดข้อมูล In คำอธิบายดึงมาจากแท็กโครงสร้าง jsonschema และข้อมูลนำเข้าจะถูกตรวจสอบความถูกต้องก่อนที่ตัวจัดการจะทำงาน
สถาปัตยกรรมแบบ Hexagonal (Ports and Adapters) มีประโยชน์อย่างมากในสถานการณ์นี้ เพราะเมื่อมีโปรโตคอลใหม่เข้ามาอย่าง MCP ค่าใช้จ่ายในการพัฒนาจะเหลือเพียงการสร้าง Adapter ใหม่ตัวเดียว เนื่องจาก Use Case เดิมถูกออกแบบไว้ผ่าน Interface ที่ไม่รู้จัก HTTP อยู่แล้ว การออกแบบเช่นนี้ช่วยให้โค้ดมีความยืดหยุ่นและรองรับการขยายระบบในอนาคตได้ง่ายดาย
ในส่วนของการจัดการข้อผิดพลาด สเปกได้กำหนดความล้มเหลวไว้สองประเภท ได้แก่ ข้อผิดพลาดของโปรโตคอลที่เป็น JSON-RPC สำหรับเครื่องมือที่ไม่รู้จักหรือคำขอที่ผิดพลาด และข้อผิดพลาดในการรันเครื่องมือที่จะส่งผลลัพธ์กลับมาพร้อมสถานะ isError: true ซึ่งครอบคลุมถึงข้อผิดพลาดทางธุรกิจ เช่น "ทำการคืนเงินไปเรียบร้อยแล้ว" สเปกแนะนำว่าไคลเอนต์ควรส่งข้อผิดพลาดเหล่านี้ต่อไปยังโมเดลเพื่อให้มันสามารถแก้ไขตัวเองได้
"Refund must be between 1 cent and the amount paid"
บทความต้นฉบับ
ขั้นตอนสุดท้ายคือการสร้างการทดสอบเพื่อพิสูจน์ว่าโดเมนยังคงสะอาดบริสุทธิ์ คำสั่ง go list -deps จะช่วยเดินตรวจแพ็กเกจทั้งหมดที่ถูกเรียกใช้งาน เพื่อให้มั่นใจว่าไม่มีการพึ่งพาแพ็กเกจที่ไม่ควรมี และสามารถเขียนการทดสอบด้วย go list -json เพื่อตรวจสอบว่าโดเมนไม่มีการพึ่งพาภายนอกนอกเหนือจากไลบรารีมาตรฐานเลย
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น