Uruchom swoją aplikację Delphi wewnątrz ChatGPT i Claude

· Komponenty
Uruchom swoją aplikację Delphi wewnątrz ChatGPT i Claude

Serwer M C P pozwala asystentowi wywoływać Twój kod. Czego nigdy nie pozwalał Ci zrobić, to czegoś pokazać: asystent pyta, Twoje narzędzie odpowiada tekstem, a użytkownik czyta akapit. sgcWebSockets 2026.10 dodaje MCP Apps do sgcHTML, dzięki czemu narzędzie może zamiast tego odpowiedzieć stroną. Asystent ją renderuje, użytkownik w niej klika, a kliknięcia wracają do Twojej aplikacji Delphi.

Strona jest budowana z tych samych komponentów sgcHTML, których używa każda inna strona. Bez frameworka JavaScript, bez oddzielnego frontendu, bez drugiej bazy kodu.

Narzędzie, które odpowiada stroną

MCP App składa się z trzech elementów: narzędzia, które może wywołać model, zasobu, który przenosi stronę, oraz zdarzeń, które decydują, co oba te elementy znaczą. TsgcHTMLComponent_MCPApp deklaruje to wszystko na serwerze MCP, który już posiadasz.

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;

To cała potrzebna rejestracja. Komponent deklaruje narzędzie z metadanymi, które informują hosta, że niesie ono interfejs użytkownika, deklaruje zasób, który host odczytuje, aby uzyskać stronę, oraz deklaruje towarzyszące narzędzie, którego używa sama strona.

Co czyta model, co widzi użytkownik

Wynik narzędzia ma dwie połowy, i nie są one skierowane do tego samego odbiorcy. OnToolCall zapisuje obie: zdanie, na podstawie którego model może rozumować, oraz ustrukturyzowaną treść, którą odczytuje strona.

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 odpowiada stroną. To zwykły sgcHTML: karta, tabela, kilka przycisków. Nic w niej nie jest specyficzne dla asystenta.

Przyciski, które działają tam, gdzie nie ma serwera

To część, która zwykle się psuje. Strona działa wewnątrz odizolowanego (sandboksowanego) iframe bez własnej sieci, więc hx-get nie ma do czego dotrzeć. sgcHTML rozwiązuje to za pomocą mostu, który rejestruje rozszerzenie htmx: każde hx-get i hx-post na stronie staje się wywołaniem towarzyszącego narzędzia, a znacznik, który wraca, jest podmieniany dokładnie tak, jak htmx podmieniłby odpowiedź 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;

Ten sam znacznik podawany przez HTTP to zwykłe żądanie htmx. Piszesz stronę raz, a działa ona w obu miejscach.

Jeden dokument, nic zewnętrznego

Ponieważ ramka nie ma sieci, dokument niesie wszystko: stronę, arkusz stylów, skrypt i most, w jednym pliku. Nowa opcja InlineAssets szablonu strony właśnie to robi i jest domyślnie włączona dla MCP Apps. Typowy dokument aplikacji ma około 360 KB i do wyrenderowania nie potrzebuje niczego więcej.

Host otrzymuje też informację, w jakim rozmiarze otworzyć ramkę, poprzez PreferredWidth i PreferredHeight, a strona zgłasza własną wysokość w miarę zmiany treści.

Możesz to zobaczyć bez instalowania asystenta

Nowe demo 19.MCPApp to serwer konsolowy na porcie 5725, który publikuje dwie aplikacje, i zawiera własnego hosta referencyjnego. Otwórz http://localhost:5725/, a lewy panel zastąpi model: wywołuje narzędzie, odczytuje zasób, renderuje go w odizolowanej ramce, odpowiada na uzgadnianie połączenia, zmienia rozmiar ramki, gdy prosi o to strona, i przekazuje dalej to, co wywołuje strona. Dziennik poniżej pokazuje każdą wiadomość w obu kierunkach.

Gdy chcesz prawdziwego rozwiązania, skieruj Claude, ChatGPT lub VS Code na http://localhost:5725/mcp. Narzędzia i zasoby są tam już zadeklarowane.

Czym to nie jest

Komponent nie przechowuje żadnego stanu. Kto może wywołać narzędzie, co oznacza rekord i co może zwrócić żądanie fragmentu, to decyzje Twojej aplikacji, dokładnie tak samo jak w przypadku trasy w aplikacji webowej. A strona nie może niczego przemycić: to, co model może uruchomić, to narzędzie, które sam zarejestrowałeś, odpowiadające znacznikiem, który sam zbudowałeś.

Aktualizacja

MCP Apps są częścią sgcHTML i wymagają SGC_AI_MCP, czyli edycji Enterprise i All-Access oraz pakietu sgcAI. Dla istniejącego serwera MCP nic się nie zmienia: komponent podłącza się do tego, który już masz, i nie rusza narzędzi, które już publikujesz.

Czytaj dalej

Zobacz wideo

Jest na ten temat krótkie wideo na kanale eSeGeCe.

Pytania, uwagi lub pomoc przy migracji? Skontaktuj się z nami — otrzymasz odpowiedź od osób, które napisały ten kod.