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

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

MCP mimarisi, server/client yapısı, tool use, resource sharing ve transport layer detayları. Claude Code plugin ekosisteminin teknik derinliği ve örnekleri.

Claude Code MCP: Model Context Protocol ile AI Plugin Ekosistemi

# 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


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 declaration
2const server = new McpServer({
3 name: "my-server",
4 version: "1.0.0",
5 capabilities: {
6 tools: {}, // Tool cagirma destegi
7 resources: {}, // Kaynak paylaşımi
8 prompts: {}, // Prompt template'leri
9 }
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ımlama
10server.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 burada
20 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

  1. Client, server'dan mevcut tool listesini ister (tools/list)
  2. AI model kullanıcının isteğine göre uygun tool'u secer
  3. Client, seçilen tool'u parametrelerle cagirir (tools/call)
  4. Server tool'u calistirir ve sonuçu dondurur
  5. 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 kaynak
2server.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 template
15server.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ştur
2mkdir my-mcp-server && cd my-mcp-server
3npm init -y
4npm install @modelcontextprotocol/sdk zod
typescript
1// src/index.ts
2import { 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'u
12server.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 logic
20 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'u
31server.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.functions
41 .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 > 0
48 ? \`Uyarı: \${warnings.length} fonksiyon esigi asiyor:\n\${warnings.join("\n")}\`
49 : "Tum fonksiyonlar esik degerinin altinda."
50 }]
51 };
52 }
53);
54 
55// Server'i baslat
56const 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 kontrolu
2// Claude Code su tool'lari sirayla cagirir:
3 
4// 1. Sayfaya git
5mcp__playwright__browser_navigate({ url: "https://muhittincamdali.com" })
6 
7// 2. Snapshot al
8mcp__playwright__browser_snapshot()
9 
10// 3. Elemente tikla
11mcp__playwright__browser_click({ ref: "nav-blog", element: "Blog link" })
12 
13// 4. Screenshot al
14mcp__playwright__browser_take_screenshot({ type: "png" })

Örnek 2: Context7 ile Dokumantasyon

typescript
1// Kutuphane dokumantasyonunu çek
2mcp__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 analytics
14 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 okuma
12 }
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:

  1. Basit başla — Tek bir tool ile baslayip genişlet
  2. stdio kullan — Lokal araclar için en performansli transport
  3. Zod zorunlu — Runtime type safety her zaman
  4. Güvenlik oncelikli — Input validation, path kontrolu, rate limiting
  5. 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.

Etiketler

#Claude Code#MCP#AI#Plugin#TypeScript#Automation
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ş

İlgili İçerik