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 yapisi, tool use, resource sharing ve transport layer detaylari. Claude Code plugin ekosisteminin teknik derinligi ve ornekleri.

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 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


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 declaration
2const server = new McpServer({
3 name: "my-server",
4 version: "1.0.0",
5 capabilities: {
6 tools: {}, // Tool cagirma destegi
7 resources: {}, // Kaynak paylasimi
8 prompts: {}, // Prompt template'leri
9 }
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 tanimlama
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 Akisi

  1. Client, server'dan mevcut tool listesini ister (tools/list)
  2. AI model kullanicinin isteğine gore uygun tool'u secer
  3. Client, secilen tool'u parametrelerle cagirir (tools/call)
  4. Server tool'u calistirir ve sonucu dondurur
  5. 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 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 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 olustur
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 ? \`Uyari: \${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 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 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" })

Ornek 2: Context7 ile Dokumantasyon

typescript
1// Kutuphane dokumantasyonunu cek
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})

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 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 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 okuma
12 }
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:

  1. Basit basla — Tek bir tool ile baslayip genislet
  2. stdio kullan — Lokal araclar icin en performansli transport
  3. Zod zorunlu — Runtime type safety her zaman
  4. Guvenlik oncelikli — Input validation, path kontrolu, rate limiting
  5. 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.

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ş

Bunu da begenebilirsiniz