Yapay zeka modelleri geliştikçe, karşılaştıkları en büyük engel modelin kendi parametrik bilgisi değil, dış dünyadaki güncel ve özel verilere nasıl eriştiğidir. Yıllardır büyük dil modellerini (LLM) veritabanlarına, geliştirme araçlarına veya kurumsal yazılımlara bağlamak için özel API entegrasyonları, RAG (Retrieval-Augmented Generation) mimarileri ve karmaşık ajan iş akışları kuruldu. Ancak her model ve veri kaynağı kombinasyonu için ayrı bir bağlayıcı yazmak, sürdürülemez bir karmaşıklık yarattı. İşte tam bu noktada Anthropic tarafından açık kaynaklı bir standart olarak duyurulan Model Context Protocol (MCP), yapay zeka ekosisteminin veri entegrasyonu standardı olarak öne çıkıyor.
Yapay zeka uygulamalarında devrim yaratan Model Context Protocol (MCP), LLM'ler ile dış veri kaynakları ve araçlar arasındaki iletişimi standart bir istemci-sunucu (Client-Server) mimarisine oturtan açık bir protokoldür. Bu yazıda, MCP'nin teknik mimarisini, çalışma prensiplerini, geleneksel yöntemlerle karşılaştırmasını ve adım adım kendi MCP sunucunuzu nasıl kurabileceğinizi en güncel standartlarla inceleyeceğiz.
Model Context Protocol (MCP) Nedir ve Nasıl Çalışır?
Model Context Protocol (MCP), tipik bir Tip-C (USB-C) bağlantı noktası gibi düşünülebilir. Nasıl ki USB-C standardı tek bir kablo üzerinden şarj, görüntü ve veri aktarımını her cihaz için uyumlu hale getirdiyse; MCP de yapay zeka modellerinin herhangi bir veri kaynağına veya araç sağlayıcısına tek bir standart üzerinden bağlanmasını sağlar.
MCP mimarisi temel olarak üç ana bileşenden oluşur:
- MCP Client (İstemci): Yapay zeka uygulamasının çalıştığı ortamdır. Örneğin Claude Desktop uygulaması, özel bir IDE eklentisi veya yapay zeka ajanları çalıştıran bir orchestration katmanı istemci rolünü üstlenir.
- MCP Server (Sunucu): Belirli bir veri kaynağını (PostgreSQL veritabanı, GitHub, Slack, yerel dosya sistemi) veya aracı dışa açan hafif bir servistir. İstemciden gelen talepleri karşılar ve veriyi standart formatta döndürür.
- Transport Katmanı: İstemci ile sunucu arasındaki iletişimi sağlayan kanaldır. Yerel işlemler için
stdio(standart girdi/çıktı) tercih edilirken, uzak bağlantılar içinHTTP SSE(Server-Sent Events) kullanılır. - Resources (Kaynaklar): İstemci tarafından okunabilen pasif verilerdir. Dosya içerikleri, veritabanı kayıtları veya uygulama logları birer kaynak örneğidir. URI düzeniyle (örneğin
file:///logs/app.logveyapostgres://users/123) tanımlanırlar. - Prompts (İstemler): Sunucu tarafından önceden hazırlanmış, parametre alabilen hazır yönlendirme şablonlarıdır. Kullanıcının karmaşık işlemleri tek bir komutla başlatmasını sağlar.
- Tools (Araçlar): Modelin dış dünyada eylem gerçekleştirmesini sağlayan yürütülebilir fonksiyonlardır. Bir veritabanında sorgu çalıştırmak, e-posta göndermek veya GitHub üzerinde Issue açmak birer araç kullanımıdır.
- Fine-Tuning: Modeli veriyle güncellemek maliyetlidir ve statiktir. Anlık değişen bakiye, stok bilgisi veya anlık sistem logları için uygun değildir.
- Geleneksel RAG: Veriyi vektörleştirip arama yapar ancak yapay zekaya sistemi yönetme veya dinamik sorgulama yapma imkanı tanımaz. Ayrıca her veri kaynağı için ayrı bir
retrieveryazmak gerekir. - MCP Yaklaşımı: Modeli dinamik, çift yönlü ve güvenli bir şekilde veri kaynağına bağlar. Model sadece okuma yapmaz, yetkisi dahilinde işlem de yürütebilir. Farklı geliştiriciler tarafından yazılan yerleşik sunucular (PostgreSQL, Brave Search, Google Drive, GitHub) doğrudan tak-çalıştır şeklinde sisteme eklenebilir.
MCP alt yapısında veri alışverişi JSON-RPC 2.0 protokolü üzerinden yürütülür. Bu sayede dil bağımsız bir yapı elde edilir; sunucu Python veya TypeScript ile yazılmışken istemci tamamen farklı bir mimaride çalışabilir.
MCP Protokolünün Üç Temel Primitive Yapısı
Model Context Protocol, veri entegrasyonunu ve araç kullanımını üç ana soyutlama üzerinden yönetir:
Geleneksel RAG ve Fine-Tuning Yöntemlerinden Farkı Nedir?
Yapay zeka modellerine özel veri sağlama noktasında yıllardır kullanılan en popüler iki yöntem fine-tuning (ince ayar) ve standart RAG mimarileridir. Ancak bu yöntemler belirli kısıtlamalara sahiptir:
Açık kaynak dünyasında DeepSeek R1 gibi modellerin yaygınlaşmasıyla birlikte, yerel çalışan açık kodlu LLM'lerin kurumsal veritabanlarıyla güvenli şekilde konuşturulmasında MCP standart mimari haline gelmiştir.
Adım Adım MCP Server Kurulumu ve Yapılandırması
Bu bölümde TypeScript/Node.js kullanarak yerel bir SQLite veritabanından veri okuyan ve modelin kullanımına sunan basit bir MCP sunucusunun nasıl yazılacağını ve istemciye nasıl bağlanacağını inceleyeceğiz.
1. Adım: Proje Kurulumu ve Bağımlılıkların Yüklenmesi
İlk olarak projemizi oluşturup gerekli resmi @modelcontextprotocol/sdk paketini yüklüyoruz.
mkdir mcp-sqlite-server
cd mcp-sqlite-server
npm init -y
npm install @modelcontextprotocol/sdk sqlite3
npm install --save-dev typescript @types/node @types/sqlite3 tsx
2. Adım: MCP Sunucu Kodunun Yazılması
src/index.ts adında bir dosya oluşturup aşağıdaki kodu ekleyelim. Bu kod, modelin sorgulayabileceği bir SQLite veritabanı aracı (Tool) tanımlar.
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import sqlite3 from "sqlite3";
const db = new sqlite3.Database(":memory:");
// Örnek tablo ve veri oluşturma
db.serialize(() => {
db.run("CREATE TABLE users (id INT, name TEXT, email TEXT)");
db.run("INSERT INTO users VALUES (1, 'Ahmet Yılmaz', 'ahmet@example.com')");
db.run("INSERT INTO users VALUES (2, 'Ayşe Kaya', 'ayse@example.com')");
});
const server = new Server(
{
name: "sqlite-mcp-server",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
// Mevcut araçları listeleme
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "query_users",
description: "Kullanıcılar tablosunda arama yapar ve sonuçları döndürür.",
inputSchema: {
type: "object",
properties: {
limit: { type: "number", description: "Getirilecek maksimum kayıt sayısı" },
},
},
},
],
};
});
// Aracı çalıştırma işleyicisi
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "query_users") {
const limit = (request.params.arguments?.limit as number) || 10;
return new Promise((resolve) => {
db.all("SELECT * FROM users LIMIT ?", [limit], (err, rows) => {
if (err) {
resolve({ content: [{ type: "text", text: `Hata: ${err.message}` }] });
} else {
resolve({
content: [{ type: "text", text: JSON.stringify(rows, null, 2) }],
});
}
});
});
}
throw new Error("Araç bulunamadı");
});
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("SQLite MCP Sunucusu stdio üzerinden çalışıyor...");
}
main().catch((error) => {
console.error("Sunucu hatası:", error);
process.exit(1);
});
3. Adım: İstemci (Client) Yapılandırması
Oluşturduğumuz MCP sunucusunu Claude Desktop veya destekleyen herhangi bir MCP istemcisine tanıtmak için istemcinin yapılandırma dosyasına (claude_desktop_config.json) sunucumuzu ekliyoruz:
{
"mcpServers": {
"sqlite-db": {
"command": "npx",
"args": ["tsx", "/absolute/path/to/mcp-sqlite-server/src/index.ts"]
}
}
}
Yapılandırma kaydedilip istemci yeniden başlatıldığında, model otomatik olarak query_users aracını algılar. Kullanıcı "Veritabanındaki kullanıcıları listele" dediğinde LLM, MCP protokolü üzerinden sunucuya JSON-RPC isteği gönderir, dönen JSON verisini işleyip kullanıcıya anlamlı yanıt üretir.
Kurumsal Kullanımda Güvenlik, Yetkilendirme ve Sık Yapılan Hatalar
Model Context Protocol güçlü olanaklar sunsa da kurumsal mimarilere entegre edilirken güvenlik riskleri göz ardı edilmemelidir. Modelin sistem yetkileriyle hareket ettiği durumlarda yaşanabilecek aksaklıkları önlemek için dikkat edilmesi gereken kritik noktalar şunlardır:
1. Aşırı Yetkilendirme (Over-privileging)
En sık yapılan hata, MCP sunucusuna veritabanı üzerindeDROP, DELETE veya UPDATE gibi yıkıcı işlemleri yürütme yetkisi vermektir. MCP araçları tasarlanırken Principle of Least Privilege (En Az Yetki Prensibi) uygulanmalı; veri okuma sunucuları sadece READ-ONLY bağlantı dizileri kullanmalıdır.2. Prompt Injection (İstem Enjeksiyonu) Zararları
Eğer bir MCP sunucusu dış dünyadan gelen (örneğin e-postalar veya web scraping verileri) içerikleri LLM'e besliyorsa, bu içeriklerin içine gizlenmiş kötü niyetli talimatlar modelin diğer MCP araçlarını tetiklemesine neden olabilir. Sunucu düzeyinde girdi doğrulaması (Input Validation) ve kritik araçlarda kullanıcı onayı (Human-in-the-loop) mekanizması şarttır.3. Bağlam Şişkinliği (Context Bloating)
MCP üzerinden dönen devasa JSON çıktıları veya binlerce satırlık dosyalar, modelin bağlam penceresini (Context Window) doldurur. Bu durum hem maliyeti artırır hem de yanıt kalitesini düşürür. Sunucu tarafında mutlaka sayfalandırma (pagination) ve özetleme mekanizmaları kullanılmalıdır.MCP Kullanım Senaryoları ve Karar Kriterleri
Hangi durumlarda MCP kullanmalı, hangi durumlarda geleneksel API veya RAG çözümlerine sadık kalmalısınız? Aşağıdaki karar kriterleri yol gösterici olacaktır:
Sonuç
Model Context Protocol (MCP), yapay zeka geliştirme süreçlerinde parçalanmış veri entegrasyonu sorununa getirilen en kapsamlı standarttır. LLM'leri sadece metin üreten sistemler olmaktan çıkarıp, kurum içi verilere güvenle erişen ve iş akışlarını otomatikleştiren gerçek birer yapay zeka ajanına dönüştürür.
Projenizde MCP uygulamaya başlamak için ilk adım olarak resmi Anthropic MCP belgelerini inceleyebilir veya mevcut open-source sunucu kataloğundaki yerleşik PostgreSQL, FileSystem veya GitHub sunucularını yerel ortamınızda test edebilirsiniz.
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yazın