ข้ามไปเนื้อหาหลัก

MCP Schema ปมค่าเริ่มต้น Annotation: เมื่อไม่ใส่เท่ากับ True

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

เรียบเรียงโดย AI
Inewgen
12 Sep 2026ที่มา: Dev.to3 นาทีอ่าน (0 ครั้ง)
แชร์
MCP Schema ปมค่าเริ่มต้น Annotation: เมื่อไม่ใส่เท่ากับ True

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ขนาดตัวอักษร
  • มาตรฐาน MCP กำหนดค่าเริ่มต้นของ ToolAnnotations เมื่อไม่ได้ระบุ
  • การละเว้นค่า destructiveHint ถูกตีความตามสเปกว่าเป็น true
  • สเปกเตือนไคลเอนต์ไม่ให้ตัดสินใจสำคัญจาก ToolAnnotations
  • การตรวจสอบซอร์สโค้ดเผยให้เห็นความท้าทายในการนับค่าแอตทริบิวต์

ในโลกของการพัฒนาแอปพลิเคชันปัญญาประดิษฐ์ มาตรฐาน Model Context Protocol (MCP) ได้กำหนดโครงสร้างการทำงานที่ซับซ้อน โดยเฉพาะเรื่องการจัดการเครื่องมือผ่านแอนโนเทชัน (Annotations) ที่นักพัฒนาต้องเผชิญกับกฎเกณฑ์ของค่าเริ่มต้น ซึ่งเมื่อเครื่องมือใดไม่ได้ระบุค่าแอตทริบิวต์ไว้อย่างชัดเจน ระบบไม่ได้หมายความว่าละเลย แต่สเปกกลับกำหนดความหมายในตัว

จากประสบการณ์ของ Eugeniya Ivanova ที่ได้เผยแพร่บทความเมื่อวันที่ 7 กันยายน 2026 เกี่ยวกับการนำ MCP server ผ่านกระบวนการตรวจสอบของแอป ChatGPT พบว่าเครื่องมือแบบ read-only จำนวน 4 ตัวไม่มีการระบุค่า destructiveHint แม้สเปกจะอนุญาตให้ทำได้ แต่เครื่องมือสแกนกลับต้องการให้ระบุ เธอจึงต้องเพิ่มค่า destructiveHint: false พร้อมคำอธิบายประกอบกว่าสี่สิบรายการ โดยที่ตัวเครื่องมือไม่ได้ถูกเปลี่ยนแปลงโค้ดภายในเลยแม้แต่น้อย

programming code laptop workspace

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ในทางกลับกัน Himanshu Kumar ได้ทำการตรวจสอบเซิร์ฟเวอร์ที่ใช้งานจริงเมื่อวันที่ 30 สิงหาคม 2026 พบว่ามีเครื่องมือถึงหกตัวที่ไม่ประกาศแอตทริบิวต์ใดๆ เลย ซึ่งสะท้อนให้เห็นถึงช่องว่างระหว่างสเปกที่กำหนดไว้กับความเป็นจริงในการใช้งานของนักพัฒนา

ไม่อยากพลาดข่าวใหม่?

สมัครรับสรุปข่าวสารใหม่ทางอีเมล ไม่บ่อยจนรำคาญ

โฆษณา

13เครื่องมือของ Graphiti ที่ใช้ @mcp.tool() แบบไม่ประกาศแอตทริบิวต์
4ฟิลด์บูลีนใน ToolAnnotations ที่มีค่าเริ่มต้นกำหนดไว้

โครงสร้างของ 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

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้