MCP-stdio-Transport für sgcWebSockets

· Komponenten

Mit den Model-Context-Protocol-(MCP-)Komponenten von sgcWebSockets können Sie bereits MCP-Server und -Clients in Delphi über HTTP und Streamable HTTP erstellen. Diese Version fügt beiden Seiten einen dritten Transport hinzu: stdio. Ihr MCP-Server kann jetzt über Standard-Eingabe und -Ausgabe laufen, und Ihr MCP-Client kann eine Server-Executable starten und über diese Prozessgrenze hinweg mit ihr kommunizieren. Kein HTTP-Listener, kein Port, keine TLS-Konfiguration für die lokale Nutzung.

Das ist wichtig, weil stdio die native Art ist, mit der moderne KI-Coding-Agenten sich mit MCP-Servern verbinden. Tools wie Claude Code, Cursor und andere MCP-Clients starten einen Server als Kindprozess und tauschen JSON-RPC über dessen stdin und stdout aus. Mit diesem Transport fügt sich ein Delphi-MCP-Server direkt in dieses Ökosystem ein.

Was der stdio-Transport ist

Beim stdio-Transport liest der Serverprozess durch Zeilenumbrüche getrennte JSON-RPC-Nachrichten von stdin und schreibt JSON-RPC-Antworten nach stdout, ein kompaktes JSON-Objekt pro Zeile, kodiert als UTF-8. Der Client besitzt die Beziehung: Er startet die Server-Executable, schreibt Anfragen in die Eingabe-Pipe des Kindprozesses und liest Antworten aus dessen Ausgabe-Pipe, wobei er jede Antwort über die JSON-RPC-id ihrer Anfrage zuordnet. Vom Server initiierte Benachrichtigungen laufen über denselben Kanal.

Im Vergleich zu HTTP gibt es überhaupt keinen Socket und keine Netzwerkangriffsfläche. Alles geschieht über vererbte Pipes zwischen einem Eltern- und einem Kindprozess auf derselben Maschine.

Einen MCP-Server über stdio betreiben

Der neue Host TsgcAI_MCP_Server_Stdio kapselt denselben MCP-Kern, der auch vom HTTP-Server verwendet wird, sodass Sie Tools, Prompts und Ressourcen genau wie zuvor registrieren. Bauen Sie ihn als Konsolenanwendung, registrieren Sie Ihre Tools und rufen Sie dann Run auf, um mit dem Verarbeiten der Nachrichten zu beginnen.

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.

Eine Regel beim Bau eines stdio-Servers: stdout ist der Protokollkanal, schreiben Sie also niemals Banner oder Logs dorthin. Senden Sie jegliche Diagnoseausgaben stattdessen an stderr oder in eine Datei.

Einen MCP-Client über stdio verbinden

Auf der Client-Seite behalten Sie dieselbe öffentliche API. Wählen Sie den stdio-Transport und teilen Sie dem Client über die neuen StdioOptions mit, welche Executable gestartet werden soll. Der Client startet den Prozess, führt den Initialisierungs-Handshake durch und stellt dann Tools, Prompts und Ressourcen genau wie der HTTP-Client bereit.

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;

Die Antwort wird über das übliche Ereignis OnMCPResponseTool geliefert, und Server-Benachrichtigungen treffen über OnMCPLoggingMessage, OnMCPProgress und die anderen Benachrichtigungsereignisse ein, identisch zum HTTP-Transport. StdioOptions akzeptiert auch Environment-Einträge, wenn der Kindprozess bestimmte Umgebungsvariablen benötigt.

Verwenden Sie es mit Claude Code und anderen KI-Agenten

Da der Transport der MCP-stdio-Konvention folgt, kann jeder konforme MCP-Client Ihren Delphi-Server starten. Um ihn bei Claude Code zu registrieren, fügen Sie der MCP-Konfiguration einen Eintrag hinzu, der auf Ihre Executable zeigt.

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

Der Agent startet den Server bei Bedarf, listet die von Ihnen registrierten Tools auf und ruft sie während seiner Arbeit auf. Ihr Delphi-Code wird so zum vollwertigen Tool-Anbieter für KI-Assistenten, ganz ohne Webserver, der bereitgestellt oder abgesichert werden müsste.

Vorteile

Aktualisieren

Der stdio-Transport ist eine nahtlose Ergänzung. Bestehende HTTP- und Streamable-HTTP-Server und -Clients bleiben unverändert, und der neue Transport verwendet dasselbe Tool-, Prompt- und Ressourcenmodell wieder, sodass es nichts zu migrieren gibt. Um ihn zu übernehmen, bauen Sie Ihren Server als Konsolenanwendung rund um TsgcAI_MCP_Server_Stdio oder setzen Sie Transport auf dem Client auf aimcptrStdio. Sie können die neueste Version von der sgcWebSockets-Downloadseite herunterladen.

Fragen, Feedback oder Hilfe bei der Migration? Nehmen Sie Kontakt auf, Sie erhalten eine Antwort von den Menschen, die den Code geschrieben haben.