MCP Bahçesi

Model Context Protocol — N×M problemi, mimari, primitive'ler ve 2026 stateless spec'i.

Beyaz tahta daha geniş bir ekran istiyor — notlar sırayla aşağıda.

not

MCP nedir

MCP, bir modeli dış veri kaynaklarına ve tool'lara bağlamanın standart bir yolu. Anthropic tarafından açık kaynak olarak yayımlandı ve bugün ekosistemin ortak bir port'a en yakın şeyi.

MCP'den önceher sistem için elle yazılmış bir adapter, uygulamanın içinde
MCP iletek protokol, her sistem bir server'ın arkasında
Rendering diagram…

Önceden her entegrasyon, uygulamanın içinde yaşayan ısmarlama bir adapter'dı. Sonrasında uygulama tek bir protokol konuşuyor ve her entegrasyon onun arkasında bir server — değiştirilebilir, yeniden kullanılabilir, sistemin sahibi tarafından bir kez yazılmış.

Akılda tutmaya değer tek cümle: MCP, LLM'ler için tool discovery'dir. Bir fonksiyonu çağırmanın yeni bir yolu değil; hangi fonksiyonların var olduğunu ve neye ihtiyaç duyduklarını öğrenmenin standart bir yolu.

#mcp#anthropic
şema

N×M problemi

Altta yatan problem basit. Bir modelin bilgisi sabit bir depo ve canlı sistemlerden yalıtılmış — dolayısıyla her entegrasyon ısmarlama bir köprü istiyor.

Sabit bilgieğitim seti, dondurulmuş
Yalıtılmışne güncel veriyi ne çalışan sistemleri görüyor
Ismarlama köprülerher entegrasyon için ayrı bir adapter

N × M

N model, M tool, her çift kendi protokolünü konuşuyor. Bu, iki maliyeti olan bir kaos: boşa giden geliştirme eforu ve daha kötüsü, boşa giden bakım eforu — her biri kendi takvimine göre bozulan M entegrasyon.

Ortaya tek bir protokol koyunca bu N + M'ye iniyor:

Rendering diagram…
#mcp#integration
şema

Host, client, server

Üç rol var ve birbirine karıştırmak kolay. Host uygulamanın kendisi. Her bağlantı için bir client tutuyor. Her client tek bir server ile konuşuyor.

server başına bir client
Host · IDE, chat client, agentsenin yazdığın kısımstdioStreamable HTTPSQLHTTPSMCP client 1tek bağlantıMCP client 2tek bağlantıMCP serverdosyalar · yerelMCP serverissue'lar · uzakVeritabanıyerel ya da uzakWeb APIuzaktaki bir servisBackend4Veritabanı1Bulut1
RolKim yazıyorNeyin sahibi
Hostuygulama sağlayıcısımodel, arayüz, onay diyalogları
ClientSDKtek bir bağlantı, protokol muhasebesi
Serversencapability'ler ve arkalarındaki dış sistem

Çoğu insanın yazdığı tek parça server. Capability'leri dışa açıyor ve arkasında ne varsa onunla konuşuyor — yerel bir veritabanı, bir web API, bir dosya sistemi.

#architecture#roles
not

Transport'lar: stdio ve HTTP

Pratikte iki transport var ve seçim aslında "aynı makine mi, değil mi" sorusundan ibaret.

TransportNe içinBiçimi
stdioyerel server'larchild process, stdin/stdout
Streamable HTTPuzak server'lardüz HTTP, stateless
HTTP+SSE (legacy)yeni hiçbir şey içindeprecated, 12 aylık çıkış takviminde
aynı server, ona ulaşmanın iki yolu
Host
process başlat
stdio
Server
Host
HTTPS isteği
Streamable HTTP
Server

SSE'den neden uzaklaşıldı

Orijinal uzak transport, server'ın istekleri geri itebilmesi için uzun ömürlü bir server-sent-events stream'ini açık tutuyordu. Bu her bağlantıyı sticky yapıyordu — önüne düz bir load balancer koyamıyordun ve kopan bir stream session'ı da götürüyordu.

stdio ikinci sınıf bir transport değil — yerel dosya sistemine ya da yerel credential'lara dokunan her şey için doğru olan o, üstelik en basiti.

#stdio#http#transport
şema

Bir istek, uçtan uca

Kullanıcı, modelin tek başına cevaplayamayacağı bir şey sorduğunda aslında ne oluyor.

Rendering diagram…

İki yarı

  • Discovery. Client server'a ne sunduğunu soruyor ve açıklamalı bir liste alıyor. Model bu açıklamaları dokümantasyon okur gibi okuyor.
  • Invocation. Model birini seçiyor, client onu çağırıyor, server asıl işi yapıp modelin okuyabileceği bir şey döndürüyor.
#sequence#discovery
şema

Tool'lar, resource'lar, prompt'lar

Bir server üç şey dışa açar. Önemli olan fark, bunları kullanmaya kimin karar verdiği.

PrimitiveNedirKim kontrol ediyor
Toolstipli girdi alan çalıştırılabilir fonksiyonlarmodel
Resourcesokunabilir veri, statik ya da dinamikuygulama
Promptskullanıcının çağırabildiği şablonlarkullanıcı
Toolsmodel kontrolünde — çağırmayı LLM seçer
Resourcesuygulama kontrolünde — salt okunur, host ekler
Promptskullanıcı kontrolünde — bir slash komutu, bir şablon

Wire üzerindeki metotlar

Discovery ile kullanım ayrı çağrılar ve her birinin bir list tarafı, bir de eylem tarafı var: tools/list sonra tools/call, resources/list sonra resources/read, prompts/list sonra prompts/get.

Bir şeyin tool mu resource mu olduğundan emin değilsen şunu sor: modelin bunu kendi başına tetiklemesine izin verilmeli mi? Evet → tool. Hayır → resource.

#tools#resources#prompts
not

Client tarafı ve MRTR

Protokol başta iki yönlüydü: server, modeli ödünç almak, kullanıcıya bir şey sormak ya da workspace root'larını okumak için client'ı geri çağırabiliyordu.

PrimitiveNe yapıyorduDurum
Samplingserver, host'un modelini ödünç alırdeprecated
Rootsserver hangi dizinlerin kapsamda olduğunu sorardeprecated
Elicitationserver çağrının ortasında kullanıcıya soru soraryerini MRTR aldı
Loggingserver host'a yapılandırılmış log gönderirdeprecated

Bunların hepsi açık tutulan çift yönlü bir stream istiyordu — stateless çekirdeğin kaldırdığı şey tam olarak bu.

Elicitation'ın yerine ne geldi

Multi Round-Trip Requests. Server, soruyu açık bir stream'den aşağı itmek yerine ihtiyaç duyduğu şeyle birlikte resultType: "input_required" döndürüyor. Client cevapları topluyor ve onları ekleyerek orijinal çağrıyı yeniden deniyor.

input_required, sonra retry
tools/call
input_required
client kullanıcıya sorar
cevaplarla retry
#elicitation#mrtr#deprecated
not

Bir tool tasarlamak

Model kodunu asla görmüyor. Gördüğü şey bir isim, bir açıklama ve bir schema — kalite de tam orada yaşıyor.

Az ve genişbeş iyi tool kırk dar tool'u yener
Dürüst açıklamalarsadece ne zaman kullanılacağını değil, ne zaman KULLANILMAYACAĞINI da söyle
Tipli girdikatı bir schema bir retry'dan ucuzdur
Okunabilir hatalarmodelin üzerine aksiyon alabileceği metin döndür
Sayfalaasla sınırsız bir blob geri verme

Bozulma biçimleri

  • Tool çorbası. Kısa, kuru isimli kırk tool. Model yanlış seçiyor ve üstüne ne kadar prompt engineering yaparsan yap kötü bir menüyü düzeltmiyor.
  • Yutulan hatalar. Hata durumunda boş sonuç döndüren bir tool, modele cevabın "hiçbir şey" olduğunu öğretiyor.
  • Sayfalanmamış dönüşler. Koca bir JSON dokümanını olduğu gibi boşaltan tek bir tool, patlayan context window'un en yaygın sebebi.

Bu tool'ları tüketen döngü başlı başına bir konu — AI bahçesindeki bir agent bir döngüdür notuna bak.

#tools#design
şema

Bir server'ın anatomisi

Bir server kulağa geldiğinden küçük. Ne yapabildiğini bildiriyor, sonra her primitive için iki tür çağrıya cevap veriyor: listele ve birini yap.

aslında ne implemente ediyorsun
Capability'leri bildir
tools/list'e cevap ver
tools/call'u işle
Content döndür
Girdiyi doğrula
Gerçek sistemle konuş
Sonucu biçimlendir
Hataları metin olarak bildir

Bir tool'un biçimi

AlanNeden önemli
namesabit tanımlayıcı — yeniden adlandırmak çağıranları kırar
descriptionmodelin okuduğu tek dokümantasyon
inputSchemaJSON Schema; client çağırmadan önce doğrulayabilir
handlersenin kodun — ve yetkilerin kullanıldığı tek yer

Bir server yazmanın en zor kısmı protokol değil — onu SDK'lar hallediyor. Zor olan, neyi dışa açıp neyi erişilmez tutacağına karar vermek.

#server#sdk
not

MCP vs function calling

Yaygın bir kafa karışıklığı: MCP function calling'in yerini almıyor. Onun üstünde oturuyor.

Function callingMCP
Nedirbir model yeteneğibir wire protocol
Tool'ları kim tanımlıyorsenin uygulaman, senin kodundabir server, runtime'da
Discoveryyok — listeyi hardcode ediyorsuntools/list
Uygulamalar arası yeniden kullanımhayır, kodu kopyalaevet, server'ı göster
Transportyok, in-processstdio ya da HTTP
Rendering diagram…

Model tool çağrısını hep yaptığı gibi yapmaya devam ediyor. MCP bir üst seviyedeki soruyu cevaplıyor: o tool listesi nereden geldi ve başka kim kullanabilir?

#function-calling#comparison
not

Saldırı yüzeyi

Her MCP server, modelin context'ine giren yeni bir güvenilmeyen metin parçası ve modelin ulaşabildiği yeni bir yetki kümesi demek. İkisi de saldırı yüzeyi.

Tool poisoningkötü niyetli bir açıklama modeli yönlendirir
Indirect prompt injectiondönen verinin içine gizlenmiş talimatlar
Confused deputyserver kendi geniş credential'ıyla hareket eder
Supply chainokumadığın bir server kurdun

İnsanları şaşırtan

Tool açıklamaları context'tir. Bir server açıklamanın içine talimat koyabilir ve model onları seninkileri okuduğu gibi okur. Invariant Labs bunu somut olarak gösterdi: ikinci bir server'daki zehirlenmiş bir açıklama, masum görünen bir çağrı üzerinden modele bir kullanıcının bütün WhatsApp geçmişini sızdırtmaya yetti.

Confused deputy, somut haliyle

Bir agent meşru olarak geniş bir veritabanı credential'ı tutuyor. Bir prompt injection onu bu credential'ı deploy edenin hiç niyetlenmediği bir şey için kullanmaya ikna ediyor. Server hack'lenmedi — tam olarak kendisinden isteneni yaptı.

Server'ın döndürdüğü her şeye veri gibi davran, asla talimat gibi değil. Buna tool açıklamaları da dahil — insanların unuttuğu kısım o.

#security#prompt-injection
not

Authorization

Uzak server'lar için authorization oyunun tamamı. Spec OAuth 2.1'de karar kılıyor ve sıkılaştırdığı detaylar tam da sömürülen detaylar.

PKCE, her zamansadece public olanlar için değil, her client için zorunlu
Implicit grant yokspec'ten tamamen çıkarıldı
Audience doğrulasadece senin için basılmış token'ları kabul et
Passthrough yokbir client token'ını asla upstream bir API'ye iletme

Bilmeye değer iki sıkılaştırma

  • Issuer doğrulama (RFC 9207). Credential'lar onları basan issuer'a bağlanıyor; bu, authorization server'lar arasındaki bir sınıf mix-up saldırısını kapatıyor.
  • CIMD, Dynamic Client Registration'ın yerini alıyor. Artık desteklenen yol Client ID Metadata Documents; DCR resmen deprecated.

Token'ları minimuma scope'la ve kullanıcı başına scope'la — server geneli bir service account, olmayı bekleyen bir confused deputy problemi.

#oauth#pkce#security
not

2026-07-28 stateless spec'i

2026-07-28 spec'i, MCP çıktığından beri yapılan en büyük değişiklik ve büyük ölçüde tek bir fikir: protokolü stateless yap ki normal bir HTTP servisi gibi işletilebilsin.

DeğişiklikAnlamı
Stateless çekirdekinitialize handshake yok, session id yok
Kendini tarif eden isteklerher biri version, identity ve capability taşıyor
MRTRinput_required + retry, server tarafından başlatılan çağrıların yerini alıyor
Header routingher istekte Mcp-Method ve Mcp-Name
Cache'lenebilir listelerlist sonuçlarında ttlMs ve cacheScope
Extensions frameworkTasks, MCP Apps ve EMA çekirdekten çıkıyor

Asıl engel neden state'ti

Bir handshake ve bir session id varken her istek, konuşmayı başlatan instance'a düşmek zorundaydı. Bu da sticky session, düz round-robin yok ve kopan bir stream'in session'ı götürmesi demek.

neyin önünü açıyor
Herhangi bir istek
Herhangi bir instance
Düz load balancer
Yatay ölçek

On iki aylık geri sayımda deprecated olanlar: HTTP+SSE transport, sampling, roots ve logging. Yeni şeyleri bunlar olmadan kur.