اگر همین حالا در حال توسعهٔ سرورهای MCP هستید، باید بدانید که تمام زیرساختهای ارتباطی شما در حال تبدیل شدن به میراثی ناکارآمد است. در ۲۸ ژوئیه ۲۰۲۶، پروتکل زمینهٔ مدل (Model Context Protocol یا MCP) نسخهای را منتشر کرد که بزرگترین تغییر ساختاری از زمان عرضهٔ این پروتکل است. این نسخه با شناسهی ۲۰۲۶-۰۷-۲۸ عرضه شده و یک گسست کامل در سازگاری لایهی انتقال (Wire Compatibility) ایجاد کرده است.
این تحول با حذف کامل «جلسات» (Sessions) و فرآیند «دستدهی» (Handshake) صورت گرفته است تا کل اکوسیستم به سمت یک معماری بدون وضعیت (Stateless) — شبیه به وبسایتهایی که هر درخواست کاربر را مستقل از درخواست قبلی میبینند و نیازی به شناسایی دائمی ندارند — حرکت کند. طبق اعلام توسعهدهندگان، این تصمیم برای حل مشکل «مسیریابی چسبنده» (Sticky Routing) و هزینههای بالای حفظ اتصالات دائمی اتخاذ شده است. برای ماهها، تیمهای توسعه مجبور بودند هزینههای گزافی را برای حل مشکلاتی در سیستمهای توزیعشده بپردازند که خودِ پروتکل ایجاد کرده بود. با حذف طول عمر جلسه، MCP اکنون اجازه میدهد درخواستها روی هر نمونهٔ سرور در دسترس فرود بیایند، بدون اینکه ترافیک به یک پردازش خاص گره بخورد. همانطور که در تحلیلهای قبلی ما دربارهی بهینهسازی زیرساختهای عاملمحور اشاره کردیم، حذف وابستگی به وضعیت (State)، کلید اصلی برای مقیاسپذیری در ابعاد سازمانی است. این تغییرات بخشی از یک تحول گستردهتر است که در مسیر ارتقای مقیاسپذیری و امنیت عاملهای AI نقش کلیدی ایفا میکند.
مرگ وضعیت و ظهور MRTR
در معماری جدید، سرورها دیگر نمیتوانند بهطور مستقل درخواستی را به کلاینت ارسال کنند. الگوهای قدیمی مانند نمونهبرداری (Sampling) یا استخراج اطلاعات (Elicitation) اکنون از بین رفتهاند. به جای این الگوها، MCP مکانیزم درخواستهای چند-سفره (Multi Round-Trip Requests یا MRTR) را معرفی کرده است که در مستند SEP-2322 تعریف شده است.
بر اساس این استاندارد، وقتی سرور به اطلاعات بیشتری نیاز دارد، پاسخی با نوع resultType: "input_required" و یک بلوک داده به نام requestState برمیگرداند. کلاینت باید درخواست اصلی را همراه با پاسخهای جدید و همان بلوک وضعیت، دقیقاً بایتبهبایت بازپس بفرستد. این تلاش مجدد (Retry) از یک شناسه (ID) جدید در JSON-RPC استفاده میکند، زیرا مشخصات پروتکل، این تلاش مجدد را به عنوان یک درخواست مستقل در نظر میگیرد.
برای پیادهسازی MRTR، شش قانون سختگیرانه تعریف شده است:
- استفاده از
InputRequiredResultفقط برای فراخوانی ابزارها (tools/call)، دریافت پرامپتها (prompts/get) و خواندن منابع (resources/read) مجاز است. - کلاینتها حق ندارند محتوای
requestStateرا بازرسی، تحلیل یا تغییر دهند. - سرورها نباید نوع
inputRequestای را ارسال کنند که کلاینت در آن درخواست خاص اعلام نکرده است. - سرورها نباید فرض کنند که کلاینت حتماً درخواست را تکمیل میکند؛ بنابراین هر تبادل داده باید دارای زمانبندی انقضا (Timeout) باشد.
inputRequestsوrequestStateفقط برای تلاش مجدد همان یک درخواست معتبرند و به درخواستهای موازی تسری نمییابند.- ارسال
inputRequestsاختیاری است؛ سروری که تحت فشار است میتواند برای کاهش بار (Load Shedding)، فقطrequestStateرا برگرداند.
۲۰ تغییر بنیادین و ناسازگاری کامل
به گزارش تحلیل فنی dev.to، این بهروزرسانی باعث ایجاد یک شکاف کامل در سازگاری شده است؛ یعنی کلاینتهای مدرن نمیتوانند با سرورهای قدیمی و بالعکس ارتباط برقرار کنند. هیچ مکانیزمی برای ارتباط رو به جلو یا عقب وجود ندارد.
مهمترین تغییرات و حذفها عبارتند از:
- حذف جلسات و دستدهی: فراخوانی
initialize، اعلانnotifications/initializedو هدرMcp-Session-Idکاملاً حذف شدند. هر سروری که وضعیت را بر اساس جلسه ذخیره میکرد، اکنون بهطور کامل از کار میافتد. - تغییرات لایه انتقال: استریمهای GET SSE و قابلیت بازیابی از طریق
Last-Event-IDحذف شدند. سرورهایی که فقط از نسخه مدرن پشتیبانی میکنند، باید به درخواستهای GET و DELETE خطای ۴۰۵ برگردانند. - حذف متدهای هسته: متدهایی مانند
ping،logging/setLevel،notifications/message،resources/subscribeوresources/unsubscribeدیگر وجود ندارند. - API وظایف (Tasks): API آزمایشی Tasks به یک افزونه اختیاری (SEP-2663) منتقل شد و مکانیزم نظارت (Polling) آن بازطراحی شد. متدهای
tasks/listوtasks/resultحذف شدند. - کدهای خطا: کد خطای «منبع یافت نشد» از ۳۲۰۰۲- به ۳۲۶۰۲- تغییر یافت. کد ۳۲۰۴۲- (نیاز به استخراج URL) بازنشسته شد و کدهای جدید ۳۲۰۲۰- تا ۳۲۰۲۲- در یک بلوک رزرو شده معرفی شدند.
زیرساختهای اجباری جدید
برای جایگزینی فرآیند دستدهی، اکنون قابلیتها (Capabilities) باید در هر درخواست بهصورت مجزا درون یک پوشِ _meta اعلام شوند. این کار تضمین میکند که هر نمونه از سرور بتواند هر درخواست را بدون نیاز به زمینه قبلی مدیریت کند. سرورها اکنون باید متد server/discover را پیادهسازی کنند؛ کلاینتها میتوانند از این مرحله صرفنظر کرده و در عوض خطای احتمالی را مدیریت کنند.
همچنین سه هدر HTTP برای درخواستهای Streamable HTTP POST اجباری شدهاند:
۱. MCP-Protocol-Version: باید با نسخه بدنه درخواست مطابقت داشته باشد. این مورد از ۱۸ ژوئن ۲۰۲۵ الزامی شده بود.
۲. Mcp-Method: در تمام درخواستها الزامی است تا Load Balancerها بتوانند بدون تحلیل بدنه (Parsing)، ترافیک را مسیریابی کنند.
۳. Mcp-Name: در متدهای tools/call ،resources/read و prompts/get برای انتقال پارامترها الزامی است. افزونه Tasks این الزام را به tasks/get ،tasks/update و tasks/cancel اضافه کرده است تا درخواستها به نمونهای از سرور که وضعیت وظیفه (Task State) را در اختیار دارد، مسیریابی شوند.
ریسکهای امنیتی و کشینگ
در نسخه جدید، کشینگ (Caching) به یک قابلیت درجه اول تبدیل شده است. شش نوع نتیجه شامل server/discover ،tools/list ،prompts/list ،resources/list ،resources/templates/list و resources/read اکنون به فیلدهای ttlMs و cacheScope نیاز دارند.
اما این موضوع یک ریسک امنیتی جدی ایجاد میکند. اگر توسعهدهندهای یک نقطه اتصال احراز هویتشده را در cacheScope به صورت public علامت بزند، احتمال نشت دادهها بین کاربران مختلف (Cross-tenant leak) وجود دارد. مستندات صراحتاً هشدار میدهند که پاسخهای عمومی ممکن است بین فراخوانهای مختلف، حتی در نقاط اتصال احراز هویتشده، به اشتراک گذاشته شوند. علاوه بر این، نتایجی که از طریق تلاش مجدد MRTR تولید میشوند، هرگز نباید کش شوند.
سختگیرانهتر شدن احراز هویت
احراز هویت اکنون سختگیرانهتر شده است، هرچند پروتکل هنوز فاقد یک مدل جامع برای تعیین محدوده (Scope) هر ابزار است. کلاینتها باید اعتبارسنجی صادرکننده (Issuer Validation) را طبق استاندارد RFC 9207 روی تمام پاسخها، از جمله خطاها، انجام دهند. این مقایسه باید یک تطبیق دقیق رشتهای (Literal string match) باشد؛ یعنی هیچگونه تغییر در حروف بزرگ و کوچک در طرح (Scheme) یا میزبان، حذف پورت پیشفرض، مدیریت اسلش انتهایی (Trailing-slash) و یا نرمالسازی کدگذاری درصد (Percent-encoding) مجاز نیست.
برای ابزارهای دسکتاپ و CLI، مقدار application_type باید صراحتاً روی native تنظیم شود تا در زمان ثبت کلاینت پویا (DCR)، با Redirect URIهای محلی تداخل نداشته باشد (در غیر این صورت طبق OpenID Connect به صورت پیشفرض web در نظر گرفته میشود). همچنین DCR اکنون رسماً به نفع اسناد متادیتای شناسه کلاینت (CIMD) منسوخ شده است.
شکاف در مشاهدهپذیری و تأخیر
وضعیت مشاهدهپذیری (Observability) در این نسخه متناقض است. در حالی از یک سو استاندارد W3C برای انتشار زمینه ردیابی (Trace Context) استاندارد شده است (و مواردی مانند traceparent ،tracestate و baggage از پیشوندهای reverse-DNS معاف شدهاند)، اما از سوی دیگر الگوی MRTR اندازهگیری سنتی تأخیر را مختل کرده است.
چون هر تلاش مجدد یک ID جدید در JSON-RPC میگیرد، یک عملیات منطقی واحد اکنون به شکل چندین درخواست مجزا دیده میشود. این موضوع باعث افزایش کاذب تعداد فراخوانیها شده و زمانی را که یک انسان برای تصمیمگیری درباره یک پرامپت استخراجی صرف کرده است، پنهان میکند. در یک تحلیل مشاهده شد عملیاتی که ۶ ثانیه طول کشیده، در گزارشات به صورت دو فراخوانی با مجموع ۱ ثانیه ثبت شده است. اکنون پیوند بین این درخواستها باید از طریق بلوک requestState یا تطبیق مجموعههای کلیدی در inputResponses استنباط شود.
آمادگی SDKها و مسیر مهاجرت
کتابخانههای اصلی (Tier 1) برای TypeScript، Python، Go و C# به نسخه ۲.۰.۰ ارتقا یافتند. SDK تایپاسکریپت اکنون فقط ESM است، به Node 20 نیاز دارد و ساختار یکپارچه قبلی را به بستههای مجزای سرور و کلاینت تقسیم کرده است. برای مهاجرت، ابزار npx @modelcontextprotocol/codemod v1-to-v2 در دسترس است.
برای کسانی که سرور اجرا میکنند، امنترین مسیر پیادهسازی «دوران دوگانه» (Dual-era) است. این روش به سرور اجازه میدهد بر اساس اولین درخواست، دوران کلاینت را تشخیص دهد؛ درخواستهای مدرن از پوش _meta استفاده میکنند، در حالی که درخواستهای قدیمی از دستدهی initialize بهره میبرند. SDK نسخه ۲ پایتون این قابلیت را بهطور پیشفرض از طریق Server.run فراهم میکند.
موازنه زیرساخت در برابر تجربه
این بهروزرسانی یک پیروزی برای زیرساخت است اما در زمینه تجربه عاملها (Agent Experience) وضعیتی ایستا دارد. این نسخه مشکلاتی مانند «خصومت گیتوی» (Gateway Hostility) و «وابستگی به جلسه» (Session Affinity) را که مانع مقیاسپذیری سازمانی بود، حل کرده است.
با این حال، مشکلاتی مانند «مالیات زمینه» (Context Tax) یا تزریق پرامپت (Prompt Injection) همچنان حل نشدهاند. توصیفات ابزارها همچنان بدون امضا و تغییرپذیر هستند و هزینه توکن برای لیست کردن ابزارها بالا باقی مانده است. پروتکل در واقع یک خط قرمز کشیده است: مسائل زیرساختی در هسته (Core) مدیریت میشوند و مسائل مربوط به تجربه عاملها به لایه افزونهها (Extensions) منتقل شدهاند.
انتقاداتی که از سوی Microsoft Research و دیگران در مورد تداخل فضای ابزارها و کاهش عملکرد با رشد تعداد ابزارها مطرح شده بود، تا حد زیادی نادیده گرفته شده است، مگر در مورد ترتیب قطعی ابزارها (Deterministic Ordering) برای بهبود نرخ命中 (Hit rate) کشِ پرامپت.
تله مهلت ماه اوت
یک تناقض خطرناک درباره حذف HTTP+SSE وجود دارد. در حالی که وبلاگ رسمی از یک مهلت یکساله خبر میدهد، ثبت تغییرات رسمی و SEP-2596 به مهلتی سهماهه از ۱۸ مه ۲۰۲۶ اشاره دارند.
این یعنی انتقال به نسخه جدید تا ۱۸ اوت ۲۰۲۶ حیاتی بوده است. اگرچه هیچ «سقوط خودکار» در ماه اوت وجود ندارد — زیرا حذف نهایی نیاز به تصمیم نگهدارندگان هسته و انتشار یک نسخه جدید دارد — اما توسعهدهندگان دیگر نمیتوانند روی یک پنجره تضمینشده ۱۲ ماهه برای مهاجرت حساب کنند.
جزئیات فنی و موارد خاص
فراتر از تغییرات ساختاری، چندین مکانیزم خاص در نسخه ۲۰۲۶-۰۷-۲۸ وجود دارد که برای جلوگیری از شکستهای خاموش، نیاز به پیادهسازی دقیق دارند.
طرحواره ابزار و رویتپذیری (Tool Schema)
- JSON Schema 2020-12: این نسخه اکنون گویش پیشفرض است و از تمام مجموعه کلمات کلیدی پشتیبانی میکند. با این حال، حل ارجاعات شبکه (
$ref) بهطور پیشفرض ممنوع است. - تله
x-mcp-header: این حاشیهنویسی جدید به سرورها اجازه میدهد پارامترهای ابزار را برای مسیریابی گیتوی به هدرهای HTTP منتقل کنند. اگر سرور محدودیتهای سختگیرانه را رعایت نکند (مثلاً استفاده از عدد به جای عدد صحیح، یا استفاده ازoneOf/allOfدر مسیر)، کلاینت باید بدون دادن خطای JSON-RPC، آن ابزار را از لیستtools/listحذف کند. این موضوع میتواند باعث شود ابزارها در محیط تولید (HTTP) ناپدید شوند در حالی که در محیط توسعه (stdio) به درستی کار میکنند. - ترتیب قطعی: لیست ابزارها نباید برای هر اتصال متفاوت باشد و باید بهطور قطعی مرتب شوند تا نرخ命中 کشِ پرامپت بهبود یابد.
افزونه وظایف (SEP-2663)
- مدل نظارت (Polling): متد مسدودکننده
tasks/resultحذف شده است. کلاینتها اکنون ازtasks/getبرای نظارت بر نتایج استفاده میکنند و باید بهpollIntervalMsاحترام بگذارند. - پایداری: به دلیل حذف
tasks/list،شناسههای وظیفه (Task IDs) باید توسط کلاینت بهطور پایدار ذخیره شوند؛ در غیر این صورت در صورت گم شدن ID، وظیفه غیرقابل دسترس میشود. - وابستگی به وضعیت: برای تضمین صحت، متدهای
tasks/get،tasks/updateوtasks/cancelMcp-Nameرا رویtaskIdتنظیم کنند تا Load Balancerها بتوانند درخواست را به نمونهای که وضعیت وظیفه را دارد مسیریابی کنند.
نگاشت کدهای خطا
- بلاک رزرو شده: کدهای ۳۲۰۲۰- تا ۳۲۰۹۹- اکنون برای مشخصات پروتکل رزرو شدهاند. پیادهسازیها نباید کدهای تعریفنشده در این محدوده را ارسال کنند.
- محدوده میراث: محدوده ۳۲۰۰۰- تا ۳۲۰۱۹- میراث (Legacy) تلقی میشود. گیرندهها نباید معنای خاصی برای این کدها فرض کنند، به جز کد ۳۲۰۰۲- که بازنشسته شده است.
زمینه و حاکمیت (Governance)
این بازبینی پاسخ مستقیم به مجموعهای از انتقادات است که طی بیست ماه جمعآوری شده بود. نگهدارندگان پروتکل در دسامبر ۲۰۲۵ متوجه شدند که اتصالات وضعیتدار باعث مسیریابی «چسبنده» شده و مانع از مقیاسپذیری خودکار (Auto-scaling) موثر میشود.
کارنامه اصلاحات
- حل شده: وضعیتداری (Statefulness)، وابستگی به جلسه و خصومت گیتوی (از طریق هدرهای جدید و معماری بدون وضعیت).
- حل جزئی: قراردادهای سیستمهای توزیعشده (ردیابی اضافه شد، اما Idempotency و Deadlines غایب هستند) و بار DCR (منسوخ اعلام شد، اما CIMD پیش از این هم یک توصیه بود).
- بدون تغییر: تزریق پرامپت، «مالیات زمینه» (تورم توکنها) و فقدان یک مدل احراز هویت دانهریز (Granular).
عجایب حاکمیتی
- استثنای DCR: در حالی که سیاست جدید برای هر مورد منسوخشدن نیاز به یک SEP دارد، منسوخ شدن ثبت کلاینت پویا (DCR) در PR #2858 (یک سازماندهی مجدد مستندات) بدون SEP رسمی ثبت شد. این نشان میدهد برای تغییرات کوچک برچسبگونه، ممکن است هنوز از فرآیند رسمی عبور شود.
- سطحبندی SDKها: انطباق SDKها اکنون توسط SEP-1730 مدیریت میشود که تعهداتی را برای علامتگذاری موارد منسوخ و تستهای انطباق برای SDKهای سطح ۱ (Tier 1) تعریف میکند.
جزئیات تکمیلی پیادهسازی
انتقال و مسیریابی
- مسیریابی دوران HTTP: در حال حاضر، مسیریابی دوران بر اساس هدر است. طبقهبندی بر اساس بدنه (Body-primary) به عنوان یک گام بعدی علامتگذاری شده است.
- مدیریت ۴۰۴: یک متد RPC پیادهنشده، خطای HTTP 404 را همراه با کد JSON-RPC ۳۲۶۰۱- برمیگرداند. گیتویها نباید این را به عنوان شکست در لایه انتقال تلقی کرده یا Failover را فعال کنند.
- هدرهای Accept: کلاینتهای دستساز باید هدر
Acceptرا شامل هر دو مقدارapplication/jsonوtext/event-streamقرار دهند تا از انتخاب فرمت پاسخ توسط سرور پشتیبانی کنند.
پنجرههای منسوخشدن
- ساعت ۱۲ ماهه: موارد Roots، نمونهبرداری، لاگینگ و ثبت کلاینت پویا با حداقل پنجره ۱۲ ماهه منسوخ شدهاند.
- استثناهای امنیتی: سیاست رسمی منسوخشدن (SEP-2596) اجازه استثنای ۹۰ روزه برای حذفهای مرتبط با امنیت را میدهد.
- تعهدات SDK: SDKهای سطح ۱ اکنون موظفاند سطوح منسوخ شده را بهوضوح علامتگذاری کنند تا به توسعهدهندگان هشدار دهند.
محدودیتهای منابع و ابزارها
- اشتراک منابع:
resources/subscribeوresources/unsubscribeحذف شدند و باsubscriptions/listenبه همراه یک فیلتر اعلان صریح جایگزین شدند. - ثبات لیست ابزارها: لیست ابزارها نباید برای هر اتصال متفاوت باشد. سرورها دیگر نمیتوانند
tools/listرا برای هر جلسه شخصیسازی کنند؛ این کار باید بر اساس توکن (Token) انجام شود. - مرزهای ترکیب: در حالی که کلمات کلیدی JSON Schema 2020-12 مجاز هستند، کلمات کلیدی ترکیب (Composition) اکنون برای جلوگیری از حملات DoS به مرزهای منابع (Resource Bounds) نیاز دارند.
گام بعدی شما
- سرورهای خود را بر اساس چکلیست ۱۲ موردی جدید بازبینی کنید و متد
server/discoverرا پیادهسازی نمایید. برای ارزیابی دقیقتر، میتوانید از ابزار mcpscore برای سنجش کیفیت سرورها استفاده کنید تا نقاط ضعف پیادهسازی خود را شناسایی کنید. - اگر از SaaS چندمستاجری استفاده میکنید، فوراً
cacheScopeرا برای جلوگیری از نشت دادهها بررسی کنید. - در صورت استفاده از پلتفرمهای Serverless یا Edge، وابستگیهای Redis یا Durable Objects برای مدیریت جلسه را حذف کنید تا هزینه هر فراخوانی بهطور قابل توجهی کاهش یابد. به یاد داشته باشید که
requestStateاکنون یک ورودی تحت کنترل مهاجم است؛ سرورها باید اگر این داده بر احراز هویت یا منطق تجاری اثر میگذارد، از HMAC یا AEAD برای حفاظت از یکپارچگی آن استفاده کنند.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو