Ein M C P-Server erlaubt einem Assistenten, Ihren Code aufzurufen. Was er Ihnen nie erlaubt hat, ist etwas zu zeigen: Der Assistent fragt, Ihr Tool antwortet mit Text, und der Benutzer liest einen Absatz. sgcWebSockets 2026.10 fügt sgcHTML MCP Apps hinzu, sodass ein Tool stattdessen mit einer Seite antworten kann. Der Assistent rendert sie, der Benutzer klickt darin herum, und die Klicks kommen zurück zu Ihrer Delphi-Anwendung.
Die Seite wird aus denselben sgcHTML-Komponenten aufgebaut, die jede andere Seite verwendet. Kein JavaScript-Framework, kein separates Frontend, keine zweite Codebasis.
Ein Tool, das mit einer Seite antwortet
Eine MCP App besteht aus drei Dingen: einem Tool, das das Modell aufrufen kann, einer Ressource, die die Seite trägt, und den Ereignissen, die festlegen, was beide bedeuten. TsgcHTMLComponent_MCPApp deklariert das alles auf einem MCP-Server, den Sie bereits haben.
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;
Das ist die gesamte Registrierung. Die Komponente deklariert das Tool mit den Metadaten, die dem Host mitteilen, dass es eine Benutzeroberfläche mitbringt, deklariert die Ressource, die der Host liest, um die Seite zu erhalten, und deklariert ein begleitendes Tool, das die Seite selbst verwendet.
Was das Modell liest, was der Benutzer sieht
Ein Tool-Ergebnis hat zwei Hälften, und sie sind nicht dasselbe Publikum. OnToolCall schreibt beide: einen Satz, mit dem das Modell argumentieren kann, und den strukturierten Inhalt, den die Seite liest.
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 liefert die Seite. Es ist gewöhnliches sgcHTML: eine Karte, eine Tabelle, ein paar Schaltflächen. Nichts daran ist spezifisch für den Assistenten.
Schaltflächen, die funktionieren, wo es keinen Server gibt
Das ist der Teil, der normalerweise nicht funktioniert. Die Seite läuft innerhalb eines Sandbox-iframes ohne eigenes Netzwerk, sodass ein hx-get nichts erreichen kann. sgcHTML löst das mit einer Brücke, die eine htmx-Erweiterung registriert: Jeder hx-get und hx-post der Seite wird zu einem Aufruf des begleitenden Tools, und das zurückkommende Markup wird genauso eingesetzt, wie htmx eine HTTP-Antwort eingesetzt hätte.
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;
Dasselbe über HTTP ausgelieferte Markup ist eine gewöhnliche htmx-Anfrage. Sie schreiben die Seite einmal, und sie funktioniert an beiden Orten.
Ein einziges Dokument, nichts verlinkt
Da der Frame kein Netzwerk hat, trägt das Dokument alles: die Seite, das Stylesheet, das Skript und die Brücke, in einer einzigen Datei. Die neue Option InlineAssets der Seitenvorlage erledigt das, und sie ist für MCP Apps standardmäßig aktiviert. Ein typisches App-Dokument liegt bei rund 360 KB und benötigt sonst nichts zum Rendern.
Dem Host wird außerdem mitgeteilt, mit welcher Größe der Frame geöffnet werden soll, über PreferredWidth und PreferredHeight, und die Seite meldet ihre eigene Höhe, sobald sich der Inhalt ändert.
Sie können es sehen, ohne einen Assistenten zu installieren
Die neue Demo 19.MCPApp ist ein Konsolenserver auf Port 5725, der zwei Apps veröffentlicht, und sie bringt einen eigenen Referenz-Host mit. Öffnen Sie http://localhost:5725/, und das linke Panel übernimmt die Rolle des Modells: Es ruft das Tool auf, liest die Ressource, rendert sie in einem Sandbox-Frame, beantwortet den Handshake, ändert die Größe des Frames, wenn die Seite es verlangt, und leitet weiter, was die Seite aufruft. Das Protokoll darunter zeigt jede Nachricht in beide Richtungen.
Wenn Sie das echte Ergebnis möchten, richten Sie Claude, ChatGPT oder VS Code auf http://localhost:5725/mcp. Die Tools und die Ressourcen sind dort bereits deklariert.
Was es nicht ist
Die Komponente speichert keinen Zustand. Wer ein Tool aufrufen darf, was ein Datensatz bedeutet und was eine Fragment-Anfrage zurückgeben darf, sind Entscheidungen Ihrer Anwendung, genau wie bei einer Route in einer Webanwendung. Und die Seite kann nichts einschleusen: Was das Modell auslösen kann, ist ein von Ihnen registriertes Tool, das mit von Ihnen erstelltem Markup antwortet.
Aktualisierung
MCP Apps sind Teil von sgcHTML und benötigen SGC_AI_MCP, also die Editionen Enterprise und All-Access sowie das sgcAI-Pack. An einem bestehenden MCP-Server ändert sich nichts: Die Komponente dockt an den bereits vorhandenen an und lässt die bereits veröffentlichten Tools unangetastet.
Weiterlesen
- Verwandeln Sie einen Screenshot in eine Delphi-Webseite
- Delphi TLS 1.3 ohne OpenSSL-DLLs
- sgcWebSockets 2026.10, alles andere in dieser Version
Video ansehen
Dazu gibt es ein kurzes Video auf dem eSeGeCe-Kanal.
Fragen, Feedback oder Hilfe bei der Migration? Kontaktieren Sie uns — Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.
