Esegui la tua applicazione Delphi dentro ChatGPT e Claude

· Componenti
Esegui la tua applicazione Delphi dentro ChatGPT e Claude

Un server M C P permette a un assistente di richiamare il tuo codice. Quello che non ti ha mai permesso di fare è mostrare qualcosa: l'assistente chiede, il tuo strumento risponde con del testo, e l'utente legge un paragrafo. sgcWebSockets 2026.10 aggiunge le MCP Apps a sgcHTML, così uno strumento può rispondere con una pagina invece. L'assistente la visualizza, l'utente ci clicca dentro, e i clic tornano alla tua applicazione Delphi.

La pagina è costruita con gli stessi componenti sgcHTML usati da ogni altra pagina. Nessun framework JavaScript, nessun front end separato, nessuna seconda base di codice.

Uno strumento che risponde con una pagina

Una MCP App è composta da tre elementi: uno strumento che il modello può richiamare, una risorsa che trasporta la pagina, e gli eventi che decidono cosa significano entrambi. TsgcHTMLComponent_MCPApp dichiara tutto questo su un server MCP che hai già.

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;

Questa è tutta la registrazione necessaria. Il componente dichiara lo strumento con i metadati che indicano all'host che porta con sé un'interfaccia utente, dichiara la risorsa che l'host legge per ottenere la pagina, e dichiara uno strumento complementare che la pagina stessa utilizza.

Cosa legge il modello, cosa vede l'utente

Il risultato di uno strumento ha due metà, e non sono lo stesso destinatario. OnToolCall scrive entrambe: una frase con cui il modello può ragionare, e il contenuto strutturato che la pagina legge.

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 risponde con la pagina. È normale sgcHTML: una card, una tabella, qualche pulsante. Niente in essa è specifico dell'assistente.

Pulsanti che funzionano dove non c'è un server

Questa è la parte che di solito si rompe. La pagina viene eseguita dentro un iframe isolato (sandbox) senza rete propria, quindi un hx-get non ha nulla da raggiungere. sgcHTML risolve il problema con un ponte che registra un'estensione htmx: ogni hx-get e hx-post della pagina diventa una chiamata allo strumento complementare, e il markup che torna indietro viene sostituito esattamente come htmx avrebbe sostituito una risposta 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;

Lo stesso markup servito via HTTP è una normale richiesta htmx. Scrivi la pagina una sola volta e funziona in entrambi i casi.

Un solo documento, niente di collegato

Poiché il frame non ha rete, il documento porta con sé tutto: la pagina, il foglio di stile, lo script e il ponte, in un unico file. La nuova opzione InlineAssets del template della pagina fa esattamente questo, ed è attiva per impostazione predefinita per le MCP Apps. Un tipico documento di un'app si aggira sui 360 KB, e non necessita di nient'altro per essere visualizzato.

All'host viene anche comunicata la dimensione con cui aprire il frame, tramite PreferredWidth e PreferredHeight, e la pagina comunica la propria altezza man mano che il contenuto cambia.

Puoi vederlo senza installare un assistente

La nuova demo 19.MCPApp è un server a riga di comando sulla porta 5725 che pubblica due app, e include un proprio host di riferimento. Apri http://localhost:5725/ e il pannello di sinistra fa le veci del modello: richiama lo strumento, legge la risorsa, la visualizza in un frame isolato, risponde all'handshake, ridimensiona il frame quando la pagina lo richiede e inoltra ciò che la pagina chiama. Il log sottostante mostra ogni messaggio in entrambe le direzioni.

Quando vuoi la cosa vera, punta Claude, ChatGPT o VS Code su http://localhost:5725/mcp. Gli strumenti e le risorse sono già dichiarati lì.

Cosa non è

Il componente non mantiene alcuno stato. Chi può richiamare uno strumento, cosa significa un record e cosa può restituire una richiesta di frammento sono decisioni della tua applicazione, esattamente come per una rotta in un'applicazione web. E la pagina non può introdurre nulla di nascosto: ciò che il modello può attivare è uno strumento che hai registrato tu, che risponde con markup che hai costruito tu.

Aggiornamento

Le MCP Apps fanno parte di sgcHTML e richiedono SGC_AI_MCP, ovvero le edizioni Enterprise e All-Access e il pack sgcAI. Nulla cambia per un server MCP già esistente: il componente si collega a quello che hai già e lascia intatti gli strumenti che già pubblichi.

Continua a leggere

Guardalo in video

C'è un breve video su questo sul canale eSeGeCe.

Domande, feedback o aiuto per la migrazione? Mettiti in contatto — riceverai una risposta dalle persone che hanno scritto il codice.