Un servidor M C P permite que un asistente llame a tu código. Lo que nunca te ha dejado hacer es mostrar nada: el asistente pregunta, tu herramienta responde con texto, y el usuario lee un párrafo. sgcWebSockets 2026.10 añade MCP Apps a sgcHTML, de modo que una herramienta puede responder con una página en su lugar. El asistente la renderiza, el usuario hace clic en ella, y esos clics regresan a tu aplicación Delphi.
La página se construye con los mismos componentes de sgcHTML que usa cualquier otra página. Sin framework de JavaScript, sin front end independiente, sin una segunda base de código.
Una herramienta que responde con una página
Una MCP App consta de tres elementos: una herramienta que el modelo puede llamar, un recurso que transporta la página, y los eventos que deciden qué significan ambos. TsgcHTMLComponent_MCPApp declara todo esto sobre un servidor MCP que ya tienes.
uses
sgcAI, sgcHTML_MCPApp;
FMCP := TsgcWSAPIServer_MCP.Create(nil);
FMCP.Server := FHTTPServer;
FMCP.EndpointOptions.Endpoint := '/mcp';
FApps := TsgcHTMLComponent_MCPApp.Create(nil);
FApps.MCPServer := FMCP.MCPServer;
FApps.OnRender := DoRender;
FApps.OnToolCall := DoToolCall;
FApps.OnFragment := DoFragment;
with FApps.Apps.Add do
begin
ToolName := 'orders.board';
Title := 'Orders board';
Description := 'Shows the orders of the company as a board ' +
'that can be filtered by status.';
InputSchema.Text := '{"type":"object","properties":{"status":' +
'{"type":"string","description":"open, shipped or closed"}}}';
end;
FApps.RegisterApps;
Ese es todo el registro necesario. El componente declara la herramienta con los metadatos que indican al host que lleva una interfaz de usuario, declara el recurso que el host lee para obtener la página, y declara una herramienta complementaria que la propia página utiliza.
Lo que lee el modelo, lo que ve el usuario
El resultado de una herramienta tiene dos mitades, y no son el mismo destinatario. OnToolCall escribe ambas: una frase con la que el modelo puede razonar, y el contenido estructurado que la página lee.
procedure TMyLogic.DoToolCall(Sender: TObject; aApp: TsgcHTMLMCPApp;
const aArguments: string; var aText, aStructured: string);
begin
aText := Format('%d open orders, %s in total.', [vCount, vTotal]);
aStructured := '{"orders":' + IntToStr(vCount) + '}';
end;
OnRender responde con la página. Es sgcHTML normal: una tarjeta, una tabla, unos cuantos botones. Nada en ella es específico del asistente.
Botones que funcionan donde no hay servidor
Esta es la parte que suele fallar. La página se ejecuta dentro de un iframe aislado (sandbox) sin red propia, así que un hx-get no tiene nada a lo que llegar. sgcHTML lo resuelve con un puente que registra una extensión de htmx: cada hx-get y hx-post de la página se convierte en una llamada a la herramienta complementaria, y el marcado que regresa se sustituye exactamente como htmx habría sustituido una respuesta HTTP.
procedure TMyLogic.DoFragment(Sender: TObject; aApp: TsgcHTMLMCPApp;
const aTarget, aArguments: string; var aHTML: string);
begin
{ aTarget is what the element asked for, for instance orders?status=open }
if StartsText('orders', aTarget) then
aHTML := BuildOrdersTable(StatusOf(aTarget));
end;
El mismo marcado servido por HTTP es una petición htmx normal. Escribes la página una sola vez y funciona en ambos lugares.
Un solo documento, nada enlazado
Como el frame no tiene red, el documento lo lleva todo: la página, la hoja de estilos, el script y el puente, en un único archivo. La nueva opción InlineAssets de la plantilla de página hace esto, y está activada por defecto para las MCP Apps. Un documento de app típico ronda los 360 KB, y no necesita nada más para renderizarse.
También se indica al host con qué tamaño abrir el frame, mediante PreferredWidth y PreferredHeight, y la página informa de su propia altura a medida que cambia el contenido.
Puedes verlo sin instalar un asistente
La nueva demo 19.MCPApp es un servidor de consola en el puerto 5725 que publica dos apps, e incluye su propio host de referencia. Abre http://localhost:5725/ y el panel izquierdo hace las veces del modelo: llama a la herramienta, lee el recurso, lo renderiza en un frame aislado, responde al handshake, redimensiona el frame cuando la página lo solicita y reenvía lo que la página llama. El registro de abajo muestra cada mensaje en ambas direcciones.
Cuando quieras lo real, apunta Claude, ChatGPT o VS Code a http://localhost:5725/mcp. Las herramientas y los recursos ya están declarados ahí.
Lo que no es
El componente no guarda estado. Quién puede llamar a una herramienta, qué significa un registro y qué puede devolver una petición de fragmento son decisiones de tu aplicación, exactamente igual que para una ruta de una aplicación web. Y la página no puede colar nada: lo que el modelo puede activar es una herramienta que tú registraste, respondiendo con marcado que tú construiste.
Actualización
Las MCP Apps forman parte de sgcHTML y necesitan SGC_AI_MCP, que corresponde a las ediciones Enterprise y All-Access y al pack sgcAI. Nada cambia para un servidor MCP existente: el componente se conecta al que ya tienes y no toca las herramientas que ya publicas.
Sigue leyendo
- Convierte una captura de pantalla en una página web Delphi
- Delphi TLS 1.3 sin DLLs de OpenSSL
- sgcWebSockets 2026.10, todo lo demás de esta versión
Míralo en vídeo
Hay un vídeo breve de esto en el canal de eSeGeCe.
¿Preguntas, comentarios o ayuda con la migración? Ponte en contacto — recibirás respuesta de las mismas personas que escribieron el código.
