MCP stdio-transport voor sgcWebSockets

· Componenten

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

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.