sgcWebSockets 2025.10.0 リリースでは、クライアントとサーバーの両コンポーネントに強化された認証レイヤーを追加し、Model Context Protocol(MCP)接続のセキュリティを向上させました。本記事では、新機能がエンタープライズグレードのアクセス制御と Delphi チームが期待する迅速な開発ワークフローをどのように組み合わせているかを紹介します。
新機能
- 双方向の強制適用:クライアントライブラリがサーバーの検証するヘッダーを自動的に含めるため、検出から強制適用までのギャップを解消します。
- トランスポート対応:従来の HTTP でも SSE などのストリーミングトランスポートでも認証が機能するため、安心してストリーミングを採用できます。
- 商用対応:用意されたプロパティ、バリデーションフック、テレメトリイベントにより、規制対象ワークロードの監査コストを削減します。
MCP Client
MCP クライアントは MCPOptions.AuthenticationOptions プロパティですべてのセキュリティ設定を公開しています。API キーやカスタムヘッダーフローを個別に有効化してゼロトラストやテナントベースのポリシーを満たすことができ、コンポーネントは各 HTTP POST および SSE アップグレード時に必要なヘッダーを自動注入します。
- カスタムヘッダー認証:独自のヘッダー/値のペアを設定できます(例:
X-Tenant、X-Region)。 - API キー/Bearer トークン:標準の
Authorization: Bearerヘッダーを自動的にフォーマットし、ゲートウェイや API 管理レイヤーとの互換性を確保します。 - セッション伝播:MCP セッション識別子をリクエスト間で同期し、オブザーバビリティを簡素化します。
- ストリーミング対応:トランスポートが
aimcptrHttpStreamableに切り替わると、同じ認証済みヘッダーを保持する SSE スレッドを自動起動します。
ハートビート、クライアントメタデータ、HTTP/TLS カスタマイズと組み合わせることで、開発速度を犠牲にせずに MCP 通信を組織のコンプライアンスチェックリストに準拠させることができます。
MCP Server
サーバーは専用のエンドポイント・トランスポート・MCP 設定オブジェクトでクライアントと同等の制御を提供します。リクエストが届くと、コンポーネントはすべての受信ヘッダーを検証し、認証情報が不足または不正な場合は分かりやすいエラーを発生させます。検証はビジネスロジックの前に行われるため、不正使用を早期に防止しコードをドメインの価値に集中させられます。
- 集中ヘッダー検証:必要なヘッダー/値のペアが存在しないまたは不一致の場合、リクエストを即座に拒否します。
- Bearer トークン検証:サーバー側の API キーとクライアントが使用する
Authorizationヘッダーの一致を確認します。 - 統合イベント:初期化・セッションライフサイクル・プロンプト/リソース/ツールハンドラーは引き続き利用可能で、認証済みセッションにリアルタイムで反応できます。
ビジネスおよび技術的メリット
- 販売できるセキュリティ:顧客は認証済みの AI 自動化を求めており、MCP Authentication は RFP やコンプライアンスアンケートへの回答として即戦力となります。
- 運用効率:管理者はコードのあちこちに変更を加えるのではなく、シンプルなコンポーネントプロパティで認証情報を管理できます。
- スケーラブルなガバナンス:テナントごとのヘッダーにより、単一バイナリを維持しながらセッションを特定のバックエンドにルーティングしたりレート制限を適用したりできます。
- 将来への備え:認証コードはコア MCP トランスポートの一部であるため、新しいプロトコルの追加も同じガードレールを自動的に継承します。
Delphi サンプルコード
以下のコードは、Delphi でクライアントとサーバーの両方に MCP 認証を有効化する設定ルーティンの例です。認証情報の値はご利用の環境に合わせて変更してください。
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;
