Delphi'de Model Context Protocol (MCP) Sunucusu Oluşturma

· Bileşenler

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:

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:

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:

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