Model Bağlam Protokolü (MCP), Büyük Dil Modelleri'nin (LLM) harici veri kaynakları ve araçlarla bağlantı kurmasını sağlayan standart bir yöntem olarak hızla "Yapay Zeka için USB-C" haline geldi. Erken uygulamalar genellikle basitlik için yerel Standart Girdi/Çıktı'ya (stdio) dayanırken, HTTP taşıma katmanlarına geçiş; üretim ortamları, dağıtık sistemler ve çok kiracılı (multi-tenant) mimariler için kritik bir evrimdir.
Bu rehber, HTTP üzerinden MCP'nin mekaniklerini inceleyerek altta yatan JSON-RPC yapısını, güvenlik etkilerini ve hem istemci hem de sunucu taraflarını uygulama için kod örneklerini detaylandırır.
Neden Stdio'nun Ötesine Geçmeli?
Standart stdio taşıma katmanı, yerel geliştirme ve tek kullanıcı komut satırı araçları için idealdir. Ancak ölçeklenebilir senaryolarda önemli sınırlamalarla karşı karşıyadır:
- Yalıtım: Stdio, modelin ve aracın aynı makinede ve süreç ağacında çalışmasını gerektirir.
- Ölçeklenebilirlik: Yerel olarak yük dengelemeyi veya yatay ölçeklemeyi desteklemez.
- Güvenlik: Doğrudan süreç başlatma, uygun kimlik doğrulama katmanlarına sahip ağ tabanlı hizmetlere göre daha az güvenlidir.
HTTP (özellikle HTTP/1.1 veya HTTP/2), durumdan bağımsız (stateless) iletişim, sağlam ara katman (middleware) desteği ve küresel erişilebilirlik sunarak, MCP sunucularını uzak LLM örneklerine açmak için doğal seçimdir.
Mimari: HTTP Üzerinden JSON-RPC
MCP sadece bir taşıma katmanı değildir; semantik bir protokoldür. HTTP üzerinden dağıtıldığında, MCP mesaj formatı olarak JSON-RPC 2.0'ı kullanır. Her etkileşim, bir yöntem, parametreler ve bir kimlik içeren bir JSON nesnesinden oluşur.
Temel Yöntemler
Bir MCP sunucusunun açığa çıkardığı temel yetenekler şunları içerir:
tools/list: Kullanılabilir araçları keşfetmek.tools/call: Belirli bir aracı argümanlarla çağırmak.resources/list: Kullanılabilir veri kaynaklarına erişmek.
Uygulama Örnekleri
1. Sunucu Tarafı İşleyici (Node.js/Express Örneği)
Aşağıda, bir MCP sunucusunun gelen bir HTTP POST isteğini nasıl işlediğine dair minimal bir örnek verilmiştir. Not: HTTP üzerinden MCP genellikle, JSON gövdesindeki method alanına göre yönlendirme yapan tek bir uç noktayı (ör. /mcp) kullanır.
const express = require('express');
const app = express();
app.use(express.json());
app.post('/mcp', (req, res) => {
const { method, params, id } = req.body;
// MCP yöntemlerine göre temel yönlendirme
switch (method) {
case 'tools/list':
res.json({
jsonrpc: '2.0',
id,
result: {
tools: [
{
name: 'get_weather',
description: 'Get current weather data',
inputSchema: {
type: 'object',
properties: {
city: { type: 'string' }
},
required: ['city']
}
}
]
}
});
break;
case 'tools/call':
// Aracınızın mantığını burada uygulayın
const cityName = params.arguments.city;
res.json({
jsonrpc: '2.0',
id,
result: {
content: [{ type: 'text', text: `Sunny in ${cityName}, 75°F` }]
}
});
break;
default:
res.json({
jsonrpc: '2.0',
id,
error: { code: -32601, message: 'Method not found' }
});
}
});
app.listen(3000, () => console.log('MCP Server running on port 3000'));
2. İstemci Tarafı İsteği
LLM uygulaması (veya ara katmanı) MCP istemcisi olarak hareket eder. JSON-RPC yükünü içeren bir POST isteği gönderir. Araç çağrıları uzun sürebileceğinden, zaman aşımı ve asenkron yanıtları doğru şekilde işlemek kritiktir.
const fetch = require('node-fetch');
async function callMCPTool(toolName, args) {
const response = await fetch('http://localhost:3000/mcp', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method: 'tools/call',
params: {
name: toolName,
arguments: args
},
id: '12345'
})
});
const data = await response.json();
if (data.error) {
throw new Error(data.error.message);
}
return data.result;
}
// Kullanım
callMCPTool('get_weather', { city: 'New York' }).then(console.log);
Güvenlik Hususları
MCP araçlarını HTTP üzerinden açığa çıkarmak, yerel stdio ortamlarında bulunmayan saldırı yüzeyleri ortaya çıkarır. Geliştiricilerin sıkı güvenlik kontrolleri uygulaması gerekir:
- Kimlik Doğrulama: Her zaman API anahtarları, OAuth 2.0 jetonları veya mTLS gerektirin. Bir MCP sunucusunu kimlik doğrulama olmadan asla herkese açık internete açmayın.
- Erişim Yetkilendirmesi: LLM bağlamının yetki yükseltmesine izin vermediğinden emin olun. Sunucu, isteği yapan kullanıcının belirli araçları çağırma iznine sahip olduğunu doğrulamalıdır.
- Girdi Doğrulama: Araçlara geçirilen tüm argümanları sıkı bir şekilde doğrulayın. Girdiyi LLM ürettiği için, bozuk veya kötü niyetli JSON üretebilir. Sunucu tarafında şema doğrulama (ör. Zod, Joi) kullanın.
- Hız Sınırlandırma: Araçların yaptığı harici API çağrılarıyla ilişkili kötüye kullanımı veya maliyet aşımını önlemek için hız sınırları uygulayın.
Üretim İçin En İyi Uygulamalar
- HTTPS Kullanın: Trafiği iletim sırasında her zaman şifreleyin.
- Durumsuzluk (Statelessness): Kolay yatay ölçeklemeye izin vermek için MCP sunucunuzu mümkün olan her yerde durumsuz olarak tasarlayın.
- Günlükleme: Denetim amaçlı olarak tüm araç çağrılarını günlüğe kaydedin. Hangi LLM örneğinin hangi parametrelerle hangi aracı çağırdığını izleyin.
- Sürümleme: Araç şemalarındaki kırıcı değişiklikleri yönetmek için URL'nizde veya başlıklarınızda sürümleme kullanın (ör.
/mcp/v1).
Sonuç
MCP'yi stdio'dan HTTP'ye geçirmek, sağlam ve ölçeklenebilir yapay zeka uygulamaları oluşturmak için gerekli bir adımdır. Güvenli HTTP uç noktaları üzerinden standart JSON-RPC 2.0 formatını kullanarak geliştiriciler, farklı LLM sağlayıcıları ve dağıtım ortamları arasında paylaşılabilen modüler ve yeniden kullanılabilir araç ekosistemleri oluşturabilir. MCP ekosistemi olgunlaştıkça, HTTP taşıma katmanlarında akış yanıt ve karmaşık kaynak bağlantıları gibi daha zengin özelliklerin standart hale gelmesini bekleyin.