# Claude Code MCP: Model Context Protocol ile AI Plugin Ekosistemi
Yapay zeka araclari artik tek basina çalışmıyor. 2025 sonunda Anthropic'in duyurdugu Model Context Protocol (MCP), AI agent'larin dis dunyayla iletişim kurma bicimini kokunden değiştirdi. Eger Claude Code kullaniyorsan ve "su araca baglanabilsem keske" diye dusunduysen, MCP tam senin için. Bu yazida MCP'nin mimarisinden transport layer detaylarina, kendi server'ini yazmaktan production'da kullanmaya kadar her seyi ele alacagiz.
Not: Bu rehber Anthropic Docs, MCP Specification ve gerçek proje deneyimlerine dayanmaktadir. Tum kod örnekleri test edilmistir.
İçindekiler
- MCP Nedir ve Neden Önemli?
- Mimari: Server, Client ve Host
- Transport Layer: stdio vs SSE vs Streamable HTTP
- Tool Tanımlama ve Kullanım
- Resource ve Prompt Sharing
- Kendi MCP Server'ini Yazma
- Claude Code ile MCP Entegrasyonu
- Gerçek Dunya Örnekleri
- Güvenlik ve Best Practices
- Sonuç ve Öneriler
1. MCP Nedir ve Neden Önemli?
Model Context Protocol, AI modellerin dis araclara, veritabanlarina ve API'lere standart bir protokol uzerinden erisimini sağlayan açık bir standarttir. USB-C'nin farklı cihazlari tek bir port uzerinden baglamasi gibi, MCP de farklı AI araclari tek bir protokolle birleştiriyor.
MCP Oncesi Dunya
MCP oncesinde her AI araci kendi entegrasyon yontemini gelistiriyordu:
Sorun | Açıklama |
|---|---|
Fragmantasyon | Her arac için ayrı plugin yazma |
Standart eksikligi | Farklı formatlar, farklı protokoller |
Güvenlik riskleri | Her entegrasyon kendi auth mekanizmasi |
Bakimi zor | N arac x M model = N*M entegrasyon |
MCP Sonrasi Dunya
MCP ile tek bir standart uzerinden tum araclar birbirine baglanabiliyor. Bir MCP server yazip hem Claude Code'da, hem VS Code'da, hem de baska herhangi bir MCP-uyumlu client'ta kullanabilirsin.
Pro Tip: MCP'yi REST API gibi düşünebilirsin ama AI-native. REST insanlar için tasarlandi, MCP ise AI agent'lar için.
2. Mimari: Server, Client ve Host
MCP uc ana bilesenin etkilesiminden olusur:
Host (Ev Sahibi)
Kullanıcının etkilestigi uygulamadir. Claude Code, Claude Desktop veya VS Code gibi. Host, bir veya birden fazla MCP client barindirir.
Client (Istemci)
Host içinde çalışan ve belirli bir MCP server ile iletişim kuran bilesendir. Her client tek bir server ile 1:1 iliski kurar.
Server (Sunucu)
Dis kaynaklara erişim sağlayan bilesendir. Veritabani, API, dosya sistemi, tarayici gibi her şey bir MCP server olabilir.
swift
1Host (Claude Code)2 ├-- Client A ←→ Server A (Playwright)3 ├-- Client B ←→ Server B (Firebase)4 └-- Client C ←→ Server C (GitHub)Capability Negotiation
Bağlantı kuruldugunda client ve server birbirlerinin yeteneklerini paylaşiyor:
typescript
1// Server capability declaration2const server = new McpServer({3 name: "my-server",4 version: "1.0.0",5 capabilities: {6 tools: {}, // Tool cagirma destegi7 resources: {}, // Kaynak paylaşımi8 prompts: {}, // Prompt template'leri9 }10});Pro Tip: Her server sadece ihtiyaç duydugu capability'leri declare etmeli. Gereksiz capability açmak güvenlik riskidir.
3. Transport Layer: stdio vs SSE vs Streamable HTTP
MCP uc farklı transport mekanizmasini destekler:
stdio (Standard I/O)
Lokal süreçler için ideal. Server bir child process olarak baslatilir, stdin/stdout uzerinden iletişim kurar:
json
1{2 "mcpServers": {3 "playwright": {4 "type": "stdio",5 "command": "npx",6 "args": ["@anthropic/mcp-playwright"]7 }8 }9}SSE (Server-Sent Events)
Uzak sunuculara HTTP uzerinden tek yonlu stream baglantisi kurar. Legacy destegi için mevcuttur.
Streamable HTTP
En yeni ve önerilen transport. Cift yonlu iletişim, session yönetimi ve reconnection destegi sunar.
Transport | Kullanım Alani | Performans | Kurulum |
|---|---|---|---|
stdio | Lokal araclar | En hızlı | Kolay |
SSE | Uzak server (legacy) | Orta | Orta |
Streamable HTTP | Uzak server (modern) | Hızlı | Orta |
4. Tool Tanımlama ve Kullanım
MCP'nin en güçlü ozelligi tool use. Server'lar AI agent'larin cagirabileceği araclar tanimlar:
typescript
1import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";2import { z } from "zod";3 4const server = new McpServer({5 name: "project-tools",6 version: "1.0.0"7});8 9// Tool tanımlama10server.tool(11 "analyze-code",12 "Kod dosyasini analiz eder ve kalite raporu olusturur",13 {14 filePath: z.string().describe("Analiz edilecek dosyanin yolu"),15 language: z.enum(["typescript", "swift", "python"]).describe("Programlama dili"),16 includeMetrics: z.boolean().optional().describe("Metrik hesapla")17 },18 async ({ filePath, language, includeMetrics }) => {19 // Tool logic burada20 const analysis = await analyzeFile(filePath, language);21 22 return {23 content: [{24 type: "text",25 text: JSON.stringify(analysis, null, 2)26 }]27 };28 }29);Tool Cagirma Akışi
- Client, server'dan mevcut tool listesini ister (
tools/list) - AI model kullanıcının isteğine göre uygun tool'u secer
- Client, seçilen tool'u parametrelerle cagirir (
tools/call) - Server tool'u calistirir ve sonuçu dondurur
- AI model sonuçu yorumlar ve kullanıcıya sunar
Bu akış Swift ile Async/Await yazimizdaki async pattern'e çok benzer — istek gönder, bekle, sonuçu işle.
5. Resource ve Prompt Sharing
Resources
Server'lar statik veya dinamik kaynaklar paylaşabilir:
typescript
1// Statik kaynak2server.resource(3 "project-config",4 "config://project",5 async (uri) => ({6 contents: [{7 uri: uri.href,8 mimeType: "application/json",9 text: JSON.stringify(projectConfig)10 }]11 })12);13 14// Dinamik kaynak template15server.resource(16 "blog-post",17 new ResourceTemplate("blog://{slug}", { list: undefined }),18 async (uri, { slug }) => ({19 contents: [{20 uri: uri.href,21 mimeType: "text/markdown",22 text: await getBlogContent(slug)23 }]24 })25);Prompts
Server'lar yeniden kullanılabilir prompt template'leri sunabilir:
typescript
1server.prompt(2 "code-review",3 { code: z.string(), language: z.string() },4 ({ code, language }) => ({5 messages: [{6 role: "user",7 content: {8 type: "text",9 text: \`Bu \${language} kodunu review et:\n\n\${code}\`10 }11 }]12 })13);Pro Tip: Resource'lar AI'in baglamini zenginlestirir, tool'lar ise aksiyon almasini sağlar. Ikisini birlikte kullanmak en etkili yaklasimdir.
6. Kendi MCP Server'ini Yazma
Sıfırdan bir MCP server oluşturmak surpriz derecede kolay:
bash
1# Proje oluştur2mkdir my-mcp-server && cd my-mcp-server3npm init -y4npm install @modelcontextprotocol/sdk zodtypescript
1// src/index.ts2import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";3import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";4import { z } from "zod";5 6const server = new McpServer({7 name: "ios-helper",8 version: "1.0.0"9});10 11// Xcode proje analiz tool'u12server.tool(13 "analyze-xcode-project",14 "Xcode projesini analiz eder, dependency'leri ve target'lari listeler",15 {16 projectPath: z.string().describe(".xcodeproj veya .xcworkspace yolu")17 },18 async ({ projectPath }) => {19 // pbxproj parse logic20 const targets = await parseXcodeProject(projectPath);21 return {22 content: [{23 type: "text",24 text: JSON.stringify(targets, null, 2)25 }]26 };27 }28);29 30// Swift dosya analiz tool'u31server.tool(32 "swift-complexity",33 "Swift dosyasinin cyclomatic complexity'sini hesaplar",34 {35 filePath: z.string(),36 threshold: z.number().optional().default(10)37 },38 async ({ filePath, threshold }) => {39 const complexity = await calculateComplexity(filePath);40 const warnings = complexity.functions41 .filter(f => f.complexity > threshold)42 .map(f => \`\${f.name}: \${f.complexity} (limit: \${threshold})\`);43 44 return {45 content: [{46 type: "text",47 text: warnings.length > 048 ? \`Uyarı: \${warnings.length} fonksiyon esigi asiyor:\n\${warnings.join("\n")}\`49 : "Tum fonksiyonlar esik degerinin altinda."50 }]51 };52 }53);54 55// Server'i baslat56const transport = new StdioServerTransport();57await server.connect(transport);7. Claude Code ile MCP Entegrasyonu
Claude Code'da MCP server eklemek için .mcp.json dosyasini kullaniyoruz:
json
1{2 "mcpServers": {3 "playwright": {4 "type": "stdio",5 "command": "npx",6 "args": ["@anthropic/mcp-playwright"]7 },8 "firebase": {9 "type": "stdio",10 "command": "npx",11 "args": ["firebase-mcp-server"],12 "env": {13 "FIREBASE_PROJECT_ID": "my-project"14 }15 },16 "context7": {17 "type": "stdio",18 "command": "npx",19 "args": ["-y", "@upstash/context7-mcp"]20 },21 "my-custom-server": {22 "type": "stdio",23 "command": "node",24 "args": ["./tools/mcp-server/dist/index.js"]25 }26 }27}Claude Code MCP tool'larini su formatta cagirir:
swift
1mcp__<server-adi>__<tool-adi>Örneğin: mcp__playwright__browser_navigate, mcp__firebase__get_document
Bu yaklaşım Firebase Advanced Patterns yazimizda anlatilanlarla çok uyumlu — Firestore işlemlerini doğrudan Claude Code'dan MCP uzerinden yonetebilirsin.
8. Gerçek Dunya Örnekleri
Örnek 1: Playwright ile UI Test
typescript
1// MCP uzerinden tarayici kontrolu2// Claude Code su tool'lari sirayla cagirir:3 4// 1. Sayfaya git5mcp__playwright__browser_navigate({ url: "https://muhittincamdali.com" })6 7// 2. Snapshot al8mcp__playwright__browser_snapshot()9 10// 3. Elemente tikla11mcp__playwright__browser_click({ ref: "nav-blog", element: "Blog link" })12 13// 4. Screenshot al14mcp__playwright__browser_take_screenshot({ type: "png" })Örnek 2: Context7 ile Dokumantasyon
typescript
1// Kutuphane dokumantasyonunu çek2mcp__context7__resolve_library_id({3 libraryName: "next.js",4 query: "app router middleware"5})6 7mcp__context7__query_docs({8 libraryId: "/vercel/next.js",9 query: "static export configuration"10})Örnek 3: Veritabani MCP Server
typescript
1server.tool(2 "query-analytics",3 "Analitik veritabanindan sorgu çalıştır",4 {5 dateRange: z.object({6 start: z.string(),7 end: z.string()8 }),9 metric: z.enum(["page_views", "unique_visitors", "bounce_rate"])10 },11 async ({ dateRange, metric }) => {12 const result = await db.query(13 \`SELECT date, value FROM analytics14 WHERE metric = ? AND date BETWEEN ? AND ?\`,15 [metric, dateRange.start, dateRange.end]16 );17 return { content: [{ type: "text", text: JSON.stringify(result) }] };18 }19);Bu pattern GraphQL iOS Integration yazimizdaki veri katmani yaklasimina benzer — sorgu tabanli, tip güvenliği olan erişim.
9. Güvenlik ve Best Practices
Input Validation
Zod ile runtime type checking zorunlu:
typescript
1server.tool(2 "file-read",3 "Dosya okuma (güvenli)",4 {5 path: z.string()6 .refine(p => !p.includes(".."), "Path traversal yasak")7 .refine(p => p.startsWith("/workspace"), "Sadece workspace içinde"),8 maxLines: z.number().min(1).max(1000).default(100)9 },10 async ({ path, maxLines }) => {11 // Güvenli dosya okuma12 }13);Güvenlik Checklist
Kural | Açıklama |
|---|---|
Input validation | Tum parametreleri Zod ile dogrula |
Path traversal | `../` iceren path'leri reddet |
Rate limiting | Tool cagirilarini sinirla |
Least privilege | Sadece gereken izinleri ver |
Audit logging | Tum tool cagirilarini logla |
Secret management | API key'leri env variable'da tut |
iOS Security Best Practices yazimizda anlattigimiz prensiplerin cogunu MCP server'larinda da uygulamalisin.
10. Sonuç ve Öneriler
MCP, AI araclarinin birbirleriyle ve dis dunyayla iletişim kurma bicimini standartlastiriyor. Kendi MCP server'ini yazarak Claude Code'u istedigin araca bagleyebilir, workflow'unu otomatiklestirebilir ve geliştirme hizini katleyebilirsin. MCP tool'larini hook'larla birlestirerek daha güçlü otomasyon kurabilirsin — detaylar için Claude Code Hooks rehberimize goz atabilirsin.
Öneriler:
- Basit başla — Tek bir tool ile baslayip genişlet
- stdio kullan — Lokal araclar için en performansli transport
- Zod zorunlu — Runtime type safety her zaman
- Güvenlik oncelikli — Input validation, path kontrolu, rate limiting
- Test et — MCP Inspector ile tool'larini test et
Pro Tip: Claude Code GitHub reposundaki örnekleri inceleyerek başla. Community server'lari da büyük ilham kaynagi.
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ü
🎉 **Sonuna Kadar Okuyan Kahraman!** Tebrikler! Iste sana özel bir kaynak: [MCP Awesome List](https://github.com/punkpeye/awesome-mcp-servers) — Community tarafindan oluşturulan 200+ MCP server listesi. Veritabani, cloud, monitoring, testing... her kategoride hazir server'lar mevcut.

