ElGraph.MCP.Client.StreamableHTTP (ElGraph v0.3.0)

Copy Markdown View Source

MCP Streamable HTTP 클라이언트 transport (ElGraph.MCP.Client 구현, SPEC §4).

외부 MCP 서버를 단일 엔드포인트로 호출한다 — JSON-RPC 2.0을 POST하고 JSON 응답을 받는다 (서버가 SSE로 응답하는 스트리밍 메서드는 현재 미지원, 요청/응답 메서드 중심).

{:ok, handle} = ElGraph.MCP.Client.StreamableHTTP.connect("https://host/mcp")
{:ok, tools}  = ElGraph.MCP.tools({ElGraph.MCP.Client.StreamableHTTP, handle})

핸들은 %{url, req_options, session_id, protocol_version}. connect/2initialize 핸드셰이크를 수행하고(서버가 주면 mcp-session-id 캡처) notifications/initialized를 보낸다. 이후 list_tools/1·call_tool/3은 같은 핸들로 요청한다.

:capabilities 옵션(ElGraph.MCP.Client.Capabilities의 핸들러 맵)을 주면 initialize에 클라이언트 능력(sampling/elicitation/roots)을 광고한다.

Summary

Functions

MCP 서버에 연결하고 initialize 핸드셰이크를 수행한다.

서버→클라이언트 SSE 스트림(GET)을 열어 서버 개시 요청(sampling/elicitation/roots)을 받고 응답을 POST로 되돌린다 (양방향). handlersElGraph.MCP.Client.Capabilities 핸들러 맵. 스트림이 끝날 때까지 블록한다.

Types

handle()

@type handle() :: %{
  url: String.t(),
  req_options: keyword(),
  session_id: String.t() | nil,
  protocol_version: String.t() | nil
}

Functions

connect(url, opts \\ [])

@spec connect(
  String.t(),
  keyword()
) :: {:ok, handle()} | {:error, term()}

MCP 서버에 연결하고 initialize 핸드셰이크를 수행한다.

listen(handle, handlers, opts \\ [])

@spec listen(handle(), ElGraph.MCP.Client.Capabilities.handlers(), keyword()) ::
  :ok | {:error, term()}

서버→클라이언트 SSE 스트림(GET)을 열어 서버 개시 요청(sampling/elicitation/roots)을 받고 응답을 POST로 되돌린다 (양방향). handlersElGraph.MCP.Client.Capabilities 핸들러 맵. 스트림이 끝날 때까지 블록한다.