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
- Ağ yüzeyi yok. Açılacak bir bağlantı noktası, HTTP dinleyicisi ve yerel kullanım için yapılandırılacak TLS veya kimlik doğrulama yoktur. İletişim saf stdin ve stdout'tur.
- Yerel-yerli desen. Claude Code ve Cursor gibi yapay zeka kodlama araçları MCP sunucularını stdio üzerinden başlatır, dolayısıyla sunucunuz bir adaptör olmadan entegre olur.
- Temiz yaşam döngüsü ve yalıtım. Sunucu, istemci süreciyle birlikte yaşar ve ölür. İstemci başına bir sunucu, paylaşılan durum yok ve artık dinleyici yok.
- Aynı MCP API'si. Araçlar, istemler ve kaynaklar HTTP sunucusuyla aynı şekilde kaydedilir. İstemcide taşıma değiştirmek tek bir özelliktir.
- Masaüstü ve çevrimdışı kullanım için ideal. Bir HTTP uç noktası açmak gereksiz veya istenmeyen olduğunda, stdio her şeyi yerel makinenin içinde tutar.
- Sağlam çerçeveleme. Geniş istemci uyumluluğu için gelen mesajlarda baştaki bir bayt sırası işaretinin (byte-order mark) tolere edildiği, UTF-8 üzerinden satırsonu ile sınırlandırılmış JSON-RPC.
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.
