Bir AI agent’ı harici araçlara ve API’lere bağlarken iki genel yaklaşım vardır: Model Context Protocol (MCP) kullanarak bir soyutlama katmanı oluşturmak veya bir API’yi doğrudan HTTP üzerinden çağırmak. İkisi de çalışır. Esneklik, karmaşıklık, performans ve taşınabilirlik açısından farklı ödünleşimler sunarlar.
Bu yazı, iki yaklaşımı somut kod örnekleri, gecikme analizi ve aralarında seçim yapmak için bir karar çerçevesiyle karşılaştırır.
İki yaklaşım
Doğrudan HTTP entegrasyonu
AI uygulaması (veya backend’i), standart HTTP istekleri kullanarak harici API’leri doğrudan çağırır. Geliştirici istekleri oluşturmak, kimlik doğrulamayı yönetmek, yanıtları ayrıştırmak ve sonuçları LLM’e geri beslemek için kod yazar.
┌──────┐ ┌────────┐ ┌─────────────┐
│ User │────▶│ AI App │──── HTTP request ─────▶│ Weather API │
└──────┘ │ │◀─── JSON response ─────│ │
│ │ └─────────────┘
│ │── result as context ──▶ LLM
│ │◀── formatted answer ───
└───┬────┘
│
▼
User gets answer
MCP entegrasyonu
AI uygulaması, harici API’yi sarmalayan bir MCP server’a bağlanır. Uygulama, mevcut araçları keşfetmek, onları adlarıyla çağırmak ve sonuçları almak için MCP protokolünü kullanır. MCP server, harici API’ye yapılan gerçek HTTP çağrılarını yönetir.
┌──────┐ ┌───────────────────┐ ┌────────────┐ ┌──────────┐
│ User │────▶│ AI App/MCP Client │── JSON-RPC ─▶│ MCP Server │────▶│ HTTP API │
└──────┘ │ │◀─ JSON-RPC ──│ │◀────│ │
│ │ └────────────┘ └──────────┘
│ │── result as context ──▶ LLM
│ │◀── formatted answer ───
└─────────┬─────────┘
│
▼
User gets answer
Temel fark şudur: doğrudan HTTP’de API entegrasyon kodunun sahibi AI uygulamasıdır. MCP’de bu kodun sahibi MCP server’dır ve AI uygulaması yalnızca araçları adlarıyla çağırır.
Bu diyagramın MCP tarafını sunucuyu kendiniz oluşturmadan kullanabilirsiniz: Quickchat AI, her AI Agent için streamable-HTTP MCP server barındırır ve agent’ınızı MCP server’a dönüştürmek, AI uygulamasına tek bir URL yapıştırmaktan ibarettir.
Kod karşılaştırması
İki yaklaşımı pratik bir örnek üzerinden karşılaştıralım: bir GitHub kullanıcısının repository’lerini getirmek.
Doğrudan HTTP entegrasyonu
import httpx
async def get_user_repos(username: str, token: str) -> list[dict]:
"""Bir GitHub kullanıcısının repository'lerini getir."""
async with httpx.AsyncClient() as client:
response = await client.get(
f"https://api.github.com/users/{username}/repos",
headers={
"Authorization": f"Bearer {token}",
"Accept": "application/vnd.github.v3+json",
"X-GitHub-Api-Version": "2022-11-28"
},
params={"sort": "updated", "per_page": 10}
)
response.raise_for_status()
repos = response.json()
return [
{
"name": r["name"],
"description": r["description"],
"stars": r["stargazers_count"],
"language": r["language"],
"url": r["html_url"]
}
for r in repos
]
Bunu bir LLM ile entegre etmek için ayrıca şunlara ihtiyacınız vardır:
- LLM’in beklediği formatta bir araç tanımı (OpenAI function calling schema, Claude tool use schema vb.)
- LLM’in araç çağrısını ayrıştıran,
get_user_reposçağıran ve sonucu konuşmaya geri ekleyen kod - HTTP hataları, rate limit’ler ve kimlik doğrulama süresinin dolması için hata yönetimi
MCP server
from mcp.server.fastmcp import FastMCP
import httpx
mcp = FastMCP("github-server")
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
@mcp.tool()
async def get_user_repos(username: str) -> str:
"""Bir GitHub kullanıcısı için en son güncellenen 10 repository'yi getir.
Args:
username: Aranacak GitHub kullanıcı adı
"""
async with httpx.AsyncClient() as client:
response = await client.get(
f"https://api.github.com/users/{username}/repos",
headers={
"Authorization": f"Bearer {GITHUB_TOKEN}",
"Accept": "application/vnd.github.v3+json",
"X-GitHub-Api-Version": "2022-11-28"
},
params={"sort": "updated", "per_page": 10}
)
response.raise_for_status()
repos = response.json()
lines = []
for r in repos:
stars = r["stargazers_count"]
lang = r["language"] or "unknown"
lines.append(f"- {r['name']} ({lang}, {stars} stars): {r['description'] or 'No description'}")
return "\n".join(lines)
if __name__ == "__main__":
mcp.run(transport="stdio")
MCP sürümü API çağrısını, kimlik doğrulamayı ve yanıt biçimlendirmesini sunucunun içinde kapsüller. MCP uyumlu herhangi bir client, GitHub API hakkında hiçbir şey bilmeden bu aracı kullanabilir.
AI uygulaması açısından ne değişir
| Konu | Doğrudan HTTP | MCP |
|---|---|---|
| Araç tanımı | LLM’in yerel formatında yazılır (OpenAI schema vb.) | MCP server’dan otomatik oluşturulur |
| Kimlik doğrulama | AI uygulaması tarafından yönetilir | MCP server tarafından yönetilir |
| Yanıt ayrıştırma | AI uygulaması veriyi çıkarır ve biçimlendirir | MCP server önceden biçimlendirilmiş sonuç döndürür |
| Hata yönetimi | AI uygulaması HTTP hatalarını yönetir | MCP server hataları yönetir, yapılandırılmış hata mesajları döndürür |
| Yeni araç ekleme | AI uygulamasında yeni kod yazılır | Yeni bir MCP server’a bağlanılır (veya mevcut server’a araç eklenir) |
| LLM değiştirme | Araç tanımları yeni LLM formatı için yeniden yazılır | Değişiklik gerekmez |
Performans karşılaştırması
MCP, AI uygulaması ile harici API arasına bir katman ekler. Bu katmanın bir maliyeti vardır.
Gecikme
stdio transport (yerel MCP server’lar) için ek yük asgari düzeydedir: başlangıçta process başlatma (tek seferlik, genellikle 100ms altında) ve mesaj başına process’ler arası iletişim (modern sistemlerde milisaniyenin altında). Pratikte toplam gecikmeyi harici API çağrısı belirler.
Remote MCP servers (Streamable HTTP veya SSE) için client ile MCP server arasında bir HTTP gidiş-dönüşü ve ayrıca MCP server’ın harici API’ye yaptığı HTTP gidiş-dönüşü eklenir. MCP server ve harici API aynı konumdaysa bu ek yük küçüktür (tek haneli milisaniyeler). Farklı bölgelerdeyseler bileşik etki oluşur. Ancak transport, kullanıcının hissettiği unsur nadiren olur: Notion’ın barındırdığı MCP server üzerinde bir yardım merkezi agent’ı oluştururken, 248 araç çağrısı ortalama 2.7 saniye sürdü. Bunun neredeyse tamamı aradaki sıçrama değil, Notion araması ve sayfaların render edilmesiydi.
| Kurulum | Yaklaşık ek gecikme |
|---|---|
| Yerel MCP server (stdio) | Araç çağrısı başına < 1ms |
| Remote MCP server (API ile aynı bölge) | Araç çağrısı başına 1-5ms |
| Remote MCP server (API’den farklı bölge) | Araç çağrısı başına 10-50ms |
LLM inference’ın 500ms-5s sürdüğü çoğu AI agent kullanım senaryosunda MCP ek yükü ihmal edilebilir düzeydedir.
Bağlantı yönetimi
Doğrudan HTTP: Uygulamanız her harici API’ye bağlantıları yönetir. Bu, her API için connection pool’ları, retry mantığını ve rate limiting’i yönetmek anlamına gelir.
MCP: Uygulamanız MCP server başına bir bağlantı yönetir. Harici API bağlantısını server yönetir. 3 MCP server’a dağılmış 10 aracınız varsa 10 yerine 3 bağlantı yönetirsiniz.
MCP ne zaman kullanılmalı
Birden çok araç entegrasyonu
AI uygulamanızın 5+ harici servise bağlanması gerekiyorsa MCP entegrasyon yükünü azaltır. Her servis için özel API client’ları yazıp sürdürmek yerine MCP server’lara bağlanırsınız (bunların birçoğu açık kaynak projeler olarak mevcuttur).
AI platformları arasında taşınabilirlik
Araçlarınız için MCP server’lar oluşturursanız, bu server’lar herhangi bir MCP client ile çalışır: Claude Desktop, Cursor, Windsurf, özel uygulamalar ve Quickchat AI gibi platformlar. Doğrudan HTTP’de her platformun formatı için araç tanımlarını yeniden uygulamanız gerekir.
Dinamik araç keşfi
MCP, tools/list aracılığıyla runtime’da araç keşfini destekler. Bir AI uygulaması bir server’a bağlanıp herhangi bir hardcoded yapılandırma olmadan hangi araçların mevcut olduğunu öğrenebilir. Bu, araçların sık değiştiği veya kullanıcı tarafından yapılandırılabildiği senaryolarda yararlıdır.
Sorumlulukların ayrılması
Farklı ekipler farklı araçların sahibiyse MCP temiz bir sınır sağlar. Salesforce entegrasyonunun sahibi olan ekip, Salesforce MCP server’ı oluşturur ve sürdürür. AI uygulama ekibi, Salesforce API’sini anlamaya gerek duymadan bu server’a bağlanır. Salesforce API güncellemeleri, AI uygulamasına dokunmadan MCP server’da yönetilir.
Doğrudan HTTP ne zaman kullanılmalı
Bir veya iki entegrasyon
AI agent’ınızın yalnızca bir API’yi çağırması gerekiyorsa (örneğin bir veritabanı sorgusu), MCP server çalıştırmanın ek yükü gereksizdir. Doğrudan HTTP çağrısı daha basittir ve daha az hareketli parça içerir.
Ayrıca isteği elle yazmanız gerekmez. Düz İngilizce API Action builder, belgelenmiş bir REST API’yi okur, method’u, URL’yi, parametreleri ve açıklamayı üretir, ardından etkinleştirmeden önce gerçek yanıtı test etmenizi sağlar.
İstekler üzerinde azami kontrol
MCP server’lar HTTP ayrıntılarını soyutlar. İstek oluşturma üzerinde hassas kontrole ihtiyacınız varsa (belirli header’lar, query parametreleri, istek imzalama veya standart dışı kimlik doğrulama), doğrudan HTTP size bu kontrolü bir soyutlama katmanıyla uğraşmadan verir.
Gecikmeye duyarlı işlemler
Her milisaniye önemliyse (örneğin araç çağrılarının sıkı zaman bütçeleri içinde tamamlanması gereken gerçek zamanlı voice agent’lar), MCP katmanını kaldırmak bir sıçramayı ortadan kaldırır.
AI dışı HTTP çağrıları
HTTP çağrısı bir AI agent tarafından tetiklenmiyorsa (örneğin veri senkronize eden bir backend cron job), MCP ilgisizdir. MCP özellikle AI ile araç iletişimi için tasarlanmıştır. Normal backend servisleri normal HTTP client’ları kullanmalıdır.
Hibrit yaklaşım
Birçok production sistemi ikisini de kullanır. Kalıp şöyledir:
- Konuşmalar sırasında AI agent’ın çağırdığı araç entegrasyonları için MCP (CRM sorguları, ticket oluşturma, knowledge base sorguları)
- Dahili backend işlemleri, webhook’lar ve sistemden sisteme iletişim için Doğrudan HTTP
Quickchat AI içeride bu şekilde çalışır. Platform hem HTTP Request Actions (parametre şablonlamalı doğrudan API çağrıları) hem de Remote MCP Actions (harici MCP server bağlantıları) destekler. Her entegrasyon için doğru yaklaşımı seçersiniz:
| Entegrasyon türü | Önerilen yaklaşım |
|---|---|
| Bilinen parametrelerle basit API çağrısı | HTTP Request Action |
| Birden çok ilişkili araç içeren karmaşık entegrasyon | Remote MCP Action |
| Mevcut MCP server’ı olan üçüncü taraf servis | Remote MCP Action |
| Özel kimlik doğrulamalı dahili API | HTTP Request Action |
| Kullanıcı tarafından yapılandırılabilen araç | Remote MCP Action |
Bunun pratikte nasıl çalıştığına ilişkin ayrıntılı bir karşılaştırma, OpenAI’nin GPT Actions yaklaşımı ile MCP arasındaki farklar dahil olmak üzere GPT Actions vs MCP yazısında bulunur.
Karar çerçevesi
Seçim yapmak için bu akış şemasını kullanın:
- Aracı AI agent mı çağırıyor? Hayırsa (bu bir backend işlemiyse), doğrudan HTTP kullanın.
- Kaç harici araca ihtiyacınız var? 1-2 ise doğrudan HTTP daha basittir. 3+ ise MCP’yi değerlendirin.
- Servis için hazır bir MCP server var mı? Varsa, bunu kullanmak geliştirme süresinden tasarruf sağlar.
- Entegrasyonun birden çok AI platformunda çalışması gerekiyor mu? Evetse, MCP taşınabilirlik sağlar.
- Gecikme kritik mi (araç çağrıları için 100ms altı bütçe)? Evetse, MCP ek yükünü benchmark edin ve buna göre karar verin.
- Farklı entegrasyonların sahibi farklı ekipler mi? Evetse, MCP’nin entegrasyon başına server modeli sahiplik sınırlarına yardımcı olur.
Pratikte, harici servislerle etkileşim kurması gereken bir AI agent oluşturuyorsanız MCP giderek varsayılan seçenek haline gelmektedir. Hazır server ekosistemi, çoğu zaman hiç server kodu yazmadan başlamanıza yetecek kadar büyüktür.
Ek okuma
- AI Agent’ınızı Remote MCP Server’a bağlayın: Agent’ınıza canlı araçları adım adım verin
- Model Context Protocol nasıl çalışır. MCP açıklaması: MCP’ye giriş
- GPT Actions vs MCP: OpenAI’nin yaklaşımıyla karşılaştırma
- MCP Specification: Resmi protokol spesifikasyonu
- HubSpot AI Actions: Pratikte HTTP tabanlı AI actions örneği
- OpenAI Hugging Face olayı, gerçekte ne oldu: Olayın adım adım açıklaması ve hacking’in gerçekte ne anlama geldiği