Met de sgcWebSockets Model Context Protocol (MCP)-componenten kunt u al MCP-servers en -clients in Delphi bouwen via HTTP en Streamable HTTP. Deze release voegt een derde transport toe aan beide kanten: stdio. Uw MCP-server kan nu via standaard input en output draaien, en uw MCP-client kan een serverexecutable starten en ermee communiceren over die procesgrens. Geen HTTP-listener, geen poort, geen TLS-configuratie voor lokaal gebruik.
Dit is belangrijk omdat stdio de native manier is waarop moderne AI-codeeragents verbinding maken met MCP-servers. Tools zoals Claude Code, Cursor en andere MCP-clients starten een server als kindproces en wisselen JSON-RPC uit via stdin en stdout. Met dit transport stapt een Delphi MCP-server rechtstreeks in dat ecosysteem.
Wat het stdio-transport is
In het stdio-transport leest het serverproces met newline gescheiden JSON-RPC-berichten uit stdin en schrijft het JSON-RPC-antwoorden naar stdout, één compact JSON-object per regel, gecodeerd als UTF-8. De client beheert de relatie: hij start de serverexecutable, schrijft verzoeken naar de invoerpipe van het kind en leest antwoorden uit zijn uitvoerpipe, waarbij elk antwoord aan zijn verzoek wordt gekoppeld via het JSON-RPC-id. Door de server geïnitieerde notificaties reizen via hetzelfde kanaal.
Vergeleken met HTTP is er helemaal geen socket en geen netwerkoppervlak. Alles verloopt via geërfde pipes tussen een ouder- en een kindproces op dezelfde machine.
Een MCP-server via stdio draaien
De nieuwe TsgcAI_MCP_Server_Stdio-host omhult dezelfde MCP-kern die de HTTP-server gebruikt, dus u registreert tools, prompts en resources precies zoals voorheen. Bouw het als een console-applicatie, registreer uw tools en roep vervolgens Run aan om berichten te gaan verwerken.
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.
Eén regel bij het bouwen van een stdio-server: stdout is het protocolkanaal, dus schrijf er nooit banners of logs naartoe. Stuur eventuele diagnostiek in plaats daarvan naar stderr of een bestand.
Een MCP-client verbinden via stdio
Aan de clientzijde behoudt u dezelfde publieke API. Selecteer het stdio-transport en vertel de client welke executable hij moet starten via de nieuwe StdioOptions. De client start het proces, voert de initialize-handshake uit en stelt vervolgens tools, prompts en resources beschikbaar net als de HTTP-client.
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;
Het antwoord wordt geleverd via de gebruikelijke OnMCPResponseTool-event, en servernotificaties komen binnen via OnMCPLoggingMessage, OnMCPProgress en de andere notificatie-events, identiek aan het HTTP-transport. StdioOptions accepteert ook Environment-vermeldingen wanneer het kindproces specifieke omgevingsvariabelen nodig heeft.
Gebruik het met Claude Code en andere AI-agents
Omdat het transport de MCP stdio-conventie volgt, kan elke conforme MCP-client uw Delphi-server starten. Om het bij Claude Code te registreren, voegt u een vermelding toe aan de MCP-configuratie die naar uw executable verwijst.
{
"mcpServers": {
"my-delphi-server": {
"command": "C:\\MyServer\\MyDelphiServer.exe",
"args": ["--stdio"]
}
}
}
De agent start de server op aanvraag, somt de tools op die u hebt geregistreerd en roept ze aan terwijl hij werkt. Uw Delphi-code wordt een eersteklas tool-provider voor AI-assistenten, zonder dat er een webserver hoeft te worden geïmplementeerd of beveiligd.
Voordelen
- Geen netwerkoppervlak. Er is geen poort om te openen, geen HTTP-listener en geen TLS of authenticatie om te configureren voor lokaal gebruik. Communicatie is puur stdin en stdout.
- Het native lokale patroon. AI-codeertools zoals Claude Code en Cursor starten MCP-servers via stdio, dus uw server integreert zonder adapter.
- Schone levenscyclus en isolatie. De server leeft en sterft met het clientproces. Eén server per client, geen gedeelde staat en geen achtergebleven listeners.
- Dezelfde MCP-API. Tools, prompts en resources worden op dezelfde manier geregistreerd als bij de HTTP-server. Het wisselen van transport op de client is één enkele eigenschap.
- Ideaal voor desktop- en offline gebruik. Wanneer het blootstellen van een HTTP-endpoint onnodig of ongewenst is, houdt stdio alles binnen de lokale machine.
- Robuuste framing. Met newline gescheiden JSON-RPC over UTF-8, met een voorafgaande byte-order mark die op inkomende berichten wordt getolereerd voor brede clientcompatibiliteit.
Upgraden
Het stdio-transport is een drop-in toevoeging. Bestaande HTTP- en Streamable HTTP-servers en -clients blijven ongewijzigd, en het nieuwe transport hergebruikt hetzelfde tool-, prompt- en resourcemodel, dus er is niets te migreren. Om het in gebruik te nemen, bouwt u uw server als een console-applicatie rond TsgcAI_MCP_Server_Stdio, of stelt u Transport in op aimcptrStdio op de client. U kunt de nieuwste versie downloaden van de sgcWebSockets-downloadpagina.
Vragen, feedback of hulp bij migratie? Neem contact op, u krijgt antwoord van de mensen die de code hebben geschreven.
