Un serveur M C P permet à un assistant d'appeler votre code. Ce qu'il ne vous a jamais permis de faire, c'est de montrer quelque chose : l'assistant pose une question, votre outil répond avec du texte, et l'utilisateur lit un paragraphe. sgcWebSockets 2026.10 ajoute les MCP Apps à sgcHTML, afin qu'un outil puisse répondre avec une page à la place. L'assistant l'affiche, l'utilisateur clique dedans, et les clics reviennent à votre application Delphi.
La page est construite avec les mêmes composants sgcHTML que toute autre page. Aucun framework JavaScript, aucun front-end séparé, aucune deuxième base de code.
Un outil qui répond avec une page
Une MCP App se compose de trois éléments : un outil que le modèle peut appeler, une ressource qui transporte la page, et les événements qui déterminent ce que les deux signifient. TsgcHTMLComponent_MCPApp déclare tout cela sur un serveur MCP que vous possédez déjà.
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;
C'est tout l'enregistrement nécessaire. Le composant déclare l'outil avec les métadonnées qui indiquent à l'hôte qu'il transporte une interface utilisateur, déclare la ressource que l'hôte lit pour obtenir la page, et déclare un outil compagnon que la page elle-même utilise.
Ce que le modèle lit, ce que l'utilisateur voit
Le résultat d'un outil comporte deux moitiés, et elles ne s'adressent pas au même public. OnToolCall écrit les deux : une phrase avec laquelle le modèle peut raisonner, et le contenu structuré que la page lit.
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 répond avec la page. C'est du sgcHTML ordinaire : une carte, un tableau, quelques boutons. Rien n'y est spécifique à l'assistant.
Des boutons qui fonctionnent là où il n'y a pas de serveur
C'est la partie qui casse habituellement. La page s'exécute dans un iframe isolé (sandbox) sans réseau propre, si bien qu'un hx-get n'a rien à atteindre. sgcHTML résout cela avec un pont qui enregistre une extension htmx : chaque hx-get et hx-post de la page devient un appel de l'outil compagnon, et le balisage qui revient est substitué exactement comme htmx aurait substitué une réponse 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;
Le même balisage servi via HTTP est une requête htmx ordinaire. Vous écrivez la page une seule fois et elle fonctionne dans les deux cas.
Un seul document, rien de lié
Comme le cadre n'a pas de réseau, le document transporte tout : la page, la feuille de style, le script et le pont, dans un seul fichier. La nouvelle option InlineAssets du modèle de page fait cela, et elle est activée par défaut pour les MCP Apps. Un document d'application typique pèse environ 360 Ko, et il n'a besoin de rien d'autre pour s'afficher.
L'hôte reçoit aussi la taille à laquelle ouvrir le cadre, via PreferredWidth et PreferredHeight, et la page signale sa propre hauteur à mesure que le contenu change.
Vous pouvez le voir sans installer d'assistant
La nouvelle démo 19.MCPApp est un serveur console sur le port 5725 qui publie deux apps, et elle embarque son propre hôte de référence. Ouvrez http://localhost:5725/ et le panneau de gauche tient lieu de modèle : il appelle l'outil, lit la ressource, l'affiche dans un cadre isolé, répond à la poignée de main, redimensionne le cadre quand la page le demande et transmet ce que la page appelle. Le journal en dessous montre chaque message dans les deux sens.
Quand vous voulez la vraie chose, pointez Claude, ChatGPT ou VS Code vers http://localhost:5725/mcp. Les outils et les ressources y sont déjà déclarés.
Ce que ce n'est pas
Le composant ne conserve aucun état. Qui peut appeler un outil, ce que signifie un enregistrement et ce qu'une requête de fragment est autorisée à renvoyer sont des décisions de votre application, exactement comme pour une route dans une application web. Et la page ne peut rien introduire en douce : ce que le modèle peut déclencher est un outil que vous avez enregistré, qui répond avec du balisage que vous avez construit.
Mise à niveau
Les MCP Apps font partie de sgcHTML et nécessitent SGC_AI_MCP, c'est-à-dire les éditions Enterprise et All-Access ainsi que le pack sgcAI. Rien ne change pour un serveur MCP existant : le composant se rattache à celui que vous avez déjà et laisse intacts les outils que vous publiez déjà.
À lire aussi
- Transformez une capture d'écran en page web Delphi
- Delphi TLS 1.3 sans DLL OpenSSL
- sgcWebSockets 2026.10, tout le reste de cette version
Voir la vidéo
Il existe une courte vidéo à ce sujet sur la chaîne eSeGeCe.
Des questions, un retour ou besoin d'aide pour la migration ? Contactez-nous — vous recevrez une réponse des personnes qui ont écrit le code.
