Packages

Gleam library for building Model Context Protocol servers and transports

Current section

Files

Jump to
mcp_toolkit src mcp_toolkit@transport@websocket.erl
Raw

src/mcp_toolkit@transport@websocket.erl

-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).