sgcWebSockets 2025.10.0 版本为客户端和服务器组件引入了强化的认证层,将模型上下文协议(MCP)连接提升至新的安全水平。本文介绍新功能如何将企业级访问控制与 Delphi 团队期望的快速开发工作流相结合。
新增功能
- 双向强制执行:客户端库自动包含服务器验证所需的请求头,填补了发现与执行之间的漏洞。
- 传输感知:无论请求使用经典 HTTP 还是 SSE 等可流式传输协议,认证均能正常工作,让您可以放心采用流式传输。
- 商业就绪:现成的属性、验证钩子和遥测事件降低了审计受监管工作负载的成本。
MCP 客户端
MCP 客户端通过 MCPOptions.AuthenticationOptions 属性公开所有安全配置。可以独立启用 API 密钥或自定义请求头流程,以满足零信任或基于租户的策略,组件会在每次 HTTP POST 和 SSE 升级时自动注入所需的请求头。
- 自定义请求头认证:允许设置专有的请求头/值对(例如
X-Tenant或X-Region)。 - API 密钥/Bearer 令牌支持:自动格式化标准的
Authorization: Bearer请求头,确保与网关和 API 管理层兼容。 - 会话传播:在请求之间保持 MCP 会话标识符同步,简化可观测性。
- 流式传输就绪:传输切换到
aimcptrHttpStreamable后,客户端会立即启动一个 SSE 线程,保留相同的已认证请求头。
结合心跳、客户端元数据和 HTTP/TLS 自定义,您可以在不牺牲开发效率的情况下使 MCP 对话符合组织的合规要求。
MCP 服务器
服务器通过专用的端点、传输和 MCP 配置对象镜像客户端控制。当请求到达时,组件验证每个传入的请求头,并在凭证缺失或不正确时返回描述性错误。由于验证在请求进入业务逻辑之前完成,可以及早阻止滥用,使代码专注于领域价值。
- 集中式请求头验证:当所需的请求头/值对缺失或不匹配时,立即拒绝请求。
- Bearer 令牌验证:检查服务器端 API 密钥是否与客户端使用的
Authorization请求头匹配。 - 统一事件:初始化、会话生命周期以及提示/资源/工具处理程序仍然可用,可实时响应已认证的会话。
商业与技术优势
- 可销售的安全性:客户需要经过认证的 AI 自动化,MCP Authentication 在响应 RFP 或合规问卷时提供了现成的答案。
- 运营效率:管理员通过简单的组件属性管理凭证,而非分散的代码修改。
- 可扩展的治理:按租户设置的请求头便于将会话路由到特定后端或应用速率限制,同时维护单一二进制文件。
- 面向未来:由于认证代码是核心 MCP 传输的一部分,新增的协议功能会自动继承相同的安全机制。
Delphi 示例
以下代码片段展示了如何通过单一配置例程同时为 Delphi 的客户端和服务器启用 MCP Authentication。请根据您的环境修改凭证值。
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;
