MCP Schema ปมค่าเริ่มต้น Annotation: เมื่อไม่ใส่เท่ากับ True
เจาะลึกสเปก Model Context Protocol เมื่อเครื่องมือไม่ประกาศค่า destructiveHint ตามมาตรฐานจะถูกตีความว่าเป็นจริงทันที

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- มาตรฐาน MCP กำหนดค่าเริ่มต้นของ ToolAnnotations เมื่อไม่ได้ระบุ
- การละเว้นค่า destructiveHint ถูกตีความตามสเปกว่าเป็น true
- สเปกเตือนไคลเอนต์ไม่ให้ตัดสินใจสำคัญจาก ToolAnnotations
- การตรวจสอบซอร์สโค้ดเผยให้เห็นความท้าทายในการนับค่าแอตทริบิวต์
ในโลกของการพัฒนาแอปพลิเคชันปัญญาประดิษฐ์ มาตรฐาน Model Context Protocol (MCP) ได้กำหนดโครงสร้างการทำงานที่ซับซ้อน โดยเฉพาะเรื่องการจัดการเครื่องมือผ่านแอนโนเทชัน (Annotations) ที่นักพัฒนาต้องเผชิญกับกฎเกณฑ์ของค่าเริ่มต้น ซึ่งเมื่อเครื่องมือใดไม่ได้ระบุค่าแอตทริบิวต์ไว้อย่างชัดเจน ระบบไม่ได้หมายความว่าละเลย แต่สเปกกลับกำหนดความหมายในตัว
จากประสบการณ์ของ Eugeniya Ivanova ที่ได้เผยแพร่บทความเมื่อวันที่ 7 กันยายน 2026 เกี่ยวกับการนำ MCP server ผ่านกระบวนการตรวจสอบของแอป ChatGPT พบว่าเครื่องมือแบบ read-only จำนวน 4 ตัวไม่มีการระบุค่า destructiveHint แม้สเปกจะอนุญาตให้ทำได้ แต่เครื่องมือสแกนกลับต้องการให้ระบุ เธอจึงต้องเพิ่มค่า destructiveHint: false พร้อมคำอธิบายประกอบกว่าสี่สิบรายการ โดยที่ตัวเครื่องมือไม่ได้ถูกเปลี่ยนแปลงโค้ดภายในเลยแม้แต่น้อย

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ในทางกลับกัน Himanshu Kumar ได้ทำการตรวจสอบเซิร์ฟเวอร์ที่ใช้งานจริงเมื่อวันที่ 30 สิงหาคม 2026 พบว่ามีเครื่องมือถึงหกตัวที่ไม่ประกาศแอตทริบิวต์ใดๆ เลย ซึ่งสะท้อนให้เห็นถึงช่องว่างระหว่างสเปกที่กำหนดไว้กับความเป็นจริงในการใช้งานของนักพัฒนา
โครงสร้างของ ToolAnnotations ซึ่งประกาศไว้ที่บรรทัด 1912 ของสเปกตรโปสิเตอรี ประกอบด้วยฟิลด์บูลีน 4 ค่า โดยแต่ละค่าจะมีค่าเริ่มต้นและผลลัพธ์ที่ตามมาเมื่อฟิลด์นั้นขาดหายไป แต่สิ่งที่น่าสนใจคือข้อความเตือนที่ระบุไว้ก่อนหน้าในบรรทัด 1903 ถึง 1908 ซึ่งระบุว่าคุณสมบัติทั้งหมดใน ToolAnnotations เป็นเพียงคำแนะนำ (Hints) เท่านั้น และไคลเอนต์ไม่ควรตัดสินใจกระทำการใดๆ โดยอิงจากข้อมูลเหล่านี้หากมาจากเซิร์ฟเวอร์ที่ไม่น่าเชื่อถือ
"The server did not lie. It said nothing."
Himanshu Kumar
การวิเคราะห์ในเชิงลึกชี้ให้เห็นความขัดแย้งในตัวสเปก MCP ระหว่างฝั่งสเปกที่บังคับใช้ค่าเริ่มต้น (Default values) กับฝั่งข้อความเตือน (NOTE) ที่ห้ามไคลเอนต์เชื่อถือค่าเหล่านั้นในทางปฏิบัติ ยกตัวอย่างเช่น เซิร์ฟเวอร์หน่วยความจำที่มีเครื่องมือ save_memory แต่ไม่มีแอปพลิเคชันแอนโนเทชัน ไคลเอนต์ฝั่งหนึ่งอาจปฏิบัติตามค่าเริ่มต้นโดยถือว่าเป็นคำสั่งที่มีความเสี่ยงและทำลายข้อมูลได้ ขณะที่อีกไคลเอนต์อาจมองว่าเซิร์ฟเวอร์ไม่ได้ระบุอะไรจึงไม่ใช้กฎเกณฑ์ดังกล่าว ทั้งสองฝ่ายต่างตีความได้ถูกต้องตามหลักของตนเอง แต่สะท้อนปัญหาความกำกวมในสเปกที่นักพัฒนาต้องระมัดระวัง
นอกจากนี้ กฎในบรรทัด 1929 ยังระบุเพิ่มเติมว่า destructiveHint จะมีความหมายก็ต่อเมื่อ readOnlyHint มีค่าเป็น false เท่านั้น หากเครื่องมือประกาศ readOnlyHint เป็น true การละเว้น destructiveHintอาหารถือเป็นเรื่องปกติ แต่หากไม่มีการประกาศใดๆ เลย ค่า readOnlyHint จะตกลงสู่ค่าเริ่มต้นที่เป็น false ซึ่งจะส่งผลให้ destructiveHint ถูกบังคับใช้ค่าเริ่มต้นเป็น true ทันที
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น