MCP (Model Context Protocol) Nedir? Detaylı Rehber

Yayın tarihi:

13 dk okuma

Acar Diveroli
Yazar: Acar Diveroli
LLM küpünden merkezdeki MCP sunucusuna, oradan web, kod ve dosya araçlarına dağılan bağlantılar

Bir yapay zeka asistanının şirket içi belgelere, bir veritabanına, bir kod deposuna ve web'e erişebilmesini istediğinizi düşünün. MCP'den önce bunun yolu, her asistan uygulaması için her araca ayrı bir entegrasyon yazmaktı. Kod editöründeki asistan için bir veritabanı eklentisi, sohbet uygulaması için aynı veritabanının başka bir eklentisi, iç araçlar için üçüncü bir sürüm. Araç sayısı ve uygulama sayısı arttıkça entegrasyon sayısı çarpılarak büyüyordu.

MCP (Model Context Protocol) bu sorunu, bir aracı bir kez "MCP sunucusu" olarak yazıp MCP destekleyen her yapay zeka uygulamasında kullanılabilir hâle getirerek çözer. Bu yazıda MCP'nin ne olduğunu, hangi sorunu çözdüğünü, host-client-server mimarisini, sunucuların sunduğu araç, kaynak ve prompt kavramlarını ve iki standart taşıma yöntemini anlatıyoruz. Ardından bir MCP sunucusunun web verisine nasıl eriştiğini ve proxy'nin bu yapıdaki yerini, protokolün güvenlik risklerini, MCP ile doğrudan API kullanımı arasındaki farkı ve Python ile çalışan en küçük MCP sunucusunu ele alıyoruz.

MCP nedir?

Model Context Protocol, büyük dil modeli uygulamalarının dış veri kaynaklarına ve araçlara bağlanmasını standartlaştıran açık bir protokoldür. Protokolün resmi spesifikasyonu iletişimi JSON-RPC 2.0 mesajlarıyla tanımlar ve kendisini, programlama dili desteğini geliştirme araçları arasında standartlaştıran Language Server Protocol'e (LSP) benzetir. LSP nasıl bir dil desteğinin bir kez yazılıp her editörde kullanılmasını sağladıysa, MCP de bir aracın bir kez yazılıp her MCP destekli yapay zeka uygulamasında kullanılmasını hedefler.

MCP'yi anlamak için iki şeyi ayırmak gerekir:

  • MCP bir model veya bir yapay zeka ürünü değildir. Bir iletişim sözleşmesidir: uygulama ile araç arasındaki mesajların biçimini ve anlamını tanımlar.
  • MCP aracın kendisini yazmaz. Bir veritabanı sorgusu, bir web isteği ya da bir dosya işlemi yine sizin kodunuzdur; MCP bu kodu yapay zeka uygulamalarının keşfedip çağırabileceği bir biçimde sunmanızı sağlar.

Spesifikasyon sürümleri tarihle adlandırılır. Bu yazının hazırlandığı tarihte güncel sürüm 2026-07-28'dir ve önceki sürümlere göre önemli bir değişiklik içerir: protokol durumsuzdur (stateless); her istek kendi protokol sürümünü ve istemci yeteneklerini taşır. Önceki sürümlerde bağlantı başında bir el sıkışma (initialize) ile oturum kuruluyordu. Protokol hızla geliştiği için bir entegrasyon yazmadan önce spesifikasyonun güncel sürümüne bakmanızı öneririz.

MCP hangi sorunu çözer?

MCP'nin çözdüğü sorun "N × M entegrasyon" sorunudur. Beş farklı yapay zeka uygulaması ve on farklı araç varsa, her uygulamanın her araçla konuşabilmesi için elli ayrı entegrasyon gerekir. Her entegrasyon ayrı yazılır, ayrı test edilir ve araç değiştiğinde ayrı güncellenir.

MCP ile bu yapı "N + M" hâline gelir:

  • Her araç bir kez MCP sunucusu olarak yazılır.
  • Her yapay zeka uygulaması bir kez MCP desteği kazanır.
  • MCP destekleyen her uygulama, her MCP sunucusunu kullanabilir.

Bunun pratikteki karşılığı şudur: bir şirket kendi iç bilgi tabanı için bir MCP sunucusu yazdığında, çalışanlar bu bilgi tabanına kod editöründeki asistandan da, masaüstü sohbet uygulamasından da, kendi geliştirdikleri bir ajandan da aynı sunucu üzerinden erişebilir.

Mimari: host, client ve server

Spesifikasyonun mimari bölümü üç rol tanımlar.

BileşenNedir?Görevleri
HostYapay zeka uygulamasının kendisi (kod editörü, sohbet uygulaması, ajan)Client'ları oluşturur ve yönetir, bağlantı izinlerini ve kullanıcı onayını kontrol eder, modeli çağırır, konuşma geçmişini tutar
ClientHost'un içindeki bağlayıcıTam olarak bir sunucuyla konuşur, her isteğe protokol sürümünü ve yeteneklerini ekler, sunucular arasındaki güvenlik sınırını korur
ServerAracı veya veri kaynağını sunan programAraçları, kaynakları ve prompt'ları sunar; yerel bir süreç veya uzak bir servis olabilir

Mimarinin en önemli tasarım ilkelerinden biri izolasyondur: bir sunucu konuşmanın tamamını okuyamaz ve diğer sunucuların içini göremez. Konuşma geçmişi host'ta kalır; sunucuya yalnızca işini yapması için gereken bilgi gönderilir. Sunucular arasındaki etkileşimi de host kontrol eder.

Bir kullanıcının isteğinin bu yapıdan geçişi şöyledir:

  1. Kullanıcı host uygulamasında bir istek yazar.
  2. Host, bağlı sunucuların sunduğu araçların listesini ve açıklamalarını modele verir.
  3. Model bir aracı kullanmaya karar verir ve araç çağrısı üretir.
  4. Host, gerekiyorsa kullanıcıdan onay alır ve çağrıyı ilgili client'a iletir.
  5. Client, isteği sunucuya gönderir; sunucu aracı çalıştırır ve sonucu döner.
  6. Host, sonucu modele verir ve model kullanıcıya yanıt üretir.

Araç çağrısı döngüsünün genel mantığını AI Ajanları Nasıl Çalışır? yazımızda ayrıntılı anlattık.

MCP sunucusu neler sunar?

Bir MCP sunucusu üç temel türde yetenek sunabilir:

  • Tools (araçlar): Modelin çalıştırmasını isteyebileceği fonksiyonlar. Bir web sayfasını getirmek, bir veritabanında sorgu çalıştırmak, bir kayıt oluşturmak. Her aracın bir adı, modelin aracı ne zaman kullanacağını anlamasını sağlayan bir açıklaması ve JSON Schema ile tanımlanmış parametreleri vardır.
  • Resources (kaynaklar): Kullanıcının veya modelin bağlam olarak kullanabileceği veriler. Bir dosyanın içeriği, bir veritabanı şeması, bir belge. Araçların aksine eylem yapmaz, bilgi sunar.
  • Prompts (prompt şablonları): Kullanıcının seçebileceği hazır mesaj şablonları ve iş akışları. Örneğin "bu hata kaydını analiz et" gibi parametreli bir şablon.

Sunucular, bir isteği tamamlamak için istemciden ek girdi de isteyebilir: kullanıcıdan eksik bir bilginin sorulması (elicitation) veya host'un modelinden bir metin üretilmesi (sampling) gibi. Güncel spesifikasyonda bu istekler sunucunun yanıtı içinde iletilir.

Protokolün çekirdeğine ek olarak, uzun süren işlerin yönetimi veya sohbet içinde etkileşimli arayüz öğeleri gibi özellikler isteğe bağlı eklentiler (extensions) olarak tanımlanır; bunları hem istemcinin hem sunucunun açıkça desteklemesi gerekir.

Taşıma: stdio ve Streamable HTTP

MCP mesajlarının iki taraf arasında nasıl taşınacağını spesifikasyonun taşıma katmanı bölümü tanımlar. İki standart yöntem vardır:

ÖlçütstdioStreamable HTTP
Nasıl çalışır?Client sunucuyu bir alt süreç olarak başlatır; mesajlar standart giriş ve çıkış üzerinden satır satır akarHer mesaj tek bir MCP uç noktasına HTTP POST olarak gönderilir; yanıt JSON nesnesi veya isteğe özel bir SSE akışı olarak döner
Sunucu nerede çalışır?Kullanıcının bilgisayarında, host ile aynı makinedeUzak bir sunucuda veya bulutta
Kimlik doğrulamaİşletim sistemi kullanıcısının yetkileriyle çalışırHTTP düzeyinde, genellikle OAuth tabanlı yetkilendirme
Tipik kullanımYerel dosyalar, yerel geliştirme araçları, kişisel kullanımEkip ve şirket genelinde paylaşılan servisler
İptalİptal bildirimi gönderilirİsteğin yanıt akışı kapatılır

Protokolün anlamı iki yöntemde de aynıdır; yalnızca mesajların iletilme biçimi değişir. Özel ihtiyaçlar için başka taşıma yöntemleri de tanımlanabilir.

stdio ile çalışan bir sunucunun, onu başlatan kullanıcının bütün yetkileriyle çalıştığını unutmamak gerekir. Bilgisayarınıza kurduğunuz bir MCP sunucusu, dosyalarınıza ve ağınıza sizin erişebildiğiniz ölçüde erişebilir.

Bir MCP sunucusu web verisine nasıl erişir?

Yapay zeka uygulamalarının en çok ihtiyaç duyduğu yeteneklerden biri güncel web verisidir. Bir MCP sunucusu bunu genellikle üç yoldan biriyle sağlar:

  • Arama aracı: Bir arama API'sine sorgu gönderir, başlık ve adres listesi döndürür.
  • Sayfa getirme aracı: Belirli bir adresi HTTP istemcisiyle çeker, metnini döndürür.
  • Tarayıcı aracı: Headless bir tarayıcıyı yönetir; JavaScript ile yüklenen sayfaları açar, tıklar, ekran görüntüsü alır.

Bu araçların ağ tarafı sıradan HTTP istekleridir ve web scraping'deki bütün kurallar burada da geçerlidir. Proxy bu yapıda sunucunun dışarıya çıkış noktasında durur:

  • Konum: Sunucu, bir ürünün veya içeriğin belirli bir ülkeden nasıl göründüğünü getirmek için o ülkeden çıkan bir adres kullanır. Gerçek ev bağlantısı görünümü gereken işlerde Residential Proxy tercih edilir.
  • Yük dağıtımı: Çok sayıda farklı herkese açık sayfa getiren bir araç, istekleri tek adres üzerinden farklı çıkış IP'lerine dağıtmak için Rotating Proxy kullanabilir; hız sınırları ve site kuralları yine geçerlidir.
  • Çıkış kontrolü ve kayıt: Sunucunun hangi alan adlarına eriştiği tek bir noktadan izlenir ve sınırlanır.
  • İzolasyon: Sunucunun web trafiği, şirketin iç ağından ve ana IP adreslerinden ayrı tutulur.

Bir web erişim aracını izin listesi, hız sınırı, iç ağ engeli ve içerik temizleme ile güvenli hâle getirmeyi LLM'e Güvenli Web Erişimi: Hız Sınırı ve İzinler yazımızda denenmiş bir örnekle anlattık. Genel veri toplama kurgusu için veri kazıma çözümü sayfamıza bakabilirsiniz.

En küçük MCP sunucusu

Aşağıdaki örnek, resmi Python SDK ile yazılmış, tek araç sunan bir MCP sunucusudur. Araç, yalnızca izin verilen alan adlarındaki HTTPS sayfalarını getirir ve isteği isteğe bağlı bir çıkış proxy'si üzerinden gönderir. SDK'nın 2. sürümünde sunucu sınıfının adı MCPServer'dır; 1. sürümdeki FastMCP örnekleri bu sürümde doğrudan çalışmaz.

bash
pip install mcp httpx
python
# sunucu.py
import os
from urllib.parse import urlsplit

import httpx
from mcp.server.mcpserver import MCPServer

IZINLI = {a.strip().lower() for a in os.environ.get("IZINLI_ALANLAR", "ornek.com").split(",")}
PROXY = os.environ.get("CIKIS_PROXY")  # örn. http://kullanici:parola@pr.proxynet.io:8000

mcp = MCPServer("web-okuyucu")


@mcp.tool()
async def sayfa_getir(url: str) -> str:
    """İzin verilen alan adlarındaki bir sayfanın ilk 5.000 karakterini döndürür."""
    parca = urlsplit(url)
    if parca.scheme != "https" or (parca.hostname or "").lower() not in IZINLI:
        return f"Bu adres izin listesinde değil: {url}"
    async with httpx.AsyncClient(proxy=PROXY, timeout=15, follow_redirects=False) as client:
        yanit = await client.get(url, headers={"User-Agent": "OrnekMCP/1.0"})
    return yanit.text[:5000]


if __name__ == "__main__":
    mcp.run(transport="stdio")

Fonksiyonun adı aracın adı, belge dizesi aracın açıklaması, tür ipuçları da parametre şeması olur. SDK bunları otomatik olarak MCP araç tanımına çevirir.

Sunucuyu bir istemciden çağırmak için:

python
# istemci.py
import asyncio
import sys

from mcp.client.session import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_client

SUNUCU = StdioServerParameters(
    command=sys.executable,
    args=["sunucu.py"],
    env={"IZINLI_ALANLAR": "ornek.com", "CIKIS_PROXY": "http://kullanici:parola@pr.proxynet.io:8000"},
)


async def main():
    async with stdio_client(SUNUCU) as (read, write):
        async with ClientSession(read, write) as session:
            await session.discover()  # sunucunun sürümünü ve yeteneklerini öğren
            araclar = await session.list_tools()
            print([a.name for a in araclar.tools])

            sonuc = await session.call_tool("sayfa_getir", {"url": "https://ornek.com/"})
            print(sonuc.content[0].text[:200])


asyncio.run(main())

İki ayrıntıya dikkat edin. Birincisi, istemci araçları listelemeden önce discover() ile sunucunun desteklediği protokol sürümünü ve yeteneklerini öğrenir; bu adım atlandığında sunucu isteği geçersiz parametre hatasıyla reddeder. Eski protokol sürümlerini kullanan sunucular için SDK'da initialize() çağrısı da bulunur. İkincisi, SDK stdio sunucusunu başlatırken ortam değişkenlerinin tamamını değil, yalnızca PATH gibi sınırlı bir listeyi aktarır; sunucunun ihtiyaç duyduğu IZINLI_ALANLAR ve CIKIS_PROXY gibi değerler env parametresiyle açıkça verilmelidir.

Gerçek kullanımda istemciyi siz yazmazsınız; sunucuyu MCP destekleyen bir host uygulamasının ayarlarına eklersiniz ve host onu kendisi başlatır. Bu örnek istemci, sunucunun doğru çalıştığını test etmek için yeterlidir.

Örnek bilinçli olarak küçüktür. Üretimde bu aracın içine hız sınırı, iç ağ adresi kontrolü, yanıt boyutu sınırı ve içerik temizleme eklenmelidir.

Güvenlik riskleri

MCP araçlarının keyfi kod çalıştırabilmesi ve dış kaynaklardan içerik getirebilmesi, protokolü güçlü kıldığı kadar riskli de kılar. Spesifikasyonun kendisi, kullanıcı onayını, veri gizliliğini ve araç güvenliğini temel ilkeler olarak sayar ve host'ların bir aracı çağırmadan önce kullanıcıdan açık onay almasını ister. Başlıca riskler şunlardır:

  • Araç zehirleme (tool poisoning). Modelin bir aracı nasıl kullanacağına araç açıklamasına bakarak karar verdiği için, kötü niyetli bir sunucu açıklamanın içine modele yönelik gizli talimatlar koyabilir. Spesifikasyon, güvenilir bir sunucudan gelmedikçe araç açıklamalarının ve açıklama niteliklerinin güvenilmeyen içerik olarak ele alınmasını belirtir.
  • Aşırı yetki. Bir sunucuya gerektiğinden fazla erişim vermek: yalnızca okuma gereken bir işte yazma yetkisi, tek bir klasör yerine bütün dosya sistemi, tek bir veritabanı tablosu yerine yönetici hesabı.
  • Araç sonuçlarıyla prompt injection. Bir sayfa getirme aracının döndürdüğü içerik, modele talimat gibi görünen metinler taşıyabilir. Model bu talimatları izleyerek başka bir sunucudaki bir aracı çağırabilir.
  • Kimlik belirtecinin aktarılması. Bir MCP sunucusunun kendisine gönderilen erişim belirtecini doğrulamadan başka servislere iletmesi, yetki kontrollerinin atlanmasına yol açabilir. Protokolün güvenlik önerileri belgesi bu tür belirteç aktarımını açıkça yasaklar ve sunucuların yalnızca kendileri için verilmiş belirteçleri kabul etmesini ister.
  • SSRF. Kötü niyetli bir sunucu, istemcinin yetkilendirme sürecinde iç ağ adreslerine veya bulut meta veri adreslerine istek göndermesine yol açabilir.
  • Güvenilmeyen yerel sunucular. stdio sunucuları kullanıcının yetkileriyle çalıştığı için, kaynağı doğrulanmamış bir sunucuyu kurmak, doğrulanmamış bir programı çalıştırmakla aynıdır.

Pratik önlemler:

  • Yalnızca kaynağını bildiğiniz ve kodunu inceleyebildiğiniz sunucuları kurun.
  • Her sunucuya en az yetkiyi verin; yazma ve silme gibi eylemleri ayrı araçlara ayırın.
  • Yan etkili araç çağrılarında kullanıcı onayını kapatmayın.
  • Web içeriği getiren araçların çıktısını güvenilmeyen veri olarak işaretleyin.
  • Uzak sunucularda belirteç hedef kitlesini doğrulayın, belirteç aktarmayın.
  • Araç çağrılarını kaydedin ve beklenmeyen çağrı dizilerini izleyin.

MCP ile API arasındaki fark

MCP bir API'nin yerine geçmez; çoğu MCP sunucusu zaten bir API'yi sarmalar. Aradaki fark, kimin için tasarlandıklarındadır.

ÖlçütDoğrudan API kullanımıMCP sunucusu
TüketiciGeliştiricinin yazdığı uygulama koduYapay zeka host uygulaması ve model
KeşifBelgeyi okuyan geliştiriciHost, araç listesini ve şemaları çalışma anında alır
Çağrıyı kim başlatır?Kod, önceden tanımlı mantıklaModel, duruma göre karar vererek
Entegrasyon sayısıHer uygulama için ayrıBir kez yazılır, her MCP host'unda kullanılır
ÖngörülebilirlikYüksekModelin kararına bağlı
Güvenlik modeliUygulamanın kendi yetkilendirmesiHost onayı, sunucu izolasyonu, en az yetki
Uygun olduğu işSabit iş akışları, sistemler arası entegrasyonYapay zeka asistanlarına ve ajanlara yetenek kazandırmak

MCP mi, doğrudan API mi?

DurumunuzÖneri
Kendi uygulamanızın kodu belirli bir servisi sabit bir akışla çağırıyorDoğrudan API
Bir aracı birden fazla yapay zeka uygulamasında kullanmak istiyorsunuzMCP sunucusu
Modelin hangi aracı ne zaman kullanacağına kendisinin karar vermesi gerekiyorMCP sunucusu
İşlem geri alınamaz ve her adımda kesin kontrol gerekiyorDoğrudan API, gerekirse onaylı MCP aracı
Şirket içi bir kaynağı çalışanların asistanlarına açmakUzak MCP sunucusu, yetkilendirme ile
Tek bir yerel geliştirme aracıYerel stdio MCP sunucusu

Kullanım senaryoları

  • Geliştirici araçları: Kod editöründeki asistanın kod deposunu, hata kayıtlarını ve dokümantasyonu okuyabilmesi.
  • Şirket içi bilgi erişimi: Çalışanların asistanlarının iç wiki, destek kayıtları ve ürün belgelerinde arama yapabilmesi.
  • Veri analizi: Bir veritabanını salt okunur bir MCP sunucusu olarak sunup analistlerin doğal dille sorgu yapması.
  • Web araştırması: İzin listeli, hız sınırlı bir sayfa getirme aracıyla ajanların güncel bilgiye erişmesi. Dil modellerinin web verisinden yapılandırılmış bilgi çıkarmada nasıl kullanılabileceğine bir örnek GPT-6 Astra ile Web Scraping yazımızda.
  • Operasyon araçları: İzleme sistemlerinden metrik okuyup olay özetleri çıkarmak; müdahale eylemleri ayrı ve onaylı araçlarda.

Sık yapılan hatalar

  • Kaynağı bilinmeyen sunucuları kurmak. Bir MCP sunucusu kurmak, bir programı çalıştırmakla aynı güveni gerektirir.
  • Tek sunucuya bütün yetkileri vermek. Okuma ve yazma araçlarını ayırmamak.
  • Araç açıklamalarını kısa ve belirsiz yazmak. Model aracı yanlış durumda çağırır.
  • Araç sonuçlarını güvenilir içerik saymak. Web ve belge içerikleri talimat taşıyabilir.
  • Onay adımlarını kapatmak. Özellikle yan etkili araçlarda kullanıcı onayı temel güvenlik katmanıdır.
  • Spesifikasyon sürümünü kontrol etmemek. Protokol hızla geliştiği için eski sürümlere göre yazılmış örnekler güncel SDK'larla çalışmayabilir.

Sık sorulan sorular

MCP'yi kim geliştirdi?

MCP, Anthropic tarafından açık bir protokol olarak duyuruldu ve spesifikasyonu, SDK'ları ve belgeleriyle açık kaynak bir proje olarak geliştiriliyor. Protokolü farklı şirketlerin yapay zeka uygulamaları ve araçları destekliyor.

MCP yalnızca belirli bir yapay zeka modeliyle mi çalışır?

Hayır. MCP, uygulama ile araç arasındaki iletişimi tanımlar ve modelden bağımsızdır. Host uygulaması hangi modeli kullanıyorsa, MCP sunucularının araçlarını o modele sunar.

MCP sunucusu yazmak için hangi dilleri kullanabilirim?

Proje, Python ve TypeScript başta olmak üzere birçok dil için resmi SDK sunar. Protokol JSON-RPC tabanlı olduğu için SDK'sı olmayan bir dilde de spesifikasyona uyarak sunucu yazılabilir.

MCP ile function calling arasındaki fark nedir?

Function calling, bir modelin yapılandırılmış araç çağrısı üretme yeteneğidir ve model sağlayıcısının API'sine özgüdür. MCP ise bu araçların uygulamalar arasında standart bir biçimde tanımlanmasını, keşfedilmesini ve çağrılmasını sağlayan protokoldür. Host, MCP sunucularından aldığı araçları modele function calling ile sunar.

Yerel ve uzak MCP sunucusu arasında nasıl seçim yapmalıyım?

Kişisel kullanım ve yerel dosyalara erişim için stdio ile çalışan yerel sunucu yeterlidir. Bir ekibin veya şirketin paylaşacağı, merkezi olarak yönetilmesi ve yetkilendirilmesi gereken araçlar için Streamable HTTP ile çalışan uzak sunucu uygundur.

MCP sunucusu web'e erişirken proxy nasıl kullanılır?

Proxy, sunucunun içinde HTTP istemcisine veya tarayıcıya verilir; MCP protokolünün kendisiyle ilgili değildir. Yukarıdaki örnekte proxy adresi bir ortam değişkeninden okunup HTTP istemcisine aktarılır. Böylece sunucunun bütün web trafiği kontrollü bir çıkış noktasından geçer.

Özetle

MCP, yapay zeka uygulamalarını araçlara ve veri kaynaklarına standart bir yolla bağlayan açık bir protokoldür. Host uygulaması içindeki her client bir sunucuya bağlanır; sunucular araçlar, kaynaklar ve prompt şablonları sunar; mesajlar stdio veya Streamable HTTP üzerinden JSON-RPC ile taşınır. Güncel spesifikasyon durumsuz bir yapıya geçmiştir ve protokol hızla gelişmektedir. Araçların kod çalıştırabilmesi ve dış içerik getirebilmesi nedeniyle en az yetki, kullanıcı onayı, güvenilmeyen içerik yönetimi ve kayıt tutma tasarımın parçası olmalıdır. MCP sunucularınızın web erişimini konum ve çıkış kontrolüyle yönetmek için proxy hizmetlerimize göz atabilirsiniz.

ChatGPT'ye sorClaude'a sor