Transporte MCP stdio para sgcWebSockets

· Componentes

Los componentes Model Context Protocol (MCP) de sgcWebSockets ya te permiten crear servidores y clientes MCP en Delphi sobre HTTP y Streamable HTTP. Esta versión añade un tercer transporte a ambos lados: stdio. Tu servidor MCP ya puede ejecutarse sobre la entrada y salida estándar, y tu cliente MCP puede lanzar un ejecutable de servidor y comunicarse con él a través de esa frontera entre procesos. Sin escucha HTTP, sin puerto, sin configuración de TLS para uso local.

Esto importa porque stdio es la forma nativa en que los agentes modernos de programación con IA se conectan a los servidores MCP. Herramientas como Claude Code, Cursor y otros clientes MCP lanzan un servidor como proceso hijo e intercambian JSON-RPC a través de su stdin y stdout. Con este transporte, un servidor MCP en Delphi encaja directamente en ese ecosistema.

Qué es el transporte stdio

En el transporte stdio, el proceso servidor lee mensajes JSON-RPC delimitados por saltos de línea desde stdin y escribe respuestas JSON-RPC en stdout, un objeto JSON compacto por línea, codificado como UTF-8. El cliente es el dueño de la relación: arranca el ejecutable del servidor, escribe las peticiones en la tubería de entrada del hijo y lee las respuestas de su tubería de salida, emparejando cada respuesta con su petición mediante el id de JSON-RPC. Las notificaciones iniciadas por el servidor viajan por el mismo canal.

En comparación con HTTP, no hay socket ni superficie de red en absoluto. Todo ocurre a través de tuberías heredadas entre un proceso padre y un proceso hijo en la misma máquina.

Ejecutar un servidor MCP sobre stdio

El nuevo host TsgcAI_MCP_Server_Stdio envuelve el mismo núcleo MCP que utiliza el servidor HTTP, así que registras herramientas, prompts y recursos exactamente igual que antes. Compílalo como una aplicación de consola, registra tus herramientas y luego llama a Run para empezar a bombear mensajes.

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.

Una regla al crear un servidor stdio: stdout es el canal del protocolo, así que nunca escribas banners ni registros en él. Envía cualquier diagnóstico a stderr o a un archivo en su lugar.

Conectar un cliente MCP sobre stdio

En el cliente, conservas la misma API pública. Selecciona el transporte stdio e indícale al cliente qué ejecutable lanzar mediante las nuevas StdioOptions. El cliente lanza el proceso, realiza el handshake de inicialización y luego expone herramientas, prompts y recursos igual que el cliente HTTP.

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;

La respuesta se entrega a través del evento habitual OnMCPResponseTool, y las notificaciones del servidor llegan a través de OnMCPLoggingMessage, OnMCPProgress y los demás eventos de notificación, idéntico al transporte HTTP. StdioOptions también acepta entradas Environment cuando el proceso hijo necesita variables de entorno específicas.

Úsalo con Claude Code y otros agentes de IA

Como el transporte sigue la convención MCP stdio, cualquier cliente MCP compatible puede lanzar tu servidor en Delphi. Para registrarlo con Claude Code, añade una entrada a la configuración MCP que apunte a tu ejecutable.

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

El agente lanza el servidor bajo demanda, lista las herramientas que registraste y las invoca mientras trabaja. Tu código Delphi se convierte en un proveedor de herramientas de primera clase para asistentes de IA, sin servidor web que desplegar ni proteger.

Ventajas

Actualización

El transporte stdio es una incorporación lista para usar. Los servidores y clientes HTTP y Streamable HTTP existentes no cambian, y el nuevo transporte reutiliza el mismo modelo de herramientas, prompts y recursos, así que no hay nada que migrar. Para adoptarlo, compila tu servidor como una aplicación de consola en torno a TsgcAI_MCP_Server_Stdio, o establece Transport en aimcptrStdio en el cliente. Puedes descargar la última versión desde la página de descarga de sgcWebSockets.

¿Tienes preguntas, comentarios o necesitas ayuda con la migración? Ponte en contacto, recibirás respuesta de las personas que escribieron el código.