Wydanie 2025.10.0 sgcWebSockets podnosi połączność Model Context Protocol (MCP) na wyższy poziom dzięki wzmocnionej warstwie uwierzytelniania dla komponentów klienta i serwera. Artykuł pokazuje, jak nowe możliwości łączą kontrolę dostępu klasy enterprise z szybkim procesem deweloperskim, jakiego oczekują zespoły Delphi od sgcWebSockets.
Co nowego
- Podwójne wymuszanie: biblioteki klienta automatycznie dołączają nagłówki weryfikowane przez serwer, zamykając luki między wykrywaniem a wymuszaniem.
- Świadomość transportu: uwierzytelnianie działa niezależnie od tego, czy żądania korzystają z klasycznego HTTP, czy ze strumieniowalnych transportów jak SSE — możesz więc z ufnością wdrożyć streaming.
- Gotowość komercyjna: gotowe właściwości, hooki walidacji i zdarzenia telemetryczne zmniejszają koszt audytowania obciążeń regulowanych.
Klient MCP
Klient MCP udostępnia wszystkie ustawienia bezpieczeństwa przez właściwość MCPOptions.AuthenticationOptions. Możesz niezależnie włączyć przepływy API key lub niestandardowego nagłówka, aby spełnić polityki zero-trust lub oparte na tenantach, a komponent wstrzykuje wymagane nagłówki podczas każdego HTTP POST i aktualizacji SSE.
- Uwierzytelnianie niestandardowym nagłówkiem pozwala ustawić własną parę nagłówek/wartość (np.
X-TenantlubX-Region). - Obsługa API Key/tokena Bearer automatycznie formatuje standardowy nagłówek
Authorization: Bearer, zapewniając kompatybilność z bramkami i warstwami zarządzania API. - Propagacja sesji synchronizuje identyfikator sesji MCP pomiędzy żądaniami, upraszczając monitorowanie.
- Gotowość na streaming: gdy tylko transport przełączy się na
aimcptrHttpStreamable, klient uruchamia wątek SSE, który zachowuje te same uwierzytelnione nagłówki.
Razem z heartbeatami, metadanymi klienta i dostosowaniem HTTP/TLS możesz dostosować konwersacje MCP do listy wymagań zgodności organizacji bez uszczerbku dla szybkości dewelopera.
Serwer MCP
Serwer odzwierciedla mechanizmy klienta za pomocą dedykowanych obiektów konfiguracji endpointu, transportu i MCP. Gdy nadchodzą żądania, komponent waliduje każdy przychodzący nagłówek i zgłasza opisowy błąd, gdy poświadczenie jest brakujące lub nieprawidłowe. Ponieważ walidacja odbywa się przed wejściem żądania w logikę biznesową, misuse jest blokowane wcześnie, a kod pozostaje skupiony na wartości domenowej.
- Scentralizowana walidacja nagłówków natychmiast odrzuca żądania, gdy wymagana para nagłówek/wartość jest nieobecna lub niezgodna.
- Weryfikacja tokena Bearer sprawdza, czy API key po stronie serwera odpowiada nagłówkowi
Authorizationużywanemu przez klienta. - Ujednolicone zdarzenia: handlery inicjalizacji, cyklu życia sesji oraz promptów/zasobów/narzędzi są nadal dostępne, dzięki czemu możesz reagować na uwierzytelnione sesje w czasie rzeczywistym.
Korzyści biznesowe i techniczne
- Bezpieczeństwo, które możesz sprzedać: klienci oczekują uwierzytelnionych automatyzacji AI, a MCP Authentication zapewnia gotową odpowiedź przy odpowiedzi na RFP lub kwestionariusze zgodności.
- Efektywność operacyjna: administratorzy zarządzają poświadczeniami przez proste właściwości komponentu, a nie przez rozproszone zmiany kodu.
- Skalowalny nadzór: nagłówki per-tenant ułatwiają kierowanie sesji do konkretnych backendów lub stosowanie limitów przepustowości przy jednym pliku binarnym.
- Przyszłościowość: ponieważ kod uwierzytelniania jest częścią podstawowego transportu MCP, nowe dodatki protokołu automatycznie dziedziczą te same zabezpieczenia.
Przykład Delphi
Poniższy fragment kodu pokazuje, jak jedna procedura konfiguracyjna może włączyć MCP Authentication zarówno dla klienta, jak i serwera w Delphi. Dostosuj wartości poświadczeń do swojego środowiska.
procedure SetupMCPInfrastructure;
var
MCPClient: TsgcWSAPIClient_MCP;
MCPServer: TsgcWSServer_API_MCP;
begin
MCPClient := TsgcWSAPIClient_MCP.Create(nil);
MCPServer := TsgcWSServer_API_MCP.Create(nil);
try
// Client configuration
MCPClient.MCPOptions.HttpOptions.URL := 'https://mcp.example.com/api';
MCPClient.MCPOptions.AuthenticationOptions.ApiKey.Enabled := True;
MCPClient.MCPOptions.AuthenticationOptions.ApiKey.Value := 'YOUR_API_KEY';
MCPClient.MCPOptions.AuthenticationOptions.CustomHeader.Enabled := True;
MCPClient.MCPOptions.AuthenticationOptions.CustomHeader.Header := 'X-Tenant';
MCPClient.MCPOptions.AuthenticationOptions.CustomHeader.Value := 'Retail';
MCPClient.MCPOptions.ClientInfo.Name := 'RetailAgent';
MCPClient.MCPOptions.ClientInfo.Version := '2025.10.0';
MCPClient.MCPOptions.HeartBeat.Enabled := True;
MCPClient.MCPOptions.HeartBeat.Interval := 30;
MCPClient.OnMCPInitialize := HandleMCPInitialize;
MCPClient.OnMCPListTools := HandleMCPTools;
MCPClient.Initialize;
MCPClient.ListTools;
// Server configuration
MCPServer.EndpointOptions.Endpoint := '/mcp';
MCPServer.MCPOptions.AuthenticationOptions.ApiKey.Enabled := True;
MCPServer.MCPOptions.AuthenticationOptions.ApiKey.Value := 'YOUR_API_KEY';
MCPServer.MCPOptions.AuthenticationOptions.CustomHeader.Enabled := True;
MCPServer.MCPOptions.AuthenticationOptions.CustomHeader.Header := 'X-Tenant';
MCPServer.MCPOptions.AuthenticationOptions.CustomHeader.Value := 'Retail';
MCPServer.OnMCPInitialize := HandleServerInitialize;
MCPServer.OnMCPRequestTool := HandleToolRequest;
MCPServer.Active := True;
finally
MCPClient.Free;
MCPServer.Free;
end;
end;
