Model Context Protocol Nedir?
Model Context Protocol (MCP), araçları, verileri ve komut şablonlarını Yapay Zeka modellerine sunmak için Anthropic'in açık standardıdır. Bunu Yapay Zeka için USB olarak düşünün: herhangi bir MCP sunucusu herhangi bir MCP istemcisine (Claude Desktop, Cursor, Continue, kendi Delphi uygulamanız, OpenAI'nin istemcileri) takılabilir ve model hangi araçların mevcut olduğunu ve bunları nasıl çağıracağını hemen keşfeder.
MCP'den önce her Yapay Zeka entegrasyonu, araç tanımlarını, JSON şemalarını ve çağrı dağıtıcılarını her bir uygulamaya bağlamak anlamına geliyordu. MCP bunu tek bir protokolde toplar: sunucuyu bir kez yazın, her model onu kullanabilir. Halihazırda bir yığın iş API'sine sahip Delphi firmaları için — ERP sorguları, CRM aramaları, dosya üreticileri, faturalama işlevleri — MCP, bu API'leri Yapay Zeka erişilebilir hale getirmenin en ucuz yoludur.
Bu eğitim, TsgcAI_MCP_Server bileşenini kullanarak Delphi'de bir MCP sunucusu oluşturmayı, çalışan bir get_weather aracını sunmayı ve onu hem stdio hem de HTTP taşımaları üzerinden Claude Desktop'a bağlamayı adım adım anlatır.
Biraz tarih, MCP'yi bağlama oturtur. Anthropic, spesifikasyonu 2024 sonlarında uyumsuz araç çağırma biçimlerinin çoğalmasına bir yanıt olarak yayınladı — OpenAI'nin işlev çağırma JSON'u, Google'ın Gemini grounding araçları, her sağlayıcının özel şeması. Bunu okuduğunuzda, MCP desteği Claude Desktop, Cursor, Continue, Zed ve çoğu modern Yapay Zeka IDE'sinde yer alıyor olacak; OpenAI 2026 başında uyumluluğu duyurdu. Başka bir deyişle: bugün bir MCP sunucusu oluşturmak, müşterilerinizin hem bugün hem de yarın kullanabileceği her istemciye dağılan tek seferlik bir yatırımdır.
MCP Yapı Taşları
Bir MCP sunucusu üç tür yetenek sunabilir:
| Araçlar Tür belirtilmiş girdilere sahip çağrılabilir işlevler. Model bunları ne zaman çağıracağına karar verir. Örnek: get_weather(city), create_invoice(customer, lines). |
Kaynaklar Modelin getirebileceği salt okunur veriler. Her kaynağın bir URI'si vardır. Örnek: file:///docs/handbook.md, db://customers/12345. |
Komutlar Modelin değil, kullanıcının seçtiği yeniden kullanılabilir komut şablonları. Örnek: bir "Resmi İspanyolcaya Çevir" veya "Toplantı notlarını özetle" şablonu. |
Protokol, iki taşımadan biri üzerinden JSON-RPC 2.0 kullanır: stdio (sunucu bir alt süreçtir; mesajlar stdin/stdout üzerinden akar) veya sunucudan istemciye akış için Server-Sent Events ile HTTP. Stdio, Claude Desktop gibi masaüstü entegrasyonları için varsayılandır; HTTP, sunucu farklı bir makinede çalıştığında veya birden fazla istemciye hizmet verdiğinde doğru seçimdir.
Bileşen, her iki taşımayı da tek bir API'nin arkasına gizler. Araç işleyicinizi bir kez yazarsınız, ardından başlangıçta taşımayı seçersiniz. Aynı kod, bir Claude Desktop yardımcısı, ağdan erişilebilir bir HTTP hizmeti veya tek bir süreç içinde aynı anda her ikisi olarak çalışır. Tek bir makinede 30'dan fazla MCP sunucusu çalıştıran, farklı bağlantı noktaları ve bir veya iki stdio ikili dosyası üzerinden çoğullanan ve tümü aynı Delphi kod tabanına hizmet veren firmalarımız var.
Proje Kurulumu
uses bölümünüze sgcAI_MCP_Server ekleyin, forma bir TsgcAI_MCP_Server bırakın (veya bir konsol uygulaması için kodda oluşturun), olayları bağlayın ve başlatın. Bileşen, JSON-RPC çerçevelemesini, mesaj yönlendirmesini ve yetenek duyurusunu sizin için yapar.
uses sgcAI_MCP_Server, sgcAI_MCP_Classes; procedure TForm1.FormCreate(Sender: TObject); begin oMCP := TsgcAI_MCP_Server.Create(Self); oMCP.ServerInfo.Name := 'weather-mcp'; oMCP.ServerInfo.Version := '1.0.0'; // Wire handlers oMCP.OnListTools := DoListTools; oMCP.OnCallTool := DoCallTool; // Stdio transport for Claude Desktop integration oMCP.Transport := mtStdio; oMCP.Active := True; end;
Bir Aracın Uygulanması: get_weather
Bir araç iki işleyiciye ihtiyaç duyar. OnListTools, istemciye hangi araçların var olduğunu ve hangi bağımsız değişkenleri kabul ettiklerini söyler. OnCallTool, çağrıyı asıl çalıştırandır. Her iki işleyici de sade Delphi olaylarıdır — manuel JSON oluşturma yoktur.
procedure TForm1.DoListTools(Sender: TObject;
const aTools: TsgcAI_MCP_Tools);
var
oTool: TsgcAI_MCP_Tool;
begin
oTool := aTools.Add;
oTool.Name := 'get_weather';
oTool.Description := 'Return the current weather for a city.';
oTool.InputSchema :=
'{"type":"object",' +
'"properties":{' +
'"city":{"type":"string","description":"City name, e.g. Madrid"},' +
'"units":{"type":"string","enum":["metric","imperial"],"default":"metric"}' +
'},' +
'"required":["city"]}';
end;
procedure TForm1.DoCallTool(Sender: TObject;
const aRequest : TsgcAI_MCP_ToolCall;
const aResult : TsgcAI_MCP_ToolResult);
var
vCity, vUnits, vReport: string;
begin
if aRequest.Name = 'get_weather' then
begin
vCity := aRequest.Arguments.S['city'];
vUnits := aRequest.Arguments.S['units'];
if vUnits = '' then vUnits := 'metric';
// Call your own weather backend
vReport := MyWeatherService.Fetch(vCity, vUnits);
aResult.AddText(vReport);
end
else
aResult.Error('Unknown tool: ' + aRequest.Name);
end;
Tam uygulama budur. Bileşen, şemaya karşı girdi doğrulaması, hata biçimlendirmesi ve temel JSON-RPC zarfı ile ilgilenir. Siz iş mantığına odaklanırsınız.
İyi araçlar tasarlamak için zor yoldan öğrenilen birkaç ilke:
- Araç başına bir fiil. "get_weather", bir alt eylem parametresiyle "weather_operations"'tan daha iyidir. Her ad tam olarak bir sonucu tanımladığında model doğru aracı daha hızlı seçer.
- Açıklamalarda acımasız olun. Şema açıklaması, modele aracın ne yapıp ne yapmadığını öğretmek için tek şansınızdır. Uç durumları, birimleri, biçimleri ve ön koşulları açıkça belirtin.
- Yapabildiğiniz her şeye varsayılan değer verin. Makul varsayılanlara sahip isteğe bağlı parametreler, model bağlamın yalnızca yarısını bildiğinde bile aracınızı başarıyla çağırmasını sağlar.
- Küçük, odaklanmış yükler döndürün. 50 satırlık bir metin yanıtı iyidir; 5.000 satırlık bir döküm, bağlam penceresini ve faturayı şişirir. Sunucu tarafında özetleyin.
- Açıkça başarısız olun. Sessizce boş sonuçlar döndürmek yerine yapılandırılmış bir hata mesajı döndürün ("Şehir tanınmadı. Madrid mi yoksa Madras mı demek istediniz?").
Kaynakları Sunma
Araçlar eylemler içindir; kaynaklar modelin okuyabileceği veriler içindir. Bir kaynak işleyicisi, belirli bir URI için içeriği döndürür. Bir belge sunucusu, docs/ altındaki her Markdown dosyasını bir kaynak olarak sunabilir.
oMCP.OnListResources := DoListResources;
oMCP.OnReadResource := DoReadResource;
procedure TForm1.DoListResources(Sender: TObject;
const aResources: TsgcAI_MCP_Resources);
var
vFiles: TStringDynArray;
i : Integer;
oRes : TsgcAI_MCP_Resource;
begin
vFiles := TDirectory.GetFiles('C:\docs', '*.md');
for i := 0 to High(vFiles) do
begin
oRes := aResources.Add;
oRes.URI := 'file:///' + StringReplace(vFiles[i], '\', '/', [rfReplaceAll]);
oRes.Name := ExtractFileName(vFiles[i]);
oRes.MimeType := 'text/markdown';
oRes.Description := 'Documentation page';
end;
end;
procedure TForm1.DoReadResource(Sender: TObject;
const aURI: string; const aResult: TsgcAI_MCP_ResourceResult);
var
vPath: string;
begin
vPath := StringReplace(Copy(aURI, 9, MaxInt), '/', '\', [rfReplaceAll]);
if FileExists(vPath) then
aResult.AddText(TFile.ReadAllText(vPath))
else
aResult.Error('Resource not found');
end;
Stdio ve HTTP Taşıması
Taşımayı, sunucunun nerede çalıştığına ve onu kimin kullandığına göre seçin.
| Taşıma | Kullanım senaryosu | Artıları | Eksileri |
| Stdio | Yerel masaüstü araçları (Claude Desktop, Cursor) | Sıfır yapılandırma, bağlantı noktası yok, işletim sistemi süreç yaşam döngüsünü yönetir | Süreç başına bir istemci, uzaktan erişim yok |
| HTTP / SSE | Paylaşılan kurumsal sunucular, web istemcileri, çok kiracılı | Birçok istemci, ağdan erişilebilir, TLS, kimlik doğrulama | Barındırma, bağlantı noktası yönetimi, kimlik doğrulama tasarımı gerektirir |
Taşımayı değiştirmek tek satırlıktır:
// Stdio (default for desktop) oMCP.Transport := mtStdio; // HTTP listener on port 8080 oMCP.Transport := mtHTTP; oMCP.HTTPOptions.Host := '0.0.0.0'; oMCP.HTTPOptions.Port := 8080; oMCP.HTTPOptions.TLS.Enabled := True; oMCP.HTTPOptions.TLS.CertFile := 'cert.pem'; oMCP.HTTPOptions.TLS.KeyFile := 'key.pem'; oMCP.Active := True;
Claude Desktop'tan Bağlanma
Stdio için claude_desktop_config.json dosyasını düzenleyin ve derlenmiş .exe dosyanıza işaret eden bir giriş ekleyin. Claude Desktop, süreci talep üzerine başlatır.
{
"mcpServers": {
"weather": {
"command": "C:\\Tools\\weather-mcp.exe",
"args": []
}
}
}
Claude Desktop'ı yeniden başlatın ve komut alanında küçük bir araçlar simgesi göreceksiniz. "Tokyo'da hava nasıl?" diye sorun ve Claude Delphi aracınızı çağıracaktır.
HTTP için MCP özellikli herhangi bir istemciyi https://your-host:8080/mcp adresine yönlendirin. Aynı Delphi sunucusu, aynı anda bir Claude Desktop örneğini, bir Cursor oturumunu ve özel bir Delphi MCP istemcisini sorunsuzca işler.
Komutlar: Yeterince Kullanılmayan Üçüncü Yetenek
Tüm ilgiyi araçlar ve kaynaklar görür; komutlar sessiz iş gücüdür. Bir MCP komutu, kullanıcının MCP istemcisindeki bir UI menüsünden çağırdığı yeniden kullanılabilir bir şablondur — "bu toplantıyı özetle", "eylem maddelerini çıkar", "resmi İspanyolcaya çevir" —. Model daha sonra bu komutu kullanıcının sağladığı her bağlama karşı çalıştırır.
Dahili araçlar için bu altın değerindedir. Destek ekibiniz, Claude Desktop içinde şirket onaylı komutların özenle seçilmiş bir listesini alır. Satış ekibiniz, üslubunuzu zaten bilen bir "takip e-postası taslağı" komutu alır. Hiçbirinin komut mühendisliği öğrenmesi gerekmez — yalnızca şablonu seçerler.
oMCP.OnListPrompts := DoListPrompts;
oMCP.OnGetPrompt := DoGetPrompt;
procedure TForm1.DoListPrompts(Sender: TObject;
const aPrompts: TsgcAI_MCP_Prompts);
var
oPrompt: TsgcAI_MCP_Prompt;
begin
oPrompt := aPrompts.Add;
oPrompt.Name := 'summarise_meeting';
oPrompt.Description := 'Turn a meeting transcript into bullet decisions and actions.';
oPrompt.AddArgument('transcript', 'Plain-text transcript', True);
end;
procedure TForm1.DoGetPrompt(Sender: TObject;
const aRequest: TsgcAI_MCP_PromptRequest;
const aResult : TsgcAI_MCP_PromptResult);
begin
if aRequest.Name = 'summarise_meeting' then
aResult.AddMessage('user',
'You are a meeting note taker. Read the transcript and produce: ' +
'(1) a 3-sentence summary, (2) decisions taken, (3) action items ' +
'with owners and due dates.' + sLineBreak + sLineBreak +
aRequest.Arguments.S['transcript']);
end;
Üretim Hususları
Bir MCP sunucusunu üretime göndermeden önce hesaba katmanız gereken birkaç şey:
- Kimlik doğrulama: stdio işletim sistemi düzeyindeki güveni devralır, ancak HTTP bearer tokenları veya mTLS gerektirir. Doğrulamak için
OnHTTPAuthenticatekullanın. - Rate limiting: konuşkan bir model, araç çağrılarını sıkı döngülerde tetikleyebilir. MCP sunucusunu
TsgcWebSocketHTTPServer_RateLimiterveya kendi kota mantığınızla eşleştirin. - Günlük kaydı: her araç çağrısını yakalamak için
OnLog'u bağlayın. Bir kullanıcı "Claude tuhaf bir şey yaptı" diye bildirdiğinde buna ihtiyacınız olacak. - Şema disiplini: JSON şemalarınız (açıklamalar, enumlar, örnekler) ne kadar doğru olursa, model doğru bağımsız değişkenlerle doğru aracı o kadar iyi seçer.
- Idempotency: model yeniden denerse araçlar iki kez çağrılabilir. Yazma işlemlerini idempotent olarak işaretleyin veya bir işlem kimliği parametresi ekleyin.
Hata Ayıklama İpuçları
MCP, Yapay Zeka istemcisinin içinde görünmez bir şekilde çalışır; bu da bir şeyler ilk kez ters gittiğinde hata ayıklamayı zorlaştırır. Üç alışkanlık size saatler kazandıracaktır:
- Stderr sizin konsolunuzdur. stdio modunda stdout, JSON-RPC'ye aittir. Ona yazdığınız her şey protokolü bozar. stderr'e (Claude Desktop bunu günlük dosyalarına yakalar) veya bir süreç kimliği son ekine sahip bir yan günlük dosyasına günlük kaydedin.
- MCP Inspector'ı kullanın. Anthropic, bir UI'yi sunucunuza yönlendirmenize, her aracı tıklamanıza, ham istek/yanıtı görmenize ve hiç bir Yapay Zeka istemcisi dahil etmeden şemaları doğrulamanıza olanak tanıyan ücretsiz bir araç (
npx @modelcontextprotocol/inspector) sunar. - Bir "tanılama" aracı ekleyin. Derleme tarihini, ana bilgisayarı ve sürümü döndüren basit bir
server_infoaracı, Yapay Zeka istemcisinde doğru sunucuyla konuştuğunuzu teyit etmeyi önemsiz hale getirir. Bunu her üretim MCP sunucusuna ekleriz.
Özet
MCP, dahili bir Delphi API'sini, istemci başına bağlama olmadan her modern Yapay Zeka istemcisinin kullanabileceği bir şeye dönüştürür. TsgcAI_MCP_Server bileşeni JSON-RPC çerçevelemesini, taşımayı ve yetenek duyurusunu işler ve size yalnızca asıl araç gövdesini yazmayı bırakır. Salt okunur bir araçla başlayın, modelin onu nasıl kullandığını görün, ardından yazmalara, kaynaklara ve komutlara genişletin.
MCP'yi dahili olarak yaygınlaştırmaktan çıkardığımız en büyük ders: değer "Claude artık API'lerimizi kullanabilir" değildir. Değer, "şirketteki herkes, API'yi öğrenmeden doğal dil aracılığıyla API'lerimizi kullanabilir" olmasıdır. Bu, kimin ne yapabileceğini değiştirir ve asıl üretkenlik kazancı buradan gelir.
Eşleşen istemciyi mi istiyorsunuz? Herhangi bir MCP sunucusunu tüketen Delphi uygulamaları oluşturmak için TsgcAI_MCP_Client'a bakın. Ve Yapay Zeka bileşenlerinde yeniyseniz, Başlarken merkezi sizi beş dakikada kurulum boyunca yönlendirir.