-module(mcp_toolkit@transport@websocket). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/mcp_toolkit/transport/websocket.gleam"). -export([handle/2]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -file("src/mcp_toolkit/transport/websocket.gleam", 11). ?DOC( " Handle a WebSocket endpoint for MCP using text JSON-RPC messages.\n" " The provided server handles each incoming message and any response is sent\n" " back to the client as a text frame.\n" ). -spec handle( gleam@http@request:request(mist@internal@http:connection()), mcp_toolkit@core@server:server() ) -> gleam@http@response:response(mist:response_data()). handle(Req, Srv) -> On_init = fun(_) -> {Srv, none} end, On_close = fun(_) -> nil end, Ws_handler = fun(State, Msg, Conn) -> case Msg of {text, Text} -> case mcp_toolkit@core@server:handle_message(State, Text) of {ok, {some, J}} -> _ = mist:send_text_frame(Conn, gleam@json:to_string(J)), mist:continue(State); {error, J@1} -> _ = mist:send_text_frame( Conn, gleam@json:to_string(J@1) ), mist:continue(State); _ -> mist:continue(State) end; _ -> mist:continue(State) end end, mist:websocket(Req, Ws_handler, On_init, On_close).