Blog / Rehber
MCP Nedir? Model Context Protocol'e Türkçe Giriş
Bir dil modeli tek başına yalnızca metin üretir. Bir dosyayı okuması, veritabanına sorgu atması ya da bir ağ cihazından durum bilgisi alması için onu dış dünyaya bağlayan bir katman gerekir. Model Context Protocol (MCP), bu bağlantıyı standart hale getiren açık bir protokoldür: bir AI uygulaması ile ona veri ve yetenek sağlayan sistemler arasındaki konuşmanın kurallarını tanımlar.
Bu yazıda MCP'nin hangi problemi çözdüğünü, mimarisini, sunduğu yapı taşlarını ve bir tool çağrısının uçtan uca nasıl aktığını anlatıyoruz.
TL;DR
- MCP, AI uygulamalarını araçlara ve veri kaynaklarına bağlamak için açık bir protokoldür. Anthropic tarafından Kasım 2024'te yayımlandı, bugün birçok AI uygulaması ve geliştirme aracı tarafından destekleniyor.
- Mimari üç rolden oluşur: host (AI uygulaması), client (host içindeki bağlantı bileşeni) ve server (araçları ve veriyi sunan program).
- Server üç temel yapı taşı sunar: tools (model tarafından çağrılan işlemler), resources (okunabilir veri) ve prompts (hazır şablonlar).
- Mesajlar JSON-RPC 2.0 formatındadır; taşıma katmanı yerelde stdio, uzakta Streamable HTTP'dir.
- Uzak server'larda yetkilendirme OAuth 2.1 üzerine kuruludur.
MCP hangi problemi çözüyor?
MCP'den önce her AI uygulaması her entegrasyonu kendi yöntemiyle yazıyordu. Beş farklı AI uygulamasını on farklı sisteme bağlamak isteyen bir ekip, pratikte elli ayrı entegrasyonla uğraşıyordu. Her entegrasyonun kendi kimlik doğrulaması, hata modeli ve veri formatı vardı.
MCP bu çarpımı toplama çevirir: bir sistem için bir kez MCP server yazarsınız, MCP destekleyen her uygulama onu kullanabilir. Bir uygulamaya bir kez MCP client desteği eklenir, mevcut tüm server'lara bağlanabilir. Bu yüzden MCP için sıkça "AI uygulamalarının USB-C'si" benzetmesi yapılır.
MCP'nin bir tool calling alternatifi olmadığını da baştan söylemek gerekir. Tool calling, modelin "şu aracı şu parametrelerle çağır" diyebilmesidir ve model API'sinin bir özelliğidir. MCP ise o araçların nereden geldiğini, nasıl keşfedildiğini ve nasıl çalıştırıldığını standartlaştırır. Model yine tool calling yapar; host bu çağrıyı MCP üzerinden doğru server'a iletir.
Mimari: host, client ve server
MCP'de üç rol vardır:
| Rol | Ne yapar | Örnek |
|---|---|---|
| Host | Kullanıcının etkileştiği AI uygulaması. Modeli çalıştırır, hangi server'lara bağlanılacağına ve hangi işleme izin verileceğine karar verir. | Masaüstü AI asistanı, IDE, kendi yazdığınız agent |
| Client | Host'un içinde, tek bir server ile birebir bağlantıyı yöneten bileşen. Her server için ayrı bir client oluşur. | Host'un MCP kütüphanesi |
| Server | Bir sistemi (dosya sistemi, veritabanı, API, ağ cihazı) MCP üzerinden sunan program. | GitHub server'ı, PostgreSQL server'ı, kendi iç API'niz için yazdığınız server |
Önemli bir ayrıntı: model server'la doğrudan konuşmaz. Model yalnızca host'un ona verdiği tool listesini görür ve bir tool çağırmak istediğini söyler. Çağrıyı server'a iletmek, sonucu modele geri vermek ve gerekirse kullanıcıdan onay almak host'un işidir. Güvenlik kararlarının host'ta toplanması bu yüzden mümkündür.
Yapı taşları: tools, resources ve prompts
Bir server, bağlandığı uygulamaya üç tür yetenek sunabilir. Aralarındaki fark, kimin kontrol ettiğidir:
| Yapı taşı | Kim kullanır | Ne işe yarar | Örnek |
|---|---|---|---|
| Tools | Model (host onayıyla) | Bir işlem yapar, yan etkisi olabilir | create_issue, run_query, get_interface_status |
| Resources | Uygulama | Okunabilir veri sağlar; modelin bağlamına eklenir | Bir dosyanın içeriği, bir tablonun şeması |
| Prompts | Kullanıcı | Hazır, parametreli şablonlar | "Bu PR'ı incele", "Olay raporu hazırla" |
Her tool bir ad, bir açıklama ve parametreleri tanımlayan bir JSON Schema ile gelir. Model hangi tool'u ne zaman kullanacağına bu açıklamaya bakarak karar verir. Bu yüzden iyi bir tool açıklaması, iyi bir fonksiyon adı kadar önemlidir.
Bağlantı yalnızca server'dan client'a doğru çalışmaz. Client da server'a bazı yetenekler sunabilir:
- Sampling: Server, kendi API anahtarı olmadan host'un modelinden bir metin üretmesini ister.
- Roots: Client, server'a hangi dizinlerde veya kaynaklarda çalışabileceğini bildirir.
- Elicitation: Server, işlem sırasında kullanıcıdan ek bilgi ister (örneğin eksik bir parametre).
Taşıma katmanı: stdio ve Streamable HTTP
MCP mesajları JSON-RPC 2.0 formatındadır: her istek bir method, bir id ve params taşır; cevap aynı id ile döner. Bu mesajların nasıl taşınacağı ise iki yolla tanımlanır:
- stdio: Host, server'ı yerel bir süreç olarak başlatır ve mesajlar standart giriş/çıkış üzerinden gider. Yerel araçlar için en basit yoldur; ağ, port ya da kimlik doğrulama gerekmez.
- Streamable HTTP: Server uzakta çalışır ve tek bir HTTP endpoint'i üzerinden konuşulur. Client istekleri
POSTile gönderir; server kısa cevaplar için düz JSON, uzun süren işlemler için Server-Sent Events (SSE) akışı döndürebilir. Eski spesifikasyondaki ayrı "HTTP+SSE" taşıması bunun yerini almıştır.
Hangi taşımayı kullanırsanız kullanın, üstteki mesajlar aynıdır. Aynı server'ı geliştirirken stdio ile, üretimde HTTP ile çalıştırabilirsiniz.
Bir tool çağrısının yolculuğu
Aşağıdaki akış, kullanıcının "Ankara'daki switch'in uplink portu açık mı?" diye sorduğu bir senaryoyu gösteriyor:
Akışın üç aşaması var:
- Tanışma (initialize): Client ve server desteklenen protokol sürümünü ve yeteneklerini karşılıklı bildirir. Örneğin server "tools sunuyorum ve liste değişirse bildiririm" der.
- Keşif (tools/list): Host, server'ın sunduğu tool'ları öğrenir ve bunları modele tool tanımı olarak verir.
- Çağrı (tools/call): Model bir tool kullanmak istediğinde host çağrıyı server'a iletir, sonucu modelin bağlamına ekler ve model cevabını üretir.
Bir tools/call isteği JSON-RPC olarak şöyle görünür:
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "get_interface_status",
"arguments": { "device": "ank-sw-01", "port": "Ethernet1/49" }
}
}Uzak server'larda yetkilendirme
Yerel bir stdio server'ı, onu başlatan kullanıcının yetkileriyle çalışır. Uzak bir HTTP server'ında ise "bu isteği kim, hangi yetkiyle yapıyor?" sorusunun cevaplanması gerekir. MCP spesifikasyonu bunun için OAuth 2.1 tabanlı bir akış tanımlar:
- MCP server bir resource server gibi davranır; token'ı kendisi üretmez, bir authorization server'ın verdiği token'ı doğrular.
- Client, server'ın hangi authorization server'a güvendiğini standart bir metadata adresinden öğrenir ve kullanıcıyı oturum açmaya yönlendirir.
- Token belirli bir server için (audience) verilir. Server, kendisine gelen token'ı başka bir servise olduğu gibi aktarmamalıdır (token passthrough yasaktır); arka plandaki sisteme kendi adına ayrı bir yetkiyle bağlanmalıdır.
Güvenlik: dikkat edilmesi gerekenler
MCP, modelin dış dünyada işlem yapabilmesini sağladığı için yeni saldırı yüzeyleri de getirir. En sık karşılaşılanlar:
- Prompt injection: Bir tool'un döndürdüğü içerik (bir web sayfası, bir e-posta, bir issue yorumu) modele talimat gibi görünen metin taşıyabilir. Model bu metni kullanıcının isteği sanıp başka bir tool'u çağırabilir.
- Tool poisoning: Kötü niyetli ya da ele geçirilmiş bir server, tool açıklamasının içine modelin göreceği gizli talimatlar koyabilir.
- Aşırı yetki: "Her şeyi yapabilen" tek bir tool, hatalı bir model kararının etkisini büyütür. Okuma ve yazma işlemlerini ayrı tool'lara bölmek ve yazma işlemleri için kullanıcı onayı istemek riski azaltır.
Pratikte bu riskler tek bir katmanda çözülmez. Güvenilir server'ları seçmek, host'ta yazma işlemleri için onay istemek, tool sonuçlarını talimat değil veri olarak ele almak ve çağrıları kimin hangi yetkiyle yaptığını loglamak birlikte uygulanır. Kurumsal ortamlarda bu kontroller çoğu zaman bir AI gateway ve policy katmanında merkezileştirilir.
Nereden başlamalı?
- Kullanıcı olarak: MCP destekleyen bir AI uygulamasına hazır bir server ekleyin (örneğin dosya sistemi veya Git server'ı) ve modelin tool'ları nasıl seçtiğini gözlemleyin.
- Geliştirici olarak: Resmi SDK'lardan biriyle (Python, TypeScript, Java, C#, Go ve diğerleri) tek tool'lu küçük bir server yazın. Önce stdio ile yerelde deneyin, sonra Streamable HTTP'ye taşıyın.
- Mimar olarak: Hangi tool'ların okuma, hangilerinin yazma yaptığını, hangi işlemlerin onay gerektirdiğini ve kimlik bilgisinin nerede tutulacağını server'ı yazmadan önce belirleyin.