MCP Durumsuz Oluyor: 2026-07-28 Spesifikasyonu Sunucu Çalıştıran Ekipler İçin Ne Anlama Geliyor?
Yeni MCP spesifikasyonu handshake'i ve oturumları kaldırıyor, yönlendirilebilir header'lar ve önbellek ipuçları ekliyor, yetkilendirmeyi sıkılaştırıyor; Roots, Sampling ve Logging için de kullanımdan kaldırma süreci başlıyor.
Umut Korkmaz
Yayın tarihi: 4 dk okuma
Bu sayfada7
Model Context Protocol dün 2026-07-28 spesifikasyonunu yayımladı. Bu sürüm yeni özellik paketinden çok bir altyapı değişikliği. initialize handshake'i ve protokol oturumları kaldırıldı, artık her istek kendini kendisi tanımlıyor. Bir MCP sunucusunun ortak bir oturum deposuna ihtiyaç duymadan, diğer HTTP servisleri gibi sıradan bir round-robin load balancer arkasında çalışabilmesini sağlayan şey bu. Sürümde ekiplerin şimdiden plan yapması gereken breaking change'ler olmasının sebebi de yine bu.
Handshake yok, oturum ID'si yok
initialize/initialized alışverişi ve Mcp-Session-Id header'ı kaldırıldı. Her istek, protokol sürümünü ve istemci yeteneklerini _meta içinde taşıyor. İstemcilerin her istekte kendilerini tanıtması bekleniyor ve sürüm uyuşmazlığı UnsupportedProtocolVersionError olarak dönüyor. Sunucuların yeni server/discover RPC'sini implemente etmesi zorunlu. İstemciler önce bunu çağırabilir ama çağırmak zorunda değil. ping ve logging/setLevel de kaldırıldı.
Maintainer'lar şunu açıkça belirtiyor: protokol oturumunun kalkması, uygulamanızı durumsuz olmaya zorlamıyor. Bir sunucunun çağrılar arasında state tutması gerekiyorsa önerilen yöntem, bir tool'dan açık bir handle üretmek ve modelin bunu argüman olarak geri göndermesini sağlamak. Bu yaklaşımı beğeniyorum. Transport katmanında gizli duran state'i review sırasında anlamak zor. Görünür bir handle'ı ise loglayabilir, doğrulayabilir ve süresini dolurabilirsiniz.
Gateway'in kullanabileceği header'lar
Streamable HTTP POST isteklerinde artık Mcp-Method bulunması zorunlu. tools/call, resources/read ve prompts/get için buna ek olarak Mcp-Name de gerekiyor. Böylece bir gateway, rate limiter ya da WAF, body'yi parse etmeden yönlendirme ve ölçüm yapabiliyor. Kendi sunucunuzda çalışan bir nginx'te, tool çağrısı başına rate limiting sıradan bir konfigürasyona dönüşüyor:
map $http_mcp_method $mcp_call_key {
default "";
"tools/call" $binary_remote_addr;
}
limit_req_zone $mcp_call_key zone=mcp_calls:10m rate=5r/s;
# inside the /mcp location:
limit_req zone=mcp_calls burst=10;
Bir uyarı: Yetkilendirmeyi edge'de header'lara bakarak yapıyorsanız, arkadaki sunucunun header'ları body ile uyuşmayan istekleri reddetmesi gerekir. Transport spesifikasyonu tam olarak bunu şart koşuyor (400 ile HeaderMismatch, kod -32020). Changelog da şemaya HeaderMismatchError ekliyor. Yani yalnızca header'a güvenmeden önce SDK sürümünüzün bunu gerçekten uyguladığından emin olun.
Sessizce kıran değişiklikler
Bazı değişiklikler derleme hatası olarak karşınıza çıkmayacak:
- SSE stream'lerinin kaldığı yerden devam edebilmesi ve
Last-Event-IDile yeniden gönderim kaldırıldı. Kopan bir response stream'i, o anda işlenen isteği kaybettiriyor ve istemcinin isteği yeni bir request ID ile tekrar göndermesi gerekiyor. Yan etkisi olan tool'lar idempotent olmalı ya da Tasks'a taşınmalı. - Sunucu tarafından başlatılan
elicitation/create,sampling/createMessageveroots/list, yerini Multi Round-Trip Requests'e bırakıyor. SunucuinputRequestsile birlikteresultType: "input_required"döndürüyor, istemci de orijinal çağrıyıinputResponsesile tekrar deniyor. Artık her sonuçta zorunlu birresultTypealanı var. - Resource bulunamadı hata kodu
-32002'den-32602'ye taşındı. Kodunuzda eski numarayı grep'leyin. tools/list,prompts/list,resources/list,resources/readveresources/templates/listsonuçlarındattlMsvecacheScope("public"ya da"private") bulunması zorunlu. Yol üzerindeki herhangi bir paylaşımlı önbellek içinprivatedeğerini kesin bir kural olarak ele alın.- Sunucuların tool'ları deterministik bir sırayla döndürmesi gerekiyor ve changelog bunu doğrudan prompt cache hit oranlarına bağlıyor. Prompt caching hakkında daha önce de yazmıştım: sırası karışan bir tool listesi, önbelleğe almak için para ödediğiniz bir prompt prefix'ini geçersiz kılabilir.
Yetkilendirmede sıkılaştırma
Authorization server'ların RFC 9207 uyarınca iss döndürmesi gerekiyor. İstemciler de kodu kullanmadan önce bu değeri kaydedilmiş issuer ile doğrulamak zorunda. Bu, RFC'nin authorization server mix-up saldırılarına karşı önerdiği önlem. İstemci kimlik bilgileri artık onları üreten issuer'a bağlı: saklanan kimlik bilgilerini issuer'a göre anahtarlayın, farklı authorization server'lar arasında asla yeniden kullanmayın ve sunucu değiştiğinde yeniden kayıt olun. İstemcilerin Dynamic Client Registration sırasında application_type ayarlaması zorunlu. Duyuruya göre bu, authorization server'ların masaüstü ve CLI uygulamalarındaki localhost yönlendirmelerini reddetmesinin önüne geçiyor. DCR'ın kendisi ise Client ID Metadata Documents lehine resmi olarak kullanımdan kaldırıldı, ancak geriye dönük uyumluluk için çalışmaya devam ediyor.
Takvime bağlanmış kullanımdan kaldırmalar
Roots, Sampling ve Logging, en az on iki aylık bir süre tanıyan yeni bir yaşam döngüsü politikası kapsamında kullanımdan kaldırıldı. Önerilen geçiş yolları somut: Roots yerine dizinleri tool parametreleri, resource URI'leri ya da konfigürasyon üzerinden iletin; Sampling yerine LLM sağlayıcılarının API'lerini doğrudan çağırın; Logging yerine stderr'e loglayın ya da OpenTelemetry kullanın. Eski HTTP+SSE transport'u da resmi olarak kullanımdan kaldırıldı.
Tasks, io.modelcontextprotocol/tasks extension'ına taşınıyor. Polling tasks/get ile yapılıyor, yeni bir tasks/update de eklendi; tasks/list ise kaldırıldı. Tasks, artık resmileşmiş bir extension çerçevesi altında MCP Apps ve Enterprise Managed Authorization'ın yanına katılıyor. TypeScript, Python, Go ve C# SDK'ları yeni sürümü yayın günü destekledi, Rust SDK ise beta olarak destekliyor.
Ben ne yapıyorum?
MCP sunucusu çalıştıran bir ekip için pazartesi başlayacağım liste şu:
- Oturum ID'sinin her kullanımını ve bağlantı başına tutulan tüm state'i bulun, bunları tool argümanı olarak geçirilen açık handle'larla değiştirin.
- Yan etkisi olan tool'ları idempotency açısından denetleyin, çünkü kopan bir stream artık kaldığı yerden devam etmek değil, yeniden denemek demek.
- Gateway'e header tabanlı yönlendirme ve rate limit ekleyin, sunucunun header/body uyuşmazlıklarını reddettiğini doğrulayın.
ttlMsvecacheScopedeğerlerini bilinçli olarak ayarlayın ve tool sıralamasını deterministik hale getirin.- On iki aylık süre henüz uzunken Roots, Sampling ve Logging'in kaldırılmasını yol haritasına ekleyin.
Code Pulse bir MCP sunucusu içeriyor, Convoke'ta da MCP hook'ları var. Yani ikisi de benim listemde; önce handshake'in kaldırılması ve her sonuçtaki yeni resultType alanıyla başlıyorum. Oturumlardan vazgeçmek doğru bir karar. MCP'yi HTTP gibi işletebileceğiniz bir şeye dönüştürüyor ve bunu çalıştırmak çok daha kolay.
Kaynaklar
Bu yazıda yararlanılan birincil kaynaklar.
- blog.modelcontextprotocol.io/posts/2026-07-28 (yeni sekmede açılır)
- modelcontextprotocol.io/specification/2026-07-28 (yeni sekmede açılır)
- modelcontextprotocol.io/specification/2026-07-28/changelog (yeni sekmede açılır)
- modelcontextprotocol.io/specification/2026-07-28/basic/transports/streamable-http (yeni sekmede açılır)
- datatracker.ietf.org/doc/html/rfc9207 (yeni sekmede açılır)