sgcWebSockets 2025.10.0 版本扩展了 AI 集成工具包,新增企业级 MCP 客户端实现,使您的 Delphi 应用程序与 Model Context Protocol 2025-06-18 规范保持同步。通过单一组件即可提供精选上下文、协调工具调用并服务于资源感知助手。
Model Context Protocol(MCP)标准化了助手协商能力和交换结构化上下文的方式。通过添加 MCP 客户端支持,sgcWebSockets 实现了以下功能:
- 与任何符合 MCP 规范的助手实现企业级互操作性,确保一致的初始化和能力发现工作流。
- 借助即插即用的 Delphi 组件,加快现有 VCL、FMX 或 WebBroker 项目中 AI 增强体验的上市时间。
- 通过内置 HTTP 日志和 TLS 1.3 传输加固,实现每次 JSON-RPC 交换的运营可见性。
TsgcAI_MCP_Client 亮点
一键式 MCP 握手
通过单次 Initialize 调用即可执行协议协商。客户端在遵守服务器返回的会话标识符的同时,发布您的产品名称、标题和语义版本。
丰富的能力接口
发出即用型方法调用,包括 Ping、ToolsList、ToolsCall、PromptsList、PromptsGet、ResourcesList 和 ResourcesRead。每种响应类型都经过强类型化,使后续处理变得轻松。
事件驱动的自定义
挂钩细粒度事件(初始化、ping、工具发现、提示检索和资源流),在每次交换到达业务层之前进行追踪和个性化处理。
该组件自动递增 JSON-RPC 请求标识符,在调用之间持久化 MCP 会话标识符,并在返回远程错误时引发类型化异常。HTTP 连接封装在专用客户端中,该客户端记录流量并使用 OpenSSL 3.0 API 协商 TLS 1.3。
配置概览
- 客户端配置文件:配置
MCPOptions.ClientInfo,提供包含名称、标题和版本元数据的助手集成方案。 - 服务器端点:将
MCPOptions.ServerOptions.URL设置为要访问的支持 MCP 的 HTTPS 端点。 - HTTP 栈:基于
TsgcAI_MCP_HTTP_Client构建,传输层针对 JSON 内容类型、自动会话头和安全 TLS 默认值进行了优化。 - 可观测性钩子:订阅
OnMCPToolsCall或OnMCPResourcesRead等事件处理程序,以审计和丰富每次协议转换。
Delphi 集成示例
以下代码片段说明了如何将 MCP 客户端放置在数据模块上,在启动时初始化,并在远程助手请求时立即响应工具调用。
uses
sgcAI_MCP_Client, sgcJSON;
procedure TdmMCP.StartMCP;
begin
sgcMCP := TsgcAI_MCP_Client.Create(Self);
sgcMCP.MCPOptions.ClientInfo.Name := 'sgc-demo-pos';
sgcMCP.MCPOptions.ClientInfo.Title := 'Smart POS Assistant';
sgcMCP.MCPOptions.ClientInfo.Version := '2025.10.0';
sgcMCP.MCPOptions.ServerOptions.URL := 'https://mcp.partnercloud.com';
sgcMCP.OnMCPInitialize := DoMCPInitialize;
sgcMCP.OnMCPToolsCall := DoMCPToolsCall;
sgcMCP.Initialize;
end;
procedure TdmMCP.DoMCPInitialize(Sender: TObject;
const Request: TsgcAI_MCP_Request_Initialize;
const Response: TsgcAI_MCP_Response_Initialize;
var Accept: Boolean);
begin
Accept := Response.ServerInfo.SupportsTools('inventory.lookup');
end;
procedure TdmMCP.DoMCPToolsCall(Sender: TObject;
const Request: TsgcAI_MCP_Request_ToolsCall;
const Response: TsgcAI_MCP_Response_ToolsCall);
var
ResultPayload: IsgcJSON;
begin
if Request.Params.Name = 'inventory.lookup' then
begin
ResultPayload := TsgcJSON.CreateObject;
ResultPayload['sku'] := Request.Params.Arguments['sku'];
ResultPayload['availability'] := 'in-stock';
Response.Result := ResultPayload;
end;
end;
