# Claude Code MCP: Model Context Protocol ile AI Plugin Ekosistemi
Yapay zeka araclari artik tek basina calismiyor. 2025 sonunda Anthropic'in duyurdugu Model Context Protocol (MCP), AI agent'larin dis dunyayla iletisim kurma bicimini kokunden degistirdi. Eger Claude Code kullaniyorsan ve "su araca baglanabilsem keske" diye dusunduysen, MCP tam senin icin. 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 gercek proje deneyimlerine dayanmaktadir. Tum kod ornekleri test edilmistir.
Icindekiler
- MCP Nedir ve Neden Onemli?
- Mimari: Server, Client ve Host
- Transport Layer: stdio vs SSE vs Streamable HTTP
- Tool Tanimlama ve Kullanim
- Resource ve Prompt Sharing
- Kendi MCP Server'ini Yazma
- Claude Code ile MCP Entegrasyonu
- Gercek Dunya Ornekleri
- Guvenlik ve Best Practices
- Sonuc ve Oneriler
1. MCP Nedir ve Neden Onemli?
Model Context Protocol, AI modellerin dis araclara, veritabanlarina ve API'lere standart bir protokol uzerinden erisimini saglayan acik bir standarttir. USB-C'nin farkli cihazlari tek bir port uzerinden baglamasi gibi, MCP de farkli AI araclari tek bir protokolle birlestiriyor.
MCP Oncesi Dunya
MCP oncesinde her AI araci kendi entegrasyon yontemini gelistiriyordu:
Sorun | Aciklama |
|---|---|
Fragmantasyon | Her arac icin ayri plugin yazma |
Standart eksikligi | Farkli formatlar, farkli protokoller |
Guvenlik 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 dusunebilirsin ama AI-native. REST insanlar icin tasarlandi, MCP ise AI agent'lar icin.
2. Mimari: Server, Client ve Host
MCP uc ana bilesenin etkilesiminden olusur:
Host (Ev Sahibi)
Kullanicinin etkilestigi uygulamadir. Claude Code, Claude Desktop veya VS Code gibi. Host, bir veya birden fazla MCP client barindirir.
Client (Istemci)
Host icinde calisan ve belirli bir MCP server ile iletisim kuran bilesendir. Her client tek bir server ile 1:1 iliski kurar.
Server (Sunucu)
Dis kaynaklara erisim saglayan bilesendir. Veritabani, API, dosya sistemi, tarayici gibi her sey 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
Baglanti kuruldugunda client ve server birbirlerinin yeteneklerini paylasiyor:
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 paylasimi8 prompts: {}, // Prompt template'leri9 }10});Pro Tip: Her server sadece ihtiyac duydugu capability'leri declare etmeli. Gereksiz capability acmak guvenlik riskidir.
3. Transport Layer: stdio vs SSE vs Streamable HTTP
MCP uc farkli transport mekanizmasini destekler:
stdio (Standard I/O)
Lokal surecler icin ideal. Server bir child process olarak baslatilir, stdin/stdout uzerinden iletisim 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 icin mevcuttur.
Streamable HTTP
En yeni ve onerilen transport. Cift yonlu iletisim, session yonetimi ve reconnection destegi sunar.
Transport | Kullanim Alani | Performans | Kurulum |
|---|---|---|---|
stdio | Lokal araclar | En hizli | Kolay |
SSE | Uzak server (legacy) | Orta | Orta |
Streamable HTTP | Uzak server (modern) | Hizli | Orta |
4. Tool Tanimlama ve Kullanim
MCP'nin en guclu 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 tanimlama10server.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 Akisi
- Client, server'dan mevcut tool listesini ister (
tools/list) - AI model kullanicinin isteğine gore uygun tool'u secer
- Client, secilen tool'u parametrelerle cagirir (
tools/call) - Server tool'u calistirir ve sonucu dondurur
- AI model sonucu yorumlar ve kullaniciya sunar
Bu akis Swift ile Async/Await yazimizdaki async pattern'e cok benzer — istek gonder, bekle, sonucu isle.
5. Resource ve Prompt Sharing
Resources
Server'lar statik veya dinamik kaynaklar paylasabilir:
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 kullanilabilir 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 saglar. Ikisini birlikte kullanmak en etkili yaklasimdir.
6. Kendi MCP Server'ini Yazma
Sifirdan bir MCP server olusturmak surpriz derecede kolay:
bash
1# Proje olustur2mkdir 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 ? \`Uyari: \${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 icin .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>Ornegin: mcp__playwright__browser_navigate, mcp__firebase__get_document
Bu yaklasim Firebase Advanced Patterns yazimizda anlatilanlarla cok uyumlu — Firestore islemlerini dogrudan Claude Code'dan MCP uzerinden yonetebilirsin.
8. Gercek Dunya Ornekleri
Ornek 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" })Ornek 2: Context7 ile Dokumantasyon
typescript
1// Kutuphane dokumantasyonunu cek2mcp__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})Ornek 3: Veritabani MCP Server
typescript
1server.tool(2 "query-analytics",3 "Analitik veritabanindan sorgu calistir",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 guvenligi olan erisim.
9. Guvenlik ve Best Practices
Input Validation
Zod ile runtime type checking zorunlu:
typescript
1server.tool(2 "file-read",3 "Dosya okuma (guvenli)",4 {5 path: z.string()6 .refine(p => !p.includes(".."), "Path traversal yasak")7 .refine(p => p.startsWith("/workspace"), "Sadece workspace icinde"),8 maxLines: z.number().min(1).max(1000).default(100)9 },10 async ({ path, maxLines }) => {11 // Guvenli dosya okuma12 }13);Guvenlik Checklist
Kural | Aciklama |
|---|---|
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. Sonuc ve Oneriler
MCP, AI araclarinin birbirleriyle ve dis dunyayla iletisim kurma bicimini standartlastiriyor. Kendi MCP server'ini yazarak Claude Code'u istedigin araca bagleyebilir, workflow'unu otomatiklestirebilir ve gelistirme hizini katleyebilirsin. MCP tool'larini hook'larla birlestirerek daha guclu otomasyon kurabilirsin — detaylar icin Claude Code Hooks rehberimize goz atabilirsin.
Oneriler:
- Basit basla — Tek bir tool ile baslayip genislet
- stdio kullan — Lokal araclar icin en performansli transport
- Zod zorunlu — Runtime type safety her zaman
- Guvenlik oncelikli — Input validation, path kontrolu, rate limiting
- Test et — MCP Inspector ile tool'larini test et
Pro Tip: Claude Code GitHub reposundaki ornekleri inceleyerek basla. Community server'lari da buyuk 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 ozel bir kaynak: [MCP Awesome List](https://github.com/punkpeye/awesome-mcp-servers) — Community tarafindan olusturulan 200+ MCP server listesi. Veritabani, cloud, monitoring, testing... her kategoride hazir server'lar mevcut.

