MCP بیحالت شد: خداحافظی با handshake و session
خلاصهٔ کاملتر
نسخهی 2026-07-28 از Model Context Protocol (همون MCP، پروتکلی که کلاینتهای هوش مصنوعی باهاش ابزارهای یه سرور رو صدا میزنن) دو چیزی رو برداشته که بیشتر سرورها روش ساخته شده بودن: handshake یعنی initialize و session. حالا اولین درخواست HTTP کلاینت میتونه مستقیم یه tools/call باشه و هر نمونهای از سرور پشت load balancer میتونه جوابش رو بده. نویسندهی مقاله همهی تغییرات رو با Go 1.27.1 و go-sdk v1.8.0 روی دو تا handler محلی تست کرده.
قبلاً کلاینت با initialize شروع میکرد و یه Mcp-Session-Id میگرفت که باید به همهی درخواستهای بعدی میچسبوند. پس همهشون باید به همون نمونهای میرسیدن که session رو میشناخت. حالا نسخهی پروتکل، مشخصات کلاینت و قابلیتهاش داخل _meta خود درخواست میآد. سرور هم خودش رو تو _meta هر جواب معرفی میکنه و هر نتیجه یه فیلد اجباری resultType داره. برای stateی که بین چند فراخوانی لازمه، پیشنهاد اینه که سرور یه handle مثل cart_id بسازه و مثل یه آرگومان معمولی رد و بدل بشه.
هدرهای Mcp-Method و Mcp-Name هم اجباری شدن تا gateway و rate limiter بدون باز کردن JSON بتونن درخواست رو مسیریابی کنن. سرور باید درخواستی که هدرش با بدنه نمیخونه رو رد کنه، وگرنه یه proxy ممکنه اجازهی یه ابزار رو بده و سرور یه ابزار دیگه رو اجرا کنه. SDK زبان Go این رو سفت چک میکنه و با کد 400 و خطای -32020 جواب میده. نویسنده میگه برای کسی که کلاینتش رو دستی نوشته، این راحتترین چیزیه که از چشم میافته. استریم جدای GET و استریمهای قابل ادامه هم حذف شدن و GET حالا 405 میده.
مذاکرهی نسخه هم دیگه نیست. سرور هر درخواست رو جدا قبول یا رد میکنه و اگه نسخه رو نشناسه، خطای -32022 رو با لیست نسخههای قابل قبول برمیگردونه. کلاینتی که بخواد از اول بدونه، server/discover رو صدا میزنه که پیادهسازیش برای سرور اجباریه. فیلدهای جدید ttlMs و cacheScope هم روی جوابهایی مثل tools/list اجباری شدن و میگن جواب تا کی معتبره و واسطهها اجازه دارن کشش کنن یا نه. پیشفرض SDK یعنی 0 عملاً هیچ کشی نمیده و با ServerOptions.SetCacheable عوض میشه.
تو go-sdk v1.8.0، handlerی که session نگه میداره اصلاً 2026-07-28 رو نمیفهمه و کلاینتهای SDK بیسروصدا برمیگردن سراغ 2025-11-25. کلید این تغییر گزینهی Stateless هست:
return mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server { return s }, &mcp.StreamableHTTPOptions{
Stateless: stateless,
JSONResponse: true,
})به گفتهی نویسنده، کد ابزارها تو هر دو حالت یکی بود و handler بیحالت کلاینتهای قدیمی رو هم بیرون نکرد. ابزارهایی که وسط کار از کاربر چیزی میپرسن (مثل elicitation، یعنی گرفتن ورودی از کاربر) قبلاً یه استریم باز لازم داشتن. الگوی جدید multi round-trip این رو برعکس کرده: سرور فراخوانی رو با نتیجهای تموم میکنه که میگه چی لازم داره و کلاینت با جوابها دوباره درخواست میده. تو SDK زبان Go، بار اول InputRequests برمیگرده و بار دوم InputResponses خونده میشه.
نکات کلیدی:
- نسخهی 2026-07-28 پروتکل MCP دیگه initialize و Mcp-Session-Id نداره.
- هدرهای Mcp-Method و Mcp-Name اجباریان و اگه با بدنه نخونن، خطای -32020 برمیگرده.
- نسخهی ناشناخته خطای -32022 میده و server/discover برای سرورها اجباریه.
- تو go-sdk v1.8.0 فقط با Stateless: true نسخهی جدید فعال میشه.
- فقط tools/call، prompts/get و resources/read میتونن از کاربر ورودی بخوان.




