Draai je Delphi-app binnen ChatGPT en Claude

· Componenten
Draai je Delphi-app binnen ChatGPT en Claude

Een M C P-server laat een assistent je code aanroepen. Wat het je nooit heeft laten doen, is iets tonen: de assistent vraagt, jouw tool antwoordt met tekst, en de gebruiker leest een alinea. sgcWebSockets 2026.10 voegt MCP Apps toe aan sgcHTML, zodat een tool in plaats daarvan met een pagina kan antwoorden. De assistent geeft de pagina weer, de gebruiker klikt erin rond, en de kliks komen terug naar je Delphi-applicatie.

De pagina wordt opgebouwd uit dezelfde sgcHTML-componenten die elke andere pagina gebruikt. Geen JavaScript-framework, geen aparte front end, geen tweede codebase.

Een tool die antwoordt met een pagina

Een MCP App bestaat uit drie dingen: een tool die het model kan aanroepen, een resource die de pagina bevat, en de events die bepalen wat beide betekenen. TsgcHTMLComponent_MCPApp declareert dit allemaal op een MCP-server die je al hebt.

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;

Dat is de hele registratie. Het component declareert de tool met de metadata die de host vertelt dat er een gebruikersinterface bij hoort, declareert de resource die de host leest om de pagina op te halen, en declareert een bijbehorende tool die de pagina zelf gebruikt.

Wat het model leest, wat de gebruiker ziet

Het resultaat van een tool bestaat uit twee helften, en dat zijn niet dezelfde doelgroepen. OnToolCall schrijft beide: een zin waarmee het model kan redeneren, en de gestructureerde inhoud die de pagina leest.

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 levert de pagina. Het is gewone sgcHTML: een kaart, een tabel, een paar knoppen. Niets erin is specifiek voor de assistent.

Knoppen die werken waar geen server is

Dit is het deel dat meestal misgaat. De pagina draait in een gesandboxde iframe zonder eigen netwerk, dus een hx-get heeft niets om te bereiken. sgcHTML lost dit op met een brug die een htmx-extensie registreert: elke hx-get en hx-post van de pagina wordt een aanroep van de bijbehorende tool, en de markup die terugkomt wordt precies zo verwisseld als htmx een HTTP-respons zou hebben verwisseld.

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;

Dezelfde markup die via HTTP wordt geleverd, is een gewoon htmx-verzoek. Je schrijft de pagina één keer en ze werkt op beide plekken.

Eén document, niets gekoppeld

Omdat het frame geen netwerk heeft, bevat het document alles: de pagina, het stylesheet, het script en de brug, in één bestand. De nieuwe optie InlineAssets van de paginasjabloon doet dit, en staat standaard aan voor MCP Apps. Een typisch app-document is ongeveer 360 KB en heeft verder niets nodig om weer te geven.

Aan de host wordt ook doorgegeven met welke afmeting het frame moet openen, via PreferredWidth en PreferredHeight, en de pagina meldt zijn eigen hoogte zodra de inhoud verandert.

Je kunt het zien zonder een assistent te installeren

De nieuwe demo 19.MCPApp is een console-server op poort 5725 die twee apps publiceert, en levert een eigen referentie-host mee. Open http://localhost:5725/ en het linkerpaneel vervult de rol van het model: het roept de tool aan, leest de resource, geeft die weer in een gesandboxd frame, beantwoordt de handshake, wijzigt de grootte van het frame wanneer de pagina daarom vraagt en stuurt door wat de pagina aanroept. Het logboek eronder toont elk bericht in beide richtingen.

Wanneer je het echte werk wilt, wijs je Claude, ChatGPT of VS Code naar http://localhost:5725/mcp. De tools en de resources zijn daar al gedeclareerd.

Wat het niet is

Het component houdt geen status bij. Wie een tool mag aanroepen, wat een record betekent en wat een fragmentverzoek mag teruggeven, zijn beslissingen van jouw applicatie, precies zoals bij een route in een webapplicatie. En de pagina kan niets binnensmokkelen: wat het model kan activeren, is een tool die jij hebt geregistreerd, die antwoordt met markup die jij hebt gebouwd.

Upgraden

MCP Apps maken deel uit van sgcHTML en vereisen SGC_AI_MCP, wat neerkomt op de edities Enterprise en All-Access en het sgcAI-pack. Er verandert niets voor een bestaande MCP-server: het component koppelt zich aan de server die je al hebt en laat de tools die je al publiceert met rust.

Lees verder

Bekijk het

Er is een korte video hierover op het eSeGeCe-kanaal.

Vragen, feedback of hulp bij migratie? Neem contact op — je krijgt antwoord van de mensen die de code hebben geschreven.