sgcWebSockets için MCP stdio Taşıması

· Bileşenler

sgcWebSockets Model Context Protocol (MCP) bileşenleri zaten HTTP ve Streamable HTTP üzerinden Delphi'de MCP sunucuları ve istemcileri oluşturmanıza olanak tanır. Bu sürüm, her iki tarafa üçüncü bir taşıma ekler: stdio. MCP sunucunuz artık standart giriş ve çıkış üzerinden çalışabilir ve MCP istemciniz bir sunucu çalıştırılabilirini başlatıp o süreç sınırı boyunca onunla iletişim kurabilir. Yerel kullanım için HTTP dinleyicisi yok, bağlantı noktası yok, TLS yapılandırması yok.

Bu önemlidir çünkü stdio, modern yapay zeka kodlama ajanlarının MCP sunucularına bağlanmasının yerel yoludur. Claude Code, Cursor ve diğer MCP istemcileri gibi araçlar, bir sunucuyu alt süreç olarak başlatır ve onun stdin ve stdout'u üzerinden JSON-RPC alışverişi yapar. Bu taşımayla, bir Delphi MCP sunucusu doğrudan bu ekosisteme yerleşir.

stdio taşıması nedir

stdio taşımasında, sunucu süreci stdin'den satırsonu ile sınırlandırılmış JSON-RPC mesajlarını okur ve stdout'a satır başına bir kompakt JSON nesnesi olacak şekilde, UTF-8 kodlu JSON-RPC yanıtları yazar. İlişkinin sahibi istemcidir: sunucu çalıştırılabilirini başlatır, istekleri alt sürecin giriş kanalına yazar ve yanıtları çıkış kanalından okur, her yanıtı JSON-RPC id'sine göre isteğiyle eşleştirir. Sunucu kaynaklı bildirimler aynı kanaldan geçer.

HTTP ile karşılaştırıldığında, hiç soket ve hiç ağ yüzeyi yoktur. Her şey, aynı makinedeki bir ana süreç ile bir alt süreç arasındaki devralınmış kanallar (pipe) aracılığıyla gerçekleşir.

stdio üzerinden bir MCP sunucusu çalıştırma

Yeni TsgcAI_MCP_Server_Stdio ana bilgisayarı, HTTP sunucusunun kullandığı aynı MCP çekirdeğini sarmalar, dolayısıyla araçları, istemleri ve kaynakları tam olarak önceki gibi kaydedersiniz. Onu bir konsol uygulaması olarak derleyin, araçlarınızı kaydedin, ardından mesaj pompalamaya başlamak için Run çağırın.

uses
  SysUtils, sgcAI_MCP_Server, sgcAI_MCP_Classes, sgcAI_MCP_Types;

type
  TServerHandler = class
    procedure OnRequestTool(Sender: TObject; const aSession: TsgcAI_MCP_Session;
      const aRequest: TsgcAI_MCP_Request_ToolsCall;
      const aResponse: TsgcAI_MCP_Response_ToolsCall);
  end;

procedure TServerHandler.OnRequestTool(Sender: TObject;
  const aSession: TsgcAI_MCP_Session;
  const aRequest: TsgcAI_MCP_Request_ToolsCall;
  const aResponse: TsgcAI_MCP_Response_ToolsCall);
var
  vA, vB: Double;
begin
  if aRequest.Params.Name = 'add' then
  begin
    vA := aRequest.Params.Arguments.Node['a'].Value;
    vB := aRequest.Params.Arguments.Node['b'].Value;
    aResponse.Result.Content.AddText(FloatToStr(vA + vB));
  end;
end;

var
  oServer: TsgcAI_MCP_Server_Stdio;
  oTool: TsgcAI_MCP_Tool;
  oHandler: TServerHandler;
begin
  oHandler := TServerHandler.Create;
  oServer := TsgcAI_MCP_Server_Stdio.Create(nil);
  try
    oServer.ServerInfo.Name := 'MyDelphiServer';
    oServer.ServerInfo.Version := '1.0';

    // register a tool, exactly like the HTTP server
    oTool := oServer.MCPServer.Tools.AddTool('add', 'Adds two numbers');
    oTool.InputSchema.Properties.AddProperty('a', True, aimcpjtNumber);
    oTool.InputSchema.Properties.AddProperty('b', True, aimcpjtNumber);

    oServer.MCPServer.OnMCPRequestTool := oHandler.OnRequestTool;

    // read JSON-RPC from stdin, write responses to stdout, blocks until EOF
    oServer.Run;
  finally
    oServer.Free;
    oHandler.Free;
  end;
end.

Bir stdio sunucusu oluştururken tek bir kural: stdout protokol kanalıdır, dolayısıyla ona asla başlık (banner) veya günlük yazmayın. Tüm tanılamaları bunun yerine stderr'e veya bir dosyaya gönderin.

stdio üzerinden bir MCP istemcisi bağlama

İstemcide aynı genel API'yi korursunuz. stdio taşımasını seçin ve yeni StdioOptions aracılığıyla istemciye hangi çalıştırılabiliri başlatacağını söyleyin. İstemci süreci başlatır, başlatma el sıkışmasını gerçekleştirir ve ardından tıpkı HTTP istemcisi gibi araçları, istemleri ve kaynakları açığa çıkarır.

uses
  sgcAI_MCP_Client, sgcAI_MCP_Types;

var
  oClient: TsgcWSAPI_Client_MCP;
begin
  oClient := TsgcWSAPI_Client_MCP.Create(nil);
  try
    // select the stdio transport and point it at the server executable
    oClient.MCPOptions.Transport := aimcptrStdio;
    oClient.MCPOptions.StdioOptions.Command := 'C:\MyServer\MyDelphiServer.exe';
    oClient.MCPOptions.StdioOptions.Arguments := '--stdio';
    oClient.MCPOptions.StdioOptions.WorkingDir := 'C:\MyServer';
    oClient.MCPOptions.StdioOptions.Timeout := 20000;

    // the client launches the server and runs the MCP handshake
    oClient.Initialize;

    // discover tools and call one, the result arrives in OnMCPResponseTool
    oClient.ListTools;
    oClient.RequestTool('add', BuildArguments(2, 3));
  finally
    oClient.Free;
  end;
end;

Yanıt, her zamanki OnMCPResponseTool olayı aracılığıyla teslim edilir ve sunucu bildirimleri, HTTP taşımasıyla aynı olarak OnMCPLoggingMessage, OnMCPProgress ve diğer bildirim olayları aracılığıyla gelir. StdioOptions ayrıca, alt sürecin belirli ortam değişkenlerine ihtiyaç duyduğunda Environment girdilerini de kabul eder.

Claude Code ve diğer yapay zeka ajanlarıyla kullanın

Taşıma, MCP stdio kuralını izlediğinden, uyumlu herhangi bir MCP istemcisi Delphi sunucunuzu başlatabilir. Onu Claude Code ile kaydetmek için, MCP yapılandırmasına çalıştırılabilirinizi işaret eden bir girdi ekleyin.

{
  "mcpServers": {
    "my-delphi-server": {
      "command": "C:\\MyServer\\MyDelphiServer.exe",
      "args": ["--stdio"]
    }
  }
}

Ajan, sunucuyu talep üzerine başlatır, kaydettiğiniz araçları listeler ve çalışırken onları çağırır. Delphi kodunuz, dağıtılacak veya güvenliği sağlanacak bir web sunucusu olmadan, yapay zeka asistanları için birinci sınıf bir araç sağlayıcısı olur.

Avantajlar

Yükseltme

stdio taşıması tak çalıştır bir eklemedir. Mevcut HTTP ve Streamable HTTP sunucuları ve istemcileri değişmeden kalır ve yeni taşıma aynı araç, istem ve kaynak modelini yeniden kullanır, dolayısıyla taşınacak bir şey yoktur. Onu benimsemek için, sunucunuzu TsgcAI_MCP_Server_Stdio etrafında bir konsol uygulaması olarak derleyin veya istemcide Transport'u aimcptrStdio olarak ayarlayın. En son sürümü sgcWebSockets indirme sayfasından indirebilirsiniz.

Sorular, geri bildirim veya geçiş yardımı mı? Bize ulaşın, kodu yazan kişilerden bir yanıt alacaksınız.