ابزار MCP طرحواره (Schema) خود را تغییر داد. عامل (Agent) شما متوجه نشد.

فراخوانی ابزار شما با خطا مواجه نشد. کد وضعیت ۲۰۰ و یک JSON معتبر را بازگرداند.

اما بر اساس قرارداد اشتباه اجرا شد. سرور بالادستی سه روز پیش نام یکی از فیلدها را تغییر داد. عامل شما همچنان نام قدیمی را ارسال می‌کرد. سرور بی‌صدا آن را نادیده گرفت. نتیجه خالی بازگشت. هیچ خطایی ظاهر نشد. هیچ‌کس تا یک هفته متوجه نشد.

این یک «شکست خاموش» است. از آن نوع خطاهای پر سر و صدایی نیست که لاگ‌ها را قرمز کند. از آن نوعی است که سرور با لبخند پاسخ می‌دهد، اما داده‌ها اشتباه هستند.

سرورهای MCP می‌توانند قرارداد یک ابزار را بین فراخوانی‌ها تغییر دهند. آن‌ها می‌توانند نام یک پارامتر را تغییر دهند یا توضیحات یک فیلد را عوض کنند. این تغییرات اغلب از نظر ساختاری معتبر باقی می‌مانند. اعتبارسنجی JSON با موفقیت انجام می‌شود. سرور پاسخ ۲۰۰ می‌دهد. عامل شما بدون حتی یک خطا، بر اساس داده‌های اشتباه عمل می‌کند.

راه حل ساده است: • هش SHA-256 هر قرارداد ابزار را ثابت (Pin) کنید. • هم طرحواره (schema) و هم توضیحات را در آن هش لحاظ کنید. • قبل از هر فراخوانی، هش را بررسی کنید. • اگر قرارداد دچار انحراف شد، فراخوانی را متوقف کنید.

ما تمرکزمان بر این است که آیا ابزار پاسخ می‌دهد یا خیر. ما کدهای وضعیت را بررسی می‌کنیم. ما زمان‌های انتظار (timeouts) را تنظیم می‌کنیم. ما در خطاهای 5xx دوباره تلاش می‌کنیم. تقریباً هیچ‌کس بررسی نمی‌کند که آیا قرارداد بین لحظه‌ای که عامل طرحواره را یاد گرفته و لحظه‌ای که فراخوانی را انجام داده، تغییر کرده است یا خیر.

یک سرور MCP ابزارها را از طریق tools/list ارائه می‌دهد. هر ابزار دارای یک inputSchema و یک توضیحات (description) است. عامل شما این موارد را یک بار در شروع یک نشست (session) می‌خواند.

اگر سرور به‌روزرسانی شود، می‌تواند:

  • نام یک پارامتر را تغییر دهد (مثلاً از query به q) در حالی که ویژگی‌های اضافی را باز می‌گذارد. پارامتر قدیمی بی‌صدا نادیده گرفته می‌شود.
  • معنای یک فیلد را تغییر دهد. مثلاً یک محدودیت ممکن است از "max results" به "page index" تغییر کند. نوع داده همچنان عدد صحیح (integer) باقی می‌ماند، بنابراین اعتبارسنجی با موفقیت انجام می‌شود.
  • یک enum را محدودتر کند. یک مقدار معتبر ممکن است به یک مقدار پیش‌فرض جدید تبدیل (coerce) شود.

مشخصات MCP می‌گوید که سرور «باید» (SHOULD) در صورت تغییر لیست، به کلاینت اطلاع دهد. اما نمی‌گوید که «الزام دارد» (MUST). بسیاری از سرورها این اعلان را ارسال نمی‌کنند. حتی اگر ارسال کنند، ممکن است به شما نگویند که طرحواره یک ابزار خاص تغییر کرده است.

تکیه بر اعتبارسنجی ساختاری را متوقف کنید. این روش نمی‌تواند تغییر در معنا را تشخیص دهد.

با ابزارهای MCP خود مانند وابستگی‌های نرم‌افزاری (software dependencies) رفتار کنید. از رویکرد فایل قفل (lockfile) استفاده کنید. در اولین تماس، یک هش SHA-256 از طرحواره و توضیحات ابزار بگیرید. قبل از هر فراخوانی، هش را دوباره محاسبه کنید. اگر مطابقت داشتند، ادامه دهید. اگر مطابقت نداشتند، انحراف را علامت‌گذاری کرده و متوقف شوید.

راز کار در هش کردن توضیحات است. اگر پارامتری از "max results" به "page index" تغییر کند، طرحواره همان به نظر می‌رسد. اما چون کلمات تغییر کرده‌اند، هش تغییر می‌کند. این کار انحراف معنایی (semantic drift) را که اعتبارسنجی از آن غافل می‌ماند، شکار می‌کند.

وقتی قراردادی دچار انحراف می‌شود، حدس نزنید. کورکورانه دوباره تلاش نکنید. مکث کنید، تفاوت را لاگ کنید و قرارداد را اصلاح کنید.

Source: https://dev.to/0012303/the-mcp-tool-your-agent-calls-changed-its-schema-it-didnt-notice-5g6m

Optional learning community: https://t.me/GyaanSetuAi