Kodlama ajanınız depoyu okur, build'i kontrol eder ve takip sisteminize issue açar. Bu kurulumun tipik bir diyagramı, model ile araçlar arasında “MCP” etiketli tek bir kutu gösterir. Sonra bir güvenlik incelemecisi hangi sürecin ev dizininizi okuyabildiğini, hangi token'ın takip sistemine ulaştığını ve issue oluşturan çağrıyı kimin onayladığını sorar. Kutunun bir cevabı yoktur.
Model Context Protocol (MCP) kesin tanımlı bir mimariye sahiptir ve 2026-07-28 sürümü bu mimarinin bir kısmını değiştirdi. Bu yazı katılımcıları, protokol katmanlarını, taşıma yöntemlerini, özellikleri, tek bir araç çağrısını, uzak yetkilendirmeyi ve güven sınırlarını, kopyalayabileceğiniz bir diyagramla birlikte ele alıyor.
Host'lar, istemciler ve sunucular
MCP'den önce her AI uygulaması her araç için kendi adaptörüne ihtiyaç duyuyordu: Beş uygulama ve yirmi araç, 100'e kadar entegrasyon demekti. MCP ile 25 implementasyon (uygulama başına bir istemci, araç başına bir sunucu) tüm eşleşmeleri karşılar.
| Katılımcı | Nedir | Neyi tutar |
|---|---|---|
| Host | AI uygulaması: bir IDE, bir sohbet uygulaması, bir ajan çalışma ortamı | Konuşma, model çağrıları, kullanıcı onayı, kimlik bilgileri |
| İstemci | Host'un tek bir sunucu için oluşturduğu bağlayıcı | Tek bir bağlantı ve bildirdiği yetenekler |
| Sunucu | Araçları, kaynakları ve prompt'ları sunan bir program | Sarmaladığı sisteme erişim |
Host her sunucu için bir istemci oluşturur ve her istemci tam olarak tek bir sunucuyla konuşur. Model bir sunucuyu asla kendisi çağırmaz: Bir araç çağrısı ister; çağrının çalıştırılıp çalıştırılmayacağına ve hangi istemcinin göndereceğine host karar verir. Sunucular yalıtılmış kalır: Konuşmanın tamamını da birbirlerini de görmemelidirler.
İki katman ve 2026-07-28'de değişenler
Veri katmanı JSON-RPC 2.0'dır: istekler (id'leri asla null olmaz), sonuçlar, hatalar ve tek yönlü bildirimler. Taşıma katmanı bu mesajları taşır; çerçeveleme, iptal ve yetkilendirmeyle ilgilenir.
28 Temmuz 2026'da yayımlanan 2026-07-28 spesifikasyonu MCP'yi durumsuz hâle getirdi. Önceki sürümler her bağlantıyı, sürümü ve yetenekleri sabitleyen bir initialize el sıkışmasıyla açıyordu; HTTP sunucuları da Mcp-Session-Id ile bir oturumu sabitleyebiliyordu. Artık her istek kendi protokol sürümünü ve istemci yeteneklerini _meta içinde taşıyor; böylece sıradan bir round-robin yük dengeleyicinin arkasındaki herhangi bir sunucu örneğine düşebilir.
| 2025-11-25 ve öncesi | 2026-07-28 | |
|---|---|---|
| Sürüm ve yetenekler | Bağlantı başına bir kez initialize |
Her istekte _meta; isteğe bağlı server/discover |
| Çağrılar arası durum | Mcp-Session-Id başlığı |
Araç argümanı olarak geçirilen açık handle'lar |
| Sunucu istemciden girdi isterse | Sunucu kendi isteğini gönderir | InputRequiredResult, ardından istemci yeniden dener |
| Değişiklik bildirimleri | HTTP GET akışı | subscriptions/listen akışı |
| Kopan akış | Last-Event-ID ile devam edilir |
Yeni bir id ile yeniden gönderilir |
Eski SDK'larla yazılmış sunucular hâlâ el sıkışmayı bekler; bu yüzden iki dönemi de destekleyen istemciler önce yoklama yapar, gerekirse initialize'a geri döner. Yalnızca 2026-07-28 konuşan bir istemci, yalnızca eski sürümü destekleyen bir sunucuyu kullanamaz. Değişiklik günlüğü geriye dönük uyumluluğu bozan tüm değişiklikleri listeler.
Taşıma yöntemleri: stdio ve Streamable HTTP
| stdio | Streamable HTTP | |
|---|---|---|
| Sunucunun çalışma biçimi | İstemcinin başlattığı bir alt süreç | /mcp gibi tek bir uç noktası olan bağımsız bir servis |
| Mesajlar | stdin ve stdout üzerinde satır başına bir JSON-RPC mesajı | Mesaj başına bir POST; yanıt JSON ya da isteğe özgü bir SSE akışıdır |
| Kimlik bilgileri | Ortamdan | Genellikle her istekte bir OAuth 2.1 bearer token |
| İsteği iptal etme | notifications/cancelled |
Yanıt akışını kapatmak |
| Proxy'ler için başlıklar | Yok | MCP-Protocol-Version, Mcp-Method, Mcp-Name |
Streamable HTTP, 2025-03-26 sürümünde HTTP+SSE taşımasının (bir GET akışı ve ayrı bir POST uç noktası) yerini aldı; HTTP+SSE artık resmen kullanımdan kaldırılmış durumda. Ağ geçitleri, gövdeyi ayrıştırmadan Mcp-Method ve Mcp-Name üzerinden yönlendirme ve hız sınırlama yapabilir; sunucular da başlıkları gövdeyle uyuşmayan istekleri reddeder. HTTP sunucuları DNS rebinding'e karşı Origin başlığını doğrulamak zorundadır; yerel sunucular da 127.0.0.1 adresini dinlemelidir.
Sunucu ve istemci özellikleri
| Özellik | Sunan | Kim yönetir | Metotlar | Durum |
|---|---|---|---|---|
| Araçlar | Sunucu | Model | tools/list, tools/call |
Etkin |
| Kaynaklar | Sunucu | Uygulama | resources/list, resources/read |
Etkin |
| Prompt'lar | Sunucu | Kullanıcı | prompts/list, prompts/get |
Etkin |
| Elicitation | İstemci | Sunucu kullanıcıya sorar | elicitation/create |
Etkin |
| Sampling | İstemci | Sunucu host'un modeline sorar | sampling/createMessage |
Kullanımdan kaldırıldı |
| Roots | İstemci | Sunucu klasörleri sorar | roots/list |
Kullanımdan kaldırıldı |
Elicitation'ın form modu asla parola, API anahtarı ya da token istememelidir; URL modu ise bunun yerine kullanıcıyı istemcinin dışındaki bir sayfaya gönderir. Sampling, roots ve sunucu loglaması 2026-07-28'de kullanımdan kaldırıldı ve en erken, 28 Temmuz 2027'de ya da sonrasında yayımlanan ilk sürümde kaldırılabilir.
Adım adım tek bir araç çağrısı
Model, uzak bir sunucu üzerinden bir issue açar:
- İsteğe bağlı olarak istemci, sürümleri ve yetenekleri öğrenmek için
server/discoverçağırır. - İstemci
tools/listçağırır. Host tüm sunuculardan gelen listeleri birleştirir, çakışan adlara önek ekler ve sonucu modele verir. - Model
create_issueister. Host çağrıyı gösterir ve kullanıcı onaylar. - İstemci, aşağıda gösterilen
tools/callisteğini gönderir. - Sunucunun bir onaya ihtiyacı varsa bir elicitation isteğiyle birlikte
input_requireddöndürür. İstemci kullanıcıya sorar ve yanıtla birlikte sunucunun opakrequestStatedeğerini göndererek yeniden dener. - Sonuç
completeolarak gelir. Araç hatasıisError: truedeğerini ayarlar; böylece model kendini düzeltebilir. - Bir
subscriptions/listenakışında gelennotifications/tools/list_changed, istemciye araçları yeniden listelemesini söyler.
POST /mcp HTTP/1.1
Host: mcp.tracker.example
Authorization: Bearer eyJhbGciOi...
Content-Type: application/json
Accept: application/json, text/event-stream
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: create_issue
{"jsonrpc": "2.0", "id": 7, "method": "tools/call",
"params": {"name": "create_issue",
"arguments": {"title": "Login fails on Safari"},
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {"name": "my-ide", "version": "1.4.0"},
"io.modelcontextprotocol/clientCapabilities": {"elicitation": {}}}}}
{"jsonrpc": "2.0", "id": 7, "result": {"resultType": "complete",
"content": [{"type": "text", "text": "Created issue #482"}], "isError": false}}
Uzak sunucular ve yetkilendirme
Uzak bir MCP sunucusu bir OAuth kaynak sunucusudur; token'ları, aynı firmanın ya da ayrı bir kimlik sağlayıcının işlettiği bir yetkilendirme sunucusundan gelir. İlk bağlantıda:
- İstemci token olmadan çağrı yapar ve
401alır; yanıtta genellikle sunucunun korumalı kaynak meta verilerini (RFC 9728) gösteren birWWW-Authenticatebaşlığı bulunur. - Bu belge ya da yedek olarak
/.well-known/oauth-protected-resource, yetkilendirme sunucusunu belirtir; istemci onun meta verilerini okur ve PKCE desteği ilan edilmemişse durur. - İstemci önceden kaydedilmiş bir istemci kimliği (client ID), bir Client ID Metadata Document (istemci kimliği olarak bir HTTPS URL'si) ya da 2026-07-28 ile kullanımdan kaldırılan dinamik istemci kaydını kullanır.
- İstemci, PKCE (
S256) ve MCP sunucusunu belirten birresourceparametresiyle (RFC 8707) authorization code akışını çalıştırır. Kullanıcı tarayıcıda giriş yapıp onay verir; istemci de yanıttakiissdeğerini doğrular (RFC 9207). - Her istek
Authorization: Bearertaşır.insufficient_scopeiçeren bir403, kademeli yetkilendirmeyi (step-up) tetikler.
Sunucu yalnızca kendisi için verilmiş token'ları kabul eder ve onları asla başka bir yere aktarmaz: Upstream bir API'ye yapılan çağrılar ayrı bir token kullanır. OAuth 2.0 akış diyagramı PKCE'yi açıklıyor; yetkilendirme spesifikasyonu ise OAuth 2.1 taslağı üzerine kurulu kuralların tamamını içeriyor.
Güven sınırları nerede
| Sınır | Risk | Önlem |
|---|---|---|
| Model ve araç metni | Açıklamalara ya da sonuçlara enjekte edilmiş talimatlar; onaydan sonra değiştirilen tanımlar | Güvenilmeyen veri olarak ele alın, çağrıları kullanıcıya gösterin, değişen tanımları yeniden onaylatın |
| Makine ve stdio sunucuları | Bir sunucu dosyaları, ortam değişkenlerini ya da SSH anahtarlarını okuyup dışarı gönderir | Paketleri inceleyin; üçüncü taraf sunucuları tek bir salt okunur mount ile ve ağ erişimi olmadan sandbox'ta çalıştırın; her sunucuya dar kapsamlı tek bir token verin |
| Ağ sınırı | Çalınan ya da gereğinden geniş kapsamlı token'lar | Audience'a bağlı, kısa ömürlü token'lar; kademeli yetkilendirmeyle en dar kapsamlar |
| Sunucular arası | Bir sunucu, ajanın başka bir sunucunun araçlarını nasıl kullandığını yönlendirir | Az sayıda sunucu, birbirinden farklı araç adları, host'un aracılığı |
stdio taşıması bir sandbox değildir: MCP'nin yerel sunucu güvenliği rehberi, bir stdio sunucusunun istemcinin yetkileriyle çalıştığını ve yalıtımın host'a ve makineyi işleten kişiye kaldığını söyler. Durumsuz bir sunucunun ürettiği durum handle'ı da bir kimlik bilgisi değildir; onu kimliği doğrulanmış kullanıcıya bağlayın. Tehdit modelleme veri akış diyagramı, bu tür sınırları STRIDE ile nasıl tek tek inceleyeceğinizi gösteriyor.
MCP mimari diyagramı
Diyagram içeriği
- Developer machine: one OS user, one trust domain
- Host application (IDE or chat app)
- Remote service (vendor cloud)
- Developer
- Agent loop + LLM
- MCP client 1
- MCP client 2
- MCP client 3
- Filesystem server
- Git server
- Issue tracker MCP server
- Issues API
- Authorization server
- prompts, approvals
- read_file
- git_log
- create_issue
- stdin / stdout
- POST /mcp + Bearer token
- OAuth 2.1: browser sign-in, code + PKCE + resource
- own token
Nasıl okunur:
- Yeşil çerçeve tek bir güven alanıdır: Host, üç istemcisi ve iki stdio sunucusu, geliştiricinin işletim sistemi kullanıcısıyla çalışır.
- Sunucu başına bir istemci. 1. ve 2. istemciler stdin ve stdout kullanır; 3. istemci Streamable HTTP kullanır.
- Modelden çıkan gri kenarlar, host'un yönlendirdiği araç çağrılarıdır; sunucular modele asla doğrudan ulaşmaz.
- Mavi, ağı bir bearer token'la geçer. Kesikli mor, OAuth akışıdır ve yalnızca istemcinin geçerli bir token'ı olmadığında çalışır.
- Petrol mavisi, uzak sunucunun kendi token'ıyla kendi API'sini çağırmasıdır: Token aktarımı yok.
- Markdown bloğu, 2026-07-28 sürümünü özetler.
MCP mimari diyagramlarını net çizmek
- Sunucu başına bir istemci. Tek bir “MCP” kutusu, her sunucunun neyi görebildiğini gizler.
- Kenarları taşıma yöntemi ve içerikle etiketleyin: stdin ve stdout, bearer token'lı bir POST, bir OAuth akışı, örnek araç adları.
- Güven sınırlarını çerçeve olarak çizin: makine, host, her sağlayıcı. Sandbox'taki sunucuları işaretleyin.
- Yetkilendirme sunucusuna ve upstream API'lere ayrı düğümler verin; böylece token kaynakları ve token aktarımı yasağı görünür olur.
- Protokol sürümünü belirtin. 2026-07-28 diyagramında el sıkışma ya da oturum kimliği olmaz.
- Dışarıda bırakın: SDK'nın iç yapısı, araç listelerinin tamamı ve model sağlayıcısının altyapısı.
AI ajan mimari diyagramı, bu çağrıları çevreleyen ajan döngüsünü ele alıyor.
Archboard'da oluşturun
- Google ya da GitHub ile giriş yapın ve bir diyagram oluşturun.
- Geliştirici makinesi için Temel paketinden bir Çerçeve, onun içine de host için C4 Modeli paketinden bir Container sınırı ekleyin.
- Sınırın içine ML paketinden bir Model ve istemciler için C4 Modeli paketinden üç Component (Bileşen) düğümü ekleyin; teknoloji alanlarına sırasıyla stdio, stdio ve Streamable HTTP yazın.
- Yerel sunucular için C4 Modeli paketinden iki Container (Konteyner) düğümü ekleyip “stdin / stdout” kenarlarıyla bağlayın; aynı paketten bir Person (Kişi) ekleyip modele bağlayın.
- Çerçevenin dışına C4 Modeli paketinden bir Sistem sınırı ekleyin; içine uzak sunucu için bir Container, onun API'si için bir External System (Harici sistem) ve Güvenlik paketinden bir Kimlik sağlayıcı koyun. Ardından bearer token, kesikli OAuth ve “own token” kenarlarını çizin.
- Protokol bilgileriyle Temel paketinden bir Markdown bloğu, sınırları açıklamak için de Temel Metin öğeleri ekleyin.
MCP istemci yapılandırma dosyalarını okuyan ücretsiz bir araç yok; bu yüzden sunucuları kendiniz çizin ya da MCP spesifikasyonundaki gibi bir Mermaid akış şemasını Mermaid akış şemasından düzenlenebilir diyagrama aracına yapıştırın.
Bu yazının yazıldığı sırada (Kasım 2026) Archboard'un kendisi de https://getarchboard.app/mcp adresinde uzak bir MCP sunucusudur: Streamable HTTP; Archboard'un kendi yetkilendirme sunucusundan PKCE (S256) ile ve kaynak göstergesi (resource indicator) olarak bu URL'yle OAuth 2.1; Client ID Metadata Document ya da dinamik istemci kaydıyla istemci kaydı. MCP sunucusu dokümantasyonu araçlarını listeler, AI ajanları sayfası da uygulamanızı nasıl bağlayacağınızı gösterir.
Örnek 14 diyagram düğümü kullanıyor ve Free planın sınırları içinde kalıyor.
SSS
MCP host'u, istemcisi ve sunucusu arasındaki fark nedir? Host, IDE gibi AI uygulamasıdır. Her sunucu için bir istemci oluşturur; her istemci de araçları, kaynakları ve prompt'ları sunan tek bir sunucuyla özel bir bağlantı tutar.
MCP artık durumsuz mu?
Evet, 2026-07-28 sürümünden beri: initialize el sıkışması yok, oturum kimliği yok ve her istek kendi sürümünü ve yeteneklerini taşıyor. Eski sürümlerdeki sunucular hâlâ el sıkışmayı kullanır.
MCP hangi taşıma yöntemlerini destekler? İki standart yöntem: yerel sunucular için stdio, uzak sunucular için Streamable HTTP. HTTP+SSE kullanımdan kaldırıldı; özel taşıma yöntemleri de JSON-RPC mesaj biçimini korumak zorundadır.
Yerel MCP sunucularının OAuth'a ihtiyacı var mı? Hayır. Spesifikasyona göre stdio sunucuları kimlik bilgilerini ortamdan almalıdır. Her birine dar kapsamlı bir token verin ve üçüncü taraf sunucuları sandbox'ta çalıştırın.
MCP'de token passthrough nedir? Bir MCP sunucusunun kendisi için verilmemiş bir token'ı kabul etmesi ya da istemcinin token'ını başka bir API'ye iletmesi. Spesifikasyon bunu yasaklar; upstream çağrılar sunucunun kendi token'ını gerektirir.