Delphi MCP Client

· 컴포넌트

sgcWebSockets 2025.10.0 버전은 Model Context Protocol 2025-06-18 사양과 동기화된 상용급 MCP 클라이언트 구현으로 AI 통합 툴킷을 확장해요. 큐레이션된 컨텍스트 제공, 도구 호출 조율, 리소스 인식 어시스턴트 서비스를 단일 컴포넌트로 모두 처리할 수 있어요.

Model Context Protocol(MCP)은 어시스턴트가 기능을 협상하고 구조화된 컨텍스트를 교환하는 방식을 표준화해요. MCP 클라이언트 지원을 추가함으로써 sgcWebSockets는 다음을 가능하게 해요:

TsgcAI_MCP_Client 주요 기능

턴키 MCP 핸드셰이크

단일 Initialize 호출로 프로토콜 협상을 실행해요. 클라이언트는 서버가 반환한 세션 식별자를 준수하면서 제품 이름, 제목, 의미론적 버전을 알려요.

풍부한 기능 영역

Ping, ToolsList, ToolsCall, PromptsList, PromptsGet, ResourcesList, ResourcesRead를 포함한 기성 메서드 호출을 실행해요. 모든 응답 유형이 강력하게 형식화되어 있어 하위 처리가 쉬워요.

이벤트 기반 맞춤화

초기화, 핑, 도구 발견, 프롬프트 검색, 리소스 스트리밍 등 세분화된 이벤트에 연결하여 비즈니스 레이어에 도달하기 전에 모든 교환을 추적하고 개인화할 수 있어요.


컴포넌트는 JSON-RPC 요청 식별자를 자동으로 증가시키고, 호출 간에 MCP 세션 식별자를 유지하며, 원격 오류가 반환될 때 형식화된 예외를 발생시켜요. HTTP 연결은 트래픽을 기록하고 OpenSSL 3.0 API로 TLS 1.3을 협상하는 특수 클라이언트 내에 캡슐화돼요.

설정 개요

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;