# MCP (Model Context Protocol): AI Entegrasyon Standardı
Yapay zeka modellerinin en büyük sınırlaması uzun süredir izole çalışmaları oldu. Bir LLM ne kadar akıllı olursa olsun, dış dünyayla etkileşim kuramadığı sürece gerçek değer üretmekte zorlanıyor. İşte Model Context Protocol (MCP), Anthropic tarafından geliştirilen ve bu sorunu kökten çözen açık bir standart. USB-C'nin cihazlar arası bağlantıyı standartlaştırması gibi, MCP de AI modelleri ile dış araçlar, veri kaynakları ve servisler arasındaki iletişimi standartlaştırıyor. 2025'in sonlarında tanıtılan ve 2026'da hızla benimsenen MCP, yapay zeka ekosisteminin temel altyapı protokolü olmaya aday. Bu rehberde MCP'nin mimarisinden transport layer detaylarına, kendi server'ini yazmaktan production kullanımına kadar her şeyi ele alacağız.
💡 Pro Tip: MCP sadece Claude Code'a özgü değil — OpenAI, Google ve diğer AI sağlayıcıları da desteğe başladı. Bu bir firma standardı değil, endüstri standardı haline geliyor. Şimdiden öğrenmek, tüm AI araçlarıyla çalışma yetkinliğini artırır.
İçindekiler
- MCP Nedir ve Neden Önemli?
- Mimari: Server, Client ve Host
- Transport Layer: stdio, SSE ve Streamable HTTP
- Tool Tanımlama ve Kullanım
- Resource ve Prompt Sharing
- Kendi MCP Server'ini Yazma
- Güvenlik ve Best Practices
- Ekosistem ve Popüler Server'lar
- Sonuç ve Öneriler
1. MCP Nedir ve Neden Önemli?
MCP (Model Context Protocol), AI uygulamalarının harici veri kaynaklarına ve araçlara güvenli bir şekilde bağlanmasını sağlayan açık bir standarttır. Anthropic tarafından Kasım 2024'te duyuruldu ve açık kaynak olarak yayınlandı.
Temel Problem: N × M Entegrasyon Karmaşası
MCP olmadan, her AI uygulaması her araca özel bir entegrasyon yazmalıydı. 10 AI uygulaması ve 10 araç demek, 100 ayrı entegrasyon demek. MCP ile bu 10 + 10 = 20 entegrasyona düşüyor.
typescript
1// MCP ÖNCESİ: Her AI-araç çifti için özel kod2// N uygulama × M araç = N×M entegrasyon 😱3const integrations = {4 'claude + github': customGithubIntegration(),5 'claude + slack': customSlackIntegration(),6 'chatgpt + github': anotherGithubIntegration(),7 'chatgpt + slack': anotherSlackIntegration(),8 // ... 100 entegrasyon9};10 11// MCP SONRASI: Standart protokol12// N uygulama × 1 protokol + M araç × 1 protokol = N+M entegrasyon 🎉13const mcpServer = new MCPServer('github'); // 1 kez yaz14// Tüm MCP-uyumlu AI client'ları otomatik bağlanırUSB-C Analojisi
MCP'yi anlamanın en iyi yolu USB-C analojisidir:
- USB-C öncesi:: Her cihazın farklı şarj kablosu (Lightning, Micro USB, barrel jack...)
- USB-C sonrası:: Tek kablo, tüm cihazlar
- MCP öncesi:: Her AI-araç çifti için özel entegrasyon
- MCP sonrası:: Tek protokol, tüm AI'lar ve araçlar
Kavram | USB-C Dünyası | MCP Dünyası |
|---|---|---|
**Protokol** | USB-C spesifikasyonu | MCP spesifikasyonu |
**Host** | Bilgisayar | AI uygulaması (Claude Desktop, VS Code) |
**Client** | USB-C portu | MCP client (her host'ta en az 1) |
**Server** | USB-C cihaz | MCP server (GitHub, Slack, DB) |
**Transport** | Kablo türü (Thunderbolt, USB 3.2) | stdio, SSE, Streamable HTTP |
**Capabilities** | Güç, veri, video | Tools, resources, prompts |
2. Mimari: Server, Client ve Host
MCP üç temel bileşenden oluşur: Host, Client ve Server.
Host (Ana Uygulama)
Host, kullanıcının doğrudan etkileşimde olduğu AI uygulamasıdır. Claude Desktop, VS Code (Copilot), Cursor, Windsurf gibi uygulamalar birer Host'tur.
Client (Bağlantı Yöneticisi)
Her Host, her MCP Server için bir Client oluşturur. Client, Server ile 1:1 bağlantı kurar ve protokol seviyesindeki iletişimi yönetir.
Server (Araç/Veri Sağlayıcı)
Server, spesifik bir yeteneği veya veri kaynağını MCP protokolü üzerinden sunar. GitHub server'ı repo işlemleri, PostgreSQL server'ı veritabanı sorguları, Slack server'ı mesajlaşma yetenekleri sunar.
typescript
1// MCP bileşenleri arası iletişim akışı2interface MCPArchitecture {3 host: {4 name: 'Claude Desktop' | 'VS Code' | 'Cursor';5 role: 'Kullanıcı arayüzü, AI model bağlantısı';6 manages: MCPClient[]; // Birden fazla client yönetir7 };8 9 client: {10 role: '1:1 server bağlantısı, protokol yönetimi';11 capabilities: {12 roots: boolean; // Dosya sistemi kök dizinleri13 sampling: boolean; // AI model çağrısı yapabilme14 };15 };16 17 server: {18 role: 'Araç/veri sağlama';19 exposes: {20 tools: Tool[]; // Çalıştırılabilir fonksiyonlar21 resources: Resource[]; // Okunabilir veri kaynakları22 prompts: Prompt[]; // Önceden tanımlı prompt şablonları23 };24 };25}26 27// İletişim akışı:28// Kullanıcı → Host → Client → Server → Dış Araç/Veri29// Dış Araç/Veri → Server → Client → Host → AI Model → KullanıcıCapability Negotiation
Bağlantı kurulduğunda Host ve Server birbirlerinin yeteneklerini müzakere eder. Bu sayede uyumsuzluk durumlarında graceful degradation sağlanır.
💡 Pro Tip: MCP mimarisinde her Server izole çalışır — bir Server'ın çökmesi diğerlerini etkilemez. Bu, iOS App Architecture yazımda anlattığım modüler mimari prensibiyle birebir örtüşür. Her modül bağımsız, her hata izole.
3. Transport Layer: stdio, SSE ve Streamable HTTP
MCP üç transport mekanizması destekler. Her birinin avantajları ve kullanım alanları farklıdır.
3.1 stdio (Standard Input/Output)
En basit ve en yaygın transport. Server bir subprocess olarak çalışır, stdin/stdout üzerinden JSON-RPC mesajları alıp verir.
typescript
1// stdio transport ile MCP Server2import { Server } from '@modelcontextprotocol/sdk/server/index.js';3import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';4 5const server = new Server(6 { name: 'my-tool-server', version: '1.0.0' },7 { capabilities: { tools: {} } }8);9 10// Tool tanımla11server.setRequestHandler('tools/list', async () => ({12 tools: [13 {14 name: 'get_weather',15 description: 'Belirtilen şehrin hava durumunu getirir',16 inputSchema: {17 type: 'object',18 properties: {19 city: { type: 'string', description: 'Şehir adı' },20 unit: { type: 'string', enum: ['celsius', 'fahrenheit'] },21 },22 required: ['city'],23 },24 },25 ],26}));27 28// Tool çalıştır29server.setRequestHandler('tools/call', async (request) => {30 if (request.params.name === 'get_weather') {31 const { city, unit = 'celsius' } = request.params.arguments;32 const weather = await fetchWeather(city, unit);33 return {34 content: [35 { type: 'text', text: JSON.stringify(weather, null, 2) },36 ],37 };38 }39 throw new Error('Bilinmeyen tool');40});41 42// Sunucuyu başlat43const transport = new StdioServerTransport();44await server.connect(transport);Avantajları: Basit, güvenli (subprocess izolasyonu), lokal kullanım için ideal
Dezavantajları: Sadece lokal, uzak bağlantı yok
3.2 SSE (Server-Sent Events)
HTTP tabanlı, tek yönlü streaming. Server → Client yönünde event stream, Client → Server yönünde HTTP POST.
Avantajları: Uzak bağlantı, firewall dostu
Dezavantajları: Tek yönlü stream, bağlantı yönetimi karmaşık
3.3 Streamable HTTP (Yeni Standart)
MCP'nin en güncel ve önerilen transport mekanizması. Çift yönlü streaming, session yönetimi ve otomatik yeniden bağlanma desteği.
typescript
1// Streamable HTTP transport2import { StreamableHTTPServerTransport } from3 '@modelcontextprotocol/sdk/server/streamableHttp.js';4import express from 'express';5 6const app = express();7 8app.post('/mcp', async (req, res) => {9 const transport = new StreamableHTTPServerTransport('/mcp', res);10 await server.connect(transport);11 await transport.handleRequest(req, res);12});13 14// Session yönetimi15app.get('/mcp', async (req, res) => {16 // SSE stream (server → client bildirimleri)17 const transport = new StreamableHTTPServerTransport('/mcp', res);18 await transport.handleSSERequest(req, res);19});20 21app.delete('/mcp', async (req, res) => {22 // Session sonlandırma23 const sessionId = req.headers['mcp-session-id'];24 await sessionManager.terminate(sessionId);25 res.status(200).end();26});27 28app.listen(3001, () => console.log('MCP Server: http://localhost:3001/mcp'));Transport Karşılaştırma
Özellik | stdio | SSE | Streamable HTTP |
|---|---|---|---|
**Bağlantı** | Lokal | Uzak | Uzak |
**Yön** | Çift yönlü (pipe) | Tek yönlü + POST | Çift yönlü |
**Session** | Process ömrü | Manuel | Otomatik |
**Yeniden bağlanma** | Hayır | Manuel | Otomatik |
**Güvenlik** | OS izolasyonu | HTTPS + Auth | HTTPS + OAuth |
**Kullanım** | CLI araçları, IDE | Web servisleri | Production API |
4. Tool Tanımlama ve Kullanım
MCP'nin en güçlü özelliği Tool sistemidir. Tool'lar, AI modelinin çağırabileceği fonksiyonlardır.
Tool Anatomisi
typescript
1// MCP Tool yapısı2interface MCPTool {3 // Benzersiz isim4 name: string;5 6 // AI modelin anlayacağı açıklama7 description: string;8 9 // JSON Schema ile parametre tanımı10 inputSchema: {11 type: 'object';12 properties: Record; 13 required?: string[];14 };15 16 // Opsiyonel: İnsan onayı gerektiren tehlikeli işlemler17 annotations?: {18 destructiveHint?: boolean; // Silme, değiştirme19 idempotentHint?: boolean; // Tekrar çağrılabilir20 readOnlyHint?: boolean; // Sadece okuma21 openWorldHint?: boolean; // Dış dünyayla etkileşim22 };23}24 25// Gerçek dünya örneği: Firestore MCP Tool'ları26const firestoreTools: MCPTool[] = [27 {28 name: 'firestore_query',29 description: 'Firestore koleksiyonundan belge sorgula. Filtre, sıralama ve limit destekler.',30 inputSchema: {31 type: 'object',32 properties: {33 collection: { type: 'string', description: 'Koleksiyon adı (ör: blog_posts)' },34 where: {35 type: 'array',36 items: {37 type: 'object',38 properties: {39 field: { type: 'string' },40 op: { type: 'string', enum: ['==', '!=', '<', '>', '<=', '>=', 'in', 'array-contains'] },41 value: {},42 },43 },44 description: 'Filtre koşulları',45 },46 orderBy: { type: 'string', description: 'Sıralama alanı' },47 limit: { type: 'number', description: 'Maksimum belge sayısı' },48 },49 required: ['collection'],50 },51 annotations: { readOnlyHint: true, idempotentHint: true },52 },53 {54 name: 'firestore_write',55 description: 'Firestore koleksiyonuna belge yaz veya güncelle.',56 inputSchema: {57 type: 'object',58 properties: {59 collection: { type: 'string' },60 documentId: { type: 'string', description: 'Belge ID (opsiyonel, otomatik üretilir)' },61 data: { type: 'object', description: 'Yazılacak veri' },62 merge: { type: 'boolean', description: 'Mevcut belgeyle birleştir' },63 },64 required: ['collection', 'data'],65 },66 annotations: { destructiveHint: true, idempotentHint: false },67 },68];Tool annotations sayesinde AI modeli, bir tool'u çağırmadan önce kullanıcıya onay sorabilir. iOS Security yazımda anlattığım "least privilege" prensibiyle örtüşen bu yaklaşım, güvenli AI entegrasyonunun temelini oluşturuyor.
💡 Pro Tip: Tool description'ları AI modelin karar vermesinde kritik rol oynar. "Veritabanı sorgula" yerine "Firestore koleksiyonundan belge sorgula. Filtre, sıralama ve limit destekler. Sadece okuma yapar, veri değiştirmez." gibi detaylı açıklamalar yaz. AI model daha doğru karar verir.
5. Resource ve Prompt Sharing
MCP sadece tool'lardan ibaret değil. Resource ve Prompt primitifleri de güçlü yetenekler sunuyor.
Resources (Veri Kaynakları)
Resource'lar, AI modeline okunabilir veri sunar. Dosya içerikleri, veritabanı kayıtları, API yanıtları vb.
typescript
1// Resource tanımlama2server.setRequestHandler('resources/list', async () => ({3 resources: [4 {5 uri: 'config://app-settings',6 name: 'Uygulama Ayarları',7 description: 'Mevcut uygulama konfigürasyonu',8 mimeType: 'application/json',9 },10 {11 uri: 'db://users/active',12 name: 'Aktif Kullanıcılar',13 description: 'Son 30 günde aktif olan kullanıcı listesi',14 mimeType: 'application/json',15 },16 ],17}));18 19// Resource içeriğini oku20server.setRequestHandler('resources/read', async (request) => {21 const { uri } = request.params;22 23 if (uri === 'config://app-settings') {24 return {25 contents: [26 {27 uri,28 mimeType: 'application/json',29 text: JSON.stringify(getAppSettings()),30 },31 ],32 };33 }34});Prompts (Şablon İstemleri)
Prompt'lar, önceden tanımlı ve parametrize edilebilir istem şablonlarıdır. Kullanıcı seçebilir, AI model otomatik kullanabilir. WebSocket Real-Time yazımda anlattığım istemci-sunucu iletişim kalıpları burada da geçerli — Resource'lar read-only, Tool'lar ise write yetenekli.
6. Kendi MCP Server'ini Yazma
Kendi MCP Server'ini yazmak düşündüğünden kolay. İşte adım adım rehber.
Proje Oluşturma
typescript
1// package.json2// {3// "name": "my-mcp-server",4// "version": "1.0.0",5// "type": "module",6// "dependencies": {7// "@modelcontextprotocol/sdk": "^1.12.0"8// }9// }10 11// index.ts — Tam çalışan MCP Server örneği12import { Server } from '@modelcontextprotocol/sdk/server/index.js';13import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';14 15const server = new Server(16 { name: 'portfolio-helper', version: '1.0.0' },17 {18 capabilities: {19 tools: {},20 resources: {},21 },22 }23);24 25// Tool: Blog arama26server.setRequestHandler('tools/list', async () => ({27 tools: [28 {29 name: 'search_blogs',30 description: 'Blog yazılarında anahtar kelime araması yapar',31 inputSchema: {32 type: 'object',33 properties: {34 query: { type: 'string', description: 'Arama sorgusu' },35 category: { type: 'string', description: 'Kategori filtresi' },36 limit: { type: 'number', description: 'Sonuç limiti', default: 5 },37 },38 required: ['query'],39 },40 },41 {42 name: 'get_project_stats',43 description: 'Proje istatistiklerini getirir (indirme, puan, kullanıcı)',44 inputSchema: {45 type: 'object',46 properties: {47 projectSlug: { type: 'string' },48 },49 required: ['projectSlug'],50 },51 },52 ],53}));54 55// Tool handler56server.setRequestHandler('tools/call', async (request) => {57 const { name, arguments: args } = request.params;58 59 switch (name) {60 case 'search_blogs': {61 const results = await searchBlogs(args.query, args.category, args.limit);62 return {63 content: [{ type: 'text', text: JSON.stringify(results, null, 2) }],64 };65 }66 case 'get_project_stats': {67 const stats = await getProjectStats(args.projectSlug);68 return {69 content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],70 };71 }72 default:73 throw new Error(`Bilinmeyen tool: ${name}`);74 }75});76 77// Başlat78const transport = new StdioServerTransport();79await server.connect(transport);Flutter Clean Architecture yazımda anlattığım katmanlı mimari burada da geçerli: Server → Handler → Service → Data Source. Her katman tek sorumluluk prensibiyle çalışıyor.
7. Güvenlik ve Best Practices
MCP server'ları güçlü yetenekler sunduğu için güvenlik kritik.
Güvenlik Prensipleri
typescript
1// MCP güvenlik katmanları2interface MCPSecurityModel {3 // 1. Transport güvenliği4 transport: {5 localOnly: 'stdio'; // Lokal = en güvenli6 remote: 'HTTPS + mTLS'; // Uzak = şifreli + karşılıklı auth7 authentication: 'OAuth 2.1'; // Token tabanlı kimlik doğrulama8 };9 10 // 2. Yetkilendirme11 authorization: {12 principle: 'least privilege'; // Minimum yetki13 toolLevel: 'per-tool-permission'; // Her tool için ayrı izin14 userApproval: 'destructive-ops'; // Yıkıcı işlemler = onay15 };16 17 // 3. Girdi doğrulama18 inputValidation: {19 schema: 'JSON Schema strict'; // Katı şema doğrulama20 sanitization: 'injection-prevention'; // Enjeksiyon önleme21 rateLimiting: 'per-client-per-tool'; // İstemci+tool bazlı limit22 };23 24 // 4. Çıktı kontrolü25 outputControl: {26 dataMinimization: true; // Gereken minimum veriyi döndür27 piiRedaction: true; // Kişisel veri maskeleme28 sizeLimit: '10MB'; // Yanıt boyut limiti29 };30}En İyi Pratikler
- Input doğrulama: Her parametre için JSON Schema kullan, tip kontrolü yap
- Least privilege: Server'a sadece gerekli yetkileri ver
- Audit logging: Tüm tool çağrılarını logla
- Rate limiting: Kötüye kullanımı önle
- Data minimization: Gereken minimum veriyi döndür
- Sandbox: Tehlikeli işlemleri izole ortamda çalıştır
💡 Pro Tip: MCP Server'ını production'a almadan önce OWASP API Security Top 10 listesini kontrol et. MCP temelde bir API — aynı güvenlik riskleri geçerli. Özellikle Injection (parametre manipülasyonu) ve Broken Authentication (token sızıntısı) risklerine karşı dikkatli ol.
8. Ekosistem ve Popüler Server'lar
MCP ekosistemi hızla büyüyor. İşte en popüler server'lar ve kullanım alanları.
Resmi ve Topluluk Server'ları
Server | Geliştirici | Kullanım Alanı | Transport |
|---|---|---|---|
**GitHub** | Anthropic | Repo, PR, Issue yönetimi | stdio |
**PostgreSQL** | Anthropic | Veritabanı sorguları | stdio |
**Slack** | Anthropic | Mesajlaşma, kanal yönetimi | stdio |
**Playwright** | Microsoft | Web tarayıcı otomasyonu | stdio |
**Firebase** | Topluluk | Firestore/Auth/Storage | stdio |
**Figma** | Topluluk | Tasarım dosyası okuma | stdio |
**Notion** | Topluluk | Sayfa/veritabanı yönetimi | stdio |
**Context7** | Topluluk | Kütüphane dokümantasyonu | stdio |
**Sequential Thinking** | Anthropic | Yapılandırılmış düşünme | stdio |
**21st Magic** | 21st.dev | UI component arama | stdio |
Ekosistem Büyüme Trendi
MCP GitHub deposuna göre:
- Server sayısı:: 1000+ (Şubat 2026)
- Haftalık yeni server:: 50-80
- Destekleyen IDE'ler:: Claude Desktop, VS Code, Cursor, Windsurf, Zed
- SDK dilleri:: TypeScript, Python, Kotlin, C#, Go, Rust
Bu ekosistem, CI/CD Pipeline yazımda anlattığım otomasyon prensipleriyle birleştirildiğinde muazzam bir üretkenlik artışı sağlıyor.
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
Okuyucu Ödülü
MCP'yi hemen denemek istiyorsan şu adımları izle: (1) Claude Desktop veya Claude Code kur, (2) [MCP resmi server kataloğunu](https://modelcontextprotocol.io/clients) ziyaret et, (3) GitHub ve Playwright server'larını ekle, (4) "GitHub'daki son 5 commit'imi listele" veya "muhittincamdali.com'un ekran görüntüsünü al" gibi komutlar ver. 5 dakikada MCP'nin gücünü deneyimlersin. Ayrıca [Anthropic'in MCP tanıtım bloğunu](https://www.anthropic.com/news/model-context-protocol) ve [resmi spesifikasyonu](https://spec.modelcontextprotocol.io) de oku — bu protokolün derinliğini anlamak, gelecekteki AI entegrasyon projelerinde seni bir adım öne taşır.
Sonuç ve Öneriler
Model Context Protocol, yapay zeka entegrasyonunun USB-C'si olmaya aday. Açık standart olması, hızla büyüyen ekosistemi ve endüstri çapında benimsenmesiyle MCP, 2026 ve sonrasında AI geliştirmenin temel altyapısı olacak. Bir mobil geliştirici olarak MCP'yi öğrenmek, sadece Claude Code'u daha etkili kullanmana değil, tüm AI araçlarıyla verimli çalışma yetkinliğine kavuşmana yardımcı olur.
Önerilerin özeti:
- Temel kavramları öğren — Host, Client, Server, Tool, Resource
- Basit bir server yaz — stdio transport ile başla, karmaşıklaştırma
- Mevcut server'ları kullan — GitHub, Playwright, Firebase ile dene
- Güvenliği ihmal etme — Input validation, least privilege, audit logging
- Ekosistemi takip et — Haftalık 50+ yeni server ekleniyor, fırsatları kaçırma
- Modüler düşün — Tek mega-server yerine birden fazla micro-server

