Tüm Yazılar
KategoriAI
Okuma Süresi
26 dk okuma
Yayın Tarihi
...
Kelime Sayısı
2.709kelime

Kahveni hazırla - bu içerikli bir makale!

Anthropic'in MCP standardıyla AI agent'ları dış dünyaya bağla. Server/client mimari, tool use, resource sharing ve transport layer. AI entegrasyonunun geleceği.

MCP (Model Context Protocol): AI Entegrasyon Standardı

# 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


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 kod
2// 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 entegrasyon
9};
10 
11// MCP SONRASI: Standart protokol
12// N uygulama × 1 protokol + M araç × 1 protokol = N+M entegrasyon 🎉
13const mcpServer = new MCPServer('github'); // 1 kez yaz
14// Tüm MCP-uyumlu AI client'ları otomatik bağlanır

USB-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önetir
7 };
8 
9 client: {
10 role: '1:1 server bağlantısı, protokol yönetimi';
11 capabilities: {
12 roots: boolean; // Dosya sistemi kök dizinleri
13 sampling: boolean; // AI model çağrısı yapabilme
14 };
15 };
16 
17 server: {
18 role: 'Araç/veri sağlama';
19 exposes: {
20 tools: Tool[]; // Çalıştırılabilir fonksiyonlar
21 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ç/Veri
29// 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 Server
2import { 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ımla
11server.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ır
29server.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şlat
43const 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 transport
2import { StreamableHTTPServerTransport } from
3 '@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önetimi
15app.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ırma
23 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 isim
4 name: string;
5 
6 // AI modelin anlayacağı açıklama
7 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şlemler
17 annotations?: {
18 destructiveHint?: boolean; // Silme, değiştirme
19 idempotentHint?: boolean; // Tekrar çağrılabilir
20 readOnlyHint?: boolean; // Sadece okuma
21 openWorldHint?: boolean; // Dış dünyayla etkileşim
22 };
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ımlama
2server.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 oku
20server.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.json
2// {
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ği
12import { 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 arama
26server.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 handler
56server.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şlat
78const 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ği
4 transport: {
5 localOnly: 'stdio'; // Lokal = en güvenli
6 remote: 'HTTPS + mTLS'; // Uzak = şifreli + karşılıklı auth
7 authentication: 'OAuth 2.1'; // Token tabanlı kimlik doğrulama
8 };
9 
10 // 2. Yetkilendirme
11 authorization: {
12 principle: 'least privilege'; // Minimum yetki
13 toolLevel: 'per-tool-permission'; // Her tool için ayrı izin
14 userApproval: 'destructive-ops'; // Yıkıcı işlemler = onay
15 };
16 
17 // 3. Girdi doğrulama
18 inputValidation: {
19 schema: 'JSON Schema strict'; // Katı şema doğrulama
20 sanitization: 'injection-prevention'; // Enjeksiyon önleme
21 rateLimiting: 'per-client-per-tool'; // İstemci+tool bazlı limit
22 };
23 
24 // 4. Çıktı kontrolü
25 outputControl: {
26 dataMinimization: true; // Gereken minimum veriyi döndür
27 piiRedaction: true; // Kişisel veri maskeleme
28 sizeLimit: '10MB'; // Yanıt boyut limiti
29 };
30}

En İyi Pratikler

  1. Input doğrulama: Her parametre için JSON Schema kullan, tip kontrolü yap
  2. Least privilege: Server'a sadece gerekli yetkileri ver
  3. Audit logging: Tüm tool çağrılarını logla
  4. Rate limiting: Kötüye kullanımı önle
  5. Data minimization: Gereken minimum veriyi döndür
  6. 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:

  1. Temel kavramları öğren — Host, Client, Server, Tool, Resource
  2. Basit bir server yaz — stdio transport ile başla, karmaşıklaştırma
  3. Mevcut server'ları kullan — GitHub, Playwright, Firebase ile dene
  4. Güvenliği ihmal etme — Input validation, least privilege, audit logging
  5. Ekosistemi takip et — Haftalık 50+ yeni server ekleniyor, fırsatları kaçırma
  6. Modüler düşün — Tek mega-server yerine birden fazla micro-server

Etiketler

#AI#MCP#Anthropic#Protocol#Integration#Tools#2026
Muhittin Çamdalı

Muhittin Çamdalı

Senior iOS Developer

12+ yıllık deneyime sahip iOS Developer. Swift, SwiftUI ve modern iOS mimarileri konusunda uzman. Apple platformlarında performanslı ve kullanıcı dostu uygulamalar geliştiriyorum.

iOS Geliştirme Haberleri

Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.

Paylaş

Bunu da begenebilirsiniz