Packages

Gleam library for building Model Context Protocol servers and transports

Current section

Files

Jump to
mcp_toolkit src mcp_toolkit@core@server.erl
Raw

src/mcp_toolkit@core@server.erl

-module(mcp_toolkit@core@server).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/mcp_toolkit/core/server.gleam").
-export([new/2, description/2, instructions/2, add_resource/3, add_resource_template/3, add_tool/4, add_prompt/3, resource_capabilities/3, prompt_capabilities/2, tool_capabilities/2, enable_logging/1, page_limit/2, build/1, initialize/2, ping/2, list_resources/2, list_resource_templates/2, read_resource/2, list_prompts/2, get_prompt/2, list_tools/2, call_tool/2, handle_message/2]).
-export_type([builder/0, server/0, server_prompt/0, server_resource/0, server_resource_template/0, server_tool/0]).
-type builder() :: {builder,
binary(),
binary(),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@dict:dict(binary(), server_resource()),
gleam@dict:dict(binary(), server_resource_template()),
gleam@dict:dict(binary(), server_tool()),
gleam@dict:dict(binary(), server_prompt()),
mcp_toolkit@core@protocol:server_capabilities(),
gleam@option:option(integer())}.
-opaque server() :: {server,
binary(),
binary(),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@dict:dict(binary(), server_resource()),
gleam@dict:dict(binary(), server_resource_template()),
gleam@dict:dict(binary(), server_tool()),
gleam@dict:dict(binary(), server_prompt()),
mcp_toolkit@core@protocol:server_capabilities(),
gleam@option:option(integer())}.
-opaque server_prompt() :: {server_prompt,
mcp_toolkit@core@protocol:prompt(),
fun((mcp_toolkit@core@protocol:get_prompt_request()) -> {ok,
mcp_toolkit@core@protocol:get_prompt_result()} |
{error, binary()})}.
-opaque server_resource() :: {server_resource,
mcp_toolkit@core@protocol:resource(),
fun((mcp_toolkit@core@protocol:read_resource_request()) -> {ok,
mcp_toolkit@core@protocol:read_resource_result()} |
{error, binary()})}.
-opaque server_resource_template() :: {server_resource_template,
mcp_toolkit@core@protocol:resource_template(),
fun((mcp_toolkit@core@protocol:read_resource_request()) -> {ok,
mcp_toolkit@core@protocol:read_resource_result()} |
{error, binary()})}.
-opaque server_tool() :: {server_tool,
mcp_toolkit@core@protocol:tool(),
fun((mcp_toolkit@core@protocol:call_tool_request(gleam@dynamic:dynamic_())) -> {ok,
mcp_toolkit@core@protocol:call_tool_result()} |
{error, mcp_toolkit@core@protocol:mcp_error()})}.
-file("src/mcp_toolkit/core/server.gleam", 28).
-spec new(binary(), binary()) -> builder().
new(Name, Version) ->
{builder,
Name,
Version,
none,
none,
maps:new(),
maps:new(),
maps:new(),
maps:new(),
{server_capabilities, none, none, none, none, none},
none}.
-file("src/mcp_toolkit/core/server.gleam", 43).
-spec description(builder(), binary()) -> builder().
description(Builder, Description) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
{some, Description},
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 47).
-spec instructions(builder(), binary()) -> builder().
instructions(Builder, Instructions) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
{some, Instructions},
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 51).
-spec add_resource(
builder(),
mcp_toolkit@core@protocol:resource(),
fun((mcp_toolkit@core@protocol:read_resource_request()) -> {ok,
mcp_toolkit@core@protocol:read_resource_result()} |
{error, binary()})
) -> builder().
add_resource(Builder, Resource, Handler) ->
Capabilities = case erlang:element(5, erlang:element(10, Builder)) of
none ->
_record = erlang:element(10, Builder),
{server_capabilities,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
{some,
{server_capabilities_resources,
{some, false},
{some, false}}},
erlang:element(6, _record)};
{some, _} ->
erlang:element(10, Builder)
end,
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
gleam@dict:insert(
erlang:element(6, Builder),
erlang:element(7, Resource),
{server_resource, Resource, Handler}
),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
Capabilities,
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 79).
-spec add_resource_template(
builder(),
mcp_toolkit@core@protocol:resource_template(),
fun((mcp_toolkit@core@protocol:read_resource_request()) -> {ok,
mcp_toolkit@core@protocol:read_resource_result()} |
{error, binary()})
) -> builder().
add_resource_template(Builder, Template, Handler) ->
Capabilities = case erlang:element(5, erlang:element(10, Builder)) of
none ->
_record = erlang:element(10, Builder),
{server_capabilities,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
{some,
{server_capabilities_resources,
{some, false},
{some, false}}},
erlang:element(6, _record)};
{some, _} ->
erlang:element(10, Builder)
end,
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
gleam@dict:insert(
erlang:element(7, Builder),
erlang:element(5, Template),
{server_resource_template, Template, Handler}
),
erlang:element(8, Builder),
erlang:element(9, Builder),
Capabilities,
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 133).
-spec prompt_handler(
gleam@dynamic@decode:decoder(YTA),
fun((mcp_toolkit@core@protocol:call_tool_request(YTA)) -> {ok,
mcp_toolkit@core@protocol:call_tool_result()} |
{error, binary()})
) -> fun((mcp_toolkit@core@protocol:call_tool_request(gleam@dynamic:dynamic_())) -> {ok,
mcp_toolkit@core@protocol:call_tool_result()} |
{error, mcp_toolkit@core@protocol:mcp_error()}).
prompt_handler(Arguments_decoder, Handler) ->
fun(Request) -> case erlang:element(3, Request) of
none ->
_pipe = {call_tool_request, erlang:element(2, Request), none},
_pipe@1 = Handler(_pipe),
gleam@result:map_error(
_pipe@1,
fun(Field@0) -> {application_error, Field@0} end
);
{some, Dyn} ->
case gleam@dynamic@decode:run(Dyn, Arguments_decoder) of
{ok, Args} ->
_pipe@2 = {call_tool_request,
erlang:element(2, Request),
{some, Args}},
_pipe@3 = Handler(_pipe@2),
gleam@result:map_error(
_pipe@3,
fun(Field@0) -> {application_error, Field@0} end
);
{error, _} ->
{error, invalid_params}
end
end end.
-file("src/mcp_toolkit/core/server.gleam", 107).
-spec add_tool(
builder(),
mcp_toolkit@core@protocol:tool(),
gleam@dynamic@decode:decoder(YSV),
fun((mcp_toolkit@core@protocol:call_tool_request(YSV)) -> {ok,
mcp_toolkit@core@protocol:call_tool_result()} |
{error, binary()})
) -> builder().
add_tool(Builder, Tool, Arguments_decoder, Handler) ->
Capabilities = case erlang:element(6, erlang:element(10, Builder)) of
none ->
_record = erlang:element(10, Builder),
{server_capabilities,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
{some, {server_capabilities_tools, none}}};
{some, _} ->
erlang:element(10, Builder)
end,
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
gleam@dict:insert(
erlang:element(8, Builder),
erlang:element(5, Tool),
{server_tool, Tool, prompt_handler(Arguments_decoder, Handler)}
),
erlang:element(9, Builder),
Capabilities,
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 159).
-spec add_prompt(
builder(),
mcp_toolkit@core@protocol:prompt(),
fun((mcp_toolkit@core@protocol:get_prompt_request()) -> {ok,
mcp_toolkit@core@protocol:get_prompt_result()} |
{error, binary()})
) -> builder().
add_prompt(Builder, Prompt, Handler) ->
Capabilities = case erlang:element(4, erlang:element(10, Builder)) of
none ->
_record = erlang:element(10, Builder),
{server_capabilities,
erlang:element(2, _record),
erlang:element(3, _record),
{some, {server_capabilities_prompts, none}},
erlang:element(5, _record),
erlang:element(6, _record)};
{some, _} ->
erlang:element(10, Builder)
end,
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
gleam@dict:insert(
erlang:element(9, Builder),
erlang:element(4, Prompt),
{server_prompt, Prompt, Handler}
),
Capabilities,
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 183).
-spec resource_capabilities(builder(), boolean(), boolean()) -> builder().
resource_capabilities(Builder, Subscribe, List_changed) ->
Capabilities = begin
_record = erlang:element(10, Builder),
{server_capabilities,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
{some,
{server_capabilities_resources,
{some, Subscribe},
{some, List_changed}}},
erlang:element(6, _record)}
end,
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
Capabilities,
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 199).
-spec prompt_capabilities(builder(), boolean()) -> builder().
prompt_capabilities(Builder, List_changed) ->
Capabilities = begin
_record = erlang:element(10, Builder),
{server_capabilities,
erlang:element(2, _record),
erlang:element(3, _record),
{some, {server_capabilities_prompts, {some, List_changed}}},
erlang:element(5, _record),
erlang:element(6, _record)}
end,
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
Capabilities,
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 208).
-spec tool_capabilities(builder(), boolean()) -> builder().
tool_capabilities(Builder, List_changed) ->
Capabilities = begin
_record = erlang:element(10, Builder),
{server_capabilities,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
{some, {server_capabilities_tools, {some, List_changed}}}}
end,
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
Capabilities,
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 217).
-spec enable_logging(builder()) -> builder().
enable_logging(Builder) ->
Capabilities = begin
_record = erlang:element(10, Builder),
{server_capabilities,
erlang:element(2, _record),
{some, server_capabilities_logging},
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record)}
end,
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
Capabilities,
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 226).
-spec page_limit(builder(), integer()) -> builder().
page_limit(Builder, Page_limit) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
{some, Page_limit}}.
-file("src/mcp_toolkit/core/server.gleam", 245).
-spec build(builder()) -> server().
build(Builder) ->
{server,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/mcp_toolkit/core/server.gleam", 463).
-spec handle_notification(
server(),
jsonrpcx:notification(gleam@dynamic:dynamic_())
) -> nil.
handle_notification(_, Notification) ->
case erlang:element(3, Notification) of
_ ->
nil
end.
-file("src/mcp_toolkit/core/server.gleam", 476).
-spec initialize(server(), mcp_toolkit@core@protocol:initialize_request()) -> {ok,
mcp_toolkit@core@protocol:initialize_result()} |
{error, gleam@json:json()}.
initialize(Server, _) ->
{ok,
{initialize_result,
none,
erlang:element(10, Server),
erlang:element(5, Server),
<<"2025-06-18"/utf8>>,
{implementation,
erlang:element(2, Server),
erlang:element(3, Server)}}}.
-file("src/mcp_toolkit/core/server.gleam", 489).
-spec ping(server(), mcp_toolkit@core@protocol:ping_request()) -> {ok,
mcp_toolkit@core@protocol:ping_result()} |
{error, gleam@json:json()}.
ping(_, _) ->
{ok, ping_result}.
-file("src/mcp_toolkit/core/server.gleam", 496).
-spec list_resources(server(), mcp_toolkit@core@protocol:list_request()) -> {ok,
mcp_toolkit@core@protocol:list_resources_result()} |
{error, gleam@json:json()}.
list_resources(Server, _) ->
Resources = begin
_pipe = maps:values(erlang:element(6, Server)),
gleam@list:map(_pipe, fun(R) -> erlang:element(2, R) end)
end,
{ok, {list_resources_result, none, none, Resources}}.
-file("src/mcp_toolkit/core/server.gleam", 506).
-spec list_resource_templates(
server(),
mcp_toolkit@core@protocol:list_request()
) -> {ok, mcp_toolkit@core@protocol:list_resource_templates_result()} |
{error, gleam@json:json()}.
list_resource_templates(Server, _) ->
Resource_templates = begin
_pipe = maps:values(erlang:element(7, Server)),
gleam@list:map(_pipe, fun(R) -> erlang:element(2, R) end)
end,
{ok, {list_resource_templates_result, none, none, Resource_templates}}.
-file("src/mcp_toolkit/core/server.gleam", 528).
-spec read_resource(server(), mcp_toolkit@core@protocol:read_resource_request()) -> {ok,
mcp_toolkit@core@protocol:read_resource_result()} |
{error, binary()}.
read_resource(Server, Request) ->
case gleam_stdlib:map_get(
erlang:element(6, Server),
erlang:element(2, Request)
) of
{ok, Resource} ->
case (erlang:element(3, Resource))(Request) of
{ok, Res} ->
{ok, Res};
{error, Err} ->
{error, Err}
end;
{error, _} ->
{error,
<<"Resource not found: "/utf8,
(erlang:element(2, Request))/binary>>}
end.
-file("src/mcp_toolkit/core/server.gleam", 520).
-spec read_resource_handler(
server(),
mcp_toolkit@core@protocol:read_resource_request()
) -> {ok, mcp_toolkit@core@protocol:read_resource_result()} |
{error, gleam@json:json()}.
read_resource_handler(Server, Request) ->
_pipe = read_resource(Server, Request),
gleam@result:map_error(
_pipe,
fun(Err) ->
gleam@json:object([{<<"error"/utf8>>, gleam@json:string(Err)}])
end
).
-file("src/mcp_toolkit/core/server.gleam", 545).
-spec list_prompts(server(), mcp_toolkit@core@protocol:list_request()) -> {ok,
mcp_toolkit@core@protocol:list_prompts_result()} |
{error, gleam@json:json()}.
list_prompts(Server, _) ->
Prompts = begin
_pipe = maps:values(erlang:element(9, Server)),
gleam@list:map(_pipe, fun(P) -> erlang:element(2, P) end)
end,
{ok, {list_prompts_result, none, none, Prompts}}.
-file("src/mcp_toolkit/core/server.gleam", 563).
-spec get_prompt(server(), mcp_toolkit@core@protocol:get_prompt_request()) -> {ok,
mcp_toolkit@core@protocol:get_prompt_result()} |
{error, binary()}.
get_prompt(Server, Request) ->
case gleam_stdlib:map_get(
erlang:element(9, Server),
erlang:element(3, Request)
) of
{ok, Prompt} ->
case (erlang:element(3, Prompt))(Request) of
{ok, Res} ->
{ok, Res};
{error, Err} ->
{error, Err}
end;
{error, _} ->
{error,
<<"Prompt not found: "/utf8,
(erlang:element(3, Request))/binary>>}
end.
-file("src/mcp_toolkit/core/server.gleam", 555).
-spec get_prompt_handler(
server(),
mcp_toolkit@core@protocol:get_prompt_request()
) -> {ok, mcp_toolkit@core@protocol:get_prompt_result()} |
{error, gleam@json:json()}.
get_prompt_handler(Server, Request) ->
_pipe = get_prompt(Server, Request),
gleam@result:map_error(
_pipe,
fun(Err) ->
gleam@json:object([{<<"error"/utf8>>, gleam@json:string(Err)}])
end
).
-file("src/mcp_toolkit/core/server.gleam", 580).
-spec list_tools(server(), mcp_toolkit@core@protocol:list_request()) -> {ok,
mcp_toolkit@core@protocol:list_tools_result()} |
{error, gleam@json:json()}.
list_tools(Server, _) ->
Tools = begin
_pipe = maps:values(erlang:element(8, Server)),
gleam@list:map(_pipe, fun(T) -> erlang:element(2, T) end)
end,
{ok, {list_tools_result, none, none, Tools}}.
-file("src/mcp_toolkit/core/server.gleam", 603).
-spec call_tool(
server(),
mcp_toolkit@core@protocol:call_tool_request(gleam@dynamic:dynamic_())
) -> {ok, mcp_toolkit@core@protocol:call_tool_result()} |
{error, mcp_toolkit@core@protocol:mcp_error()}.
call_tool(Server, Request) ->
case gleam_stdlib:map_get(
erlang:element(8, Server),
erlang:element(2, Request)
) of
{ok, Tool} ->
case (erlang:element(3, Tool))(Request) of
{ok, Res} ->
{ok, Res};
{error, Err} ->
{error, Err}
end;
{error, _} ->
{error,
{application_error,
<<"Tool not found: "/utf8,
(erlang:element(2, Request))/binary>>}}
end.
-file("src/mcp_toolkit/core/server.gleam", 590).
-spec call_tool_handler(
server(),
mcp_toolkit@core@protocol:call_tool_request(gleam@dynamic:dynamic_())
) -> {ok, mcp_toolkit@core@protocol:call_tool_result()} |
{error, gleam@json:json()}.
call_tool_handler(Server, Request) ->
_pipe = call_tool(Server, Request),
gleam@result:map_error(_pipe, fun(Err) -> case Err of
{application_error, Msg} ->
gleam@json:object(
[{<<"error"/utf8>>, gleam@json:string(Msg)}]
);
_ ->
gleam@json:object(
[{<<"error"/utf8>>,
gleam@json:string(<<"Tool error"/utf8>>)}]
)
end end).
-file("src/mcp_toolkit/core/server.gleam", 648).
-spec decode_errors_json(
{ok, YVJ} | {error, list(gleam@dynamic@decode:decode_error())},
jsonrpcx:id()
) -> {ok, YVJ} | {error, gleam@json:json()}.
decode_errors_json(Result, Id) ->
_pipe = Result,
_pipe@1 = gleam@result:map_error(_pipe, fun jsonrpcx:decode_errors/1),
_pipe@2 = gleam@result:map_error(
_pipe@1,
fun(_capture) -> jsonrpcx:error_response(_capture, Id) end
),
gleam@result:map_error(
_pipe@2,
fun(_capture@1) ->
jsonrpcx:error_response_to_json(
_capture@1,
fun jsonrpcx:nothing_to_json/1
)
end
).
-file("src/mcp_toolkit/core/server.gleam", 420).
-spec require_params(
server(),
jsonrpcx:request(gleam@dynamic:dynamic_()),
fun((server(), YTV) -> {ok, YTW} | {error, gleam@json:json()}),
gleam@dynamic@decode:decoder(YTV),
fun((YTW) -> gleam@json:json())
) -> {ok, gleam@json:json()} | {error, gleam@json:json()}.
require_params(Server, Request, Handler, Params_decoder, Result_encoder) ->
case erlang:element(5, Request) of
none ->
_pipe = {json_rpc_error, -32602, <<"Invalid params"/utf8>>},
_pipe@1 = jsonrpcx:error_response(_pipe, erlang:element(4, Request)),
_pipe@2 = jsonrpcx:error_response_to_json(
_pipe@1,
fun jsonrpcx:nothing_to_json/1
),
{error, _pipe@2};
{some, Params} ->
_pipe@3 = gleam@dynamic@decode:run(Params, Params_decoder),
_pipe@4 = decode_errors_json(_pipe@3, erlang:element(4, Request)),
_pipe@5 = gleam@result:'try'(
_pipe@4,
fun(_capture) -> Handler(Server, _capture) end
),
_pipe@6 = gleam@result:map(
_pipe@5,
fun(_capture@1) ->
jsonrpcx:response(_capture@1, erlang:element(4, Request))
end
),
gleam@result:map(
_pipe@6,
fun(_capture@2) ->
jsonrpcx:response_to_json(_capture@2, Result_encoder)
end
)
end.
-file("src/mcp_toolkit/core/server.gleam", 442).
-spec paginated_params(
server(),
jsonrpcx:request(gleam@dynamic:dynamic_()),
fun((server(), mcp_toolkit@core@protocol:list_request()) -> {ok, YUD} |
{error, gleam@json:json()}),
fun((YUD) -> gleam@json:json())
) -> {ok, gleam@json:json()} | {error, gleam@json:json()}.
paginated_params(Server, Request, Handler, Encoder) ->
case erlang:element(5, Request) of
none ->
_pipe = Handler(Server, {list_request, none}),
_pipe@1 = gleam@result:map(
_pipe,
fun(_capture) ->
jsonrpcx:response(_capture, erlang:element(4, Request))
end
),
gleam@result:map(
_pipe@1,
fun(_capture@1) ->
jsonrpcx:response_to_json(_capture@1, Encoder)
end
);
{some, Params} ->
_pipe@2 = gleam@dynamic@decode:run(
Params,
mcp_toolkit@core@protocol:list_request_decoder()
),
_pipe@3 = decode_errors_json(_pipe@2, erlang:element(4, Request)),
_pipe@4 = gleam@result:'try'(
_pipe@3,
fun(_capture@2) -> Handler(Server, _capture@2) end
),
_pipe@5 = gleam@result:map(
_pipe@4,
fun(_capture@3) ->
jsonrpcx:response(_capture@3, erlang:element(4, Request))
end
),
gleam@result:map(
_pipe@5,
fun(_capture@4) ->
jsonrpcx:response_to_json(_capture@4, Encoder)
end
)
end.
-file("src/mcp_toolkit/core/server.gleam", 318).
-spec handle_request(server(), jsonrpcx:request(gleam@dynamic:dynamic_())) -> {ok,
gleam@json:json()} |
{error, gleam@json:json()}.
handle_request(Server, Request) ->
case erlang:element(3, Request) of
M when M =:= <<"initialize"/utf8>> ->
require_params(
Server,
Request,
fun initialize/2,
mcp_toolkit@core@protocol:initialize_request_decoder(),
fun mcp_toolkit@core@protocol:initialize_result_to_json/1
);
M@1 when M@1 =:= <<"ping"/utf8>> ->
case erlang:element(5, Request) of
none ->
_pipe = ping(Server, {ping_request, none}),
gleam@result:map(
_pipe,
fun mcp_toolkit@core@protocol:ping_result_to_json/1
);
{some, Params} ->
_pipe@1 = gleam@dynamic@decode:run(
Params,
mcp_toolkit@core@protocol:ping_request_decoder()
),
_pipe@2 = decode_errors_json(
_pipe@1,
erlang:element(4, Request)
),
_pipe@3 = gleam@result:'try'(
_pipe@2,
fun(_capture) -> ping(Server, _capture) end
),
_pipe@4 = gleam@result:map(
_pipe@3,
fun(_capture@1) ->
jsonrpcx:response(
_capture@1,
erlang:element(4, Request)
)
end
),
gleam@result:map(
_pipe@4,
fun(_capture@2) ->
jsonrpcx:response_to_json(
_capture@2,
fun mcp_toolkit@core@protocol:ping_result_to_json/1
)
end
)
end;
M@2 when M@2 =:= <<"resources/list"/utf8>> ->
paginated_params(
Server,
Request,
fun list_resources/2,
fun mcp_toolkit@core@protocol:list_resources_result_to_json/1
);
M@3 when M@3 =:= <<"resources/read"/utf8>> ->
require_params(
Server,
Request,
fun read_resource_handler/2,
mcp_toolkit@core@protocol:read_resource_request_decoder(),
fun mcp_toolkit@core@protocol:read_resource_result_to_json/1
);
M@4 when M@4 =:= <<"resources/templates/list"/utf8>> ->
paginated_params(
Server,
Request,
fun list_resource_templates/2,
fun mcp_toolkit@core@protocol:list_resource_templates_result_to_json/1
);
M@5 when M@5 =:= <<"prompts/list"/utf8>> ->
paginated_params(
Server,
Request,
fun list_prompts/2,
fun mcp_toolkit@core@protocol:list_prompts_result_to_json/1
);
M@6 when M@6 =:= <<"prompts/get"/utf8>> ->
require_params(
Server,
Request,
fun get_prompt_handler/2,
mcp_toolkit@core@protocol:get_prompt_request_decoder(),
fun mcp_toolkit@core@protocol:get_prompt_result_to_json/1
);
M@7 when M@7 =:= <<"tools/list"/utf8>> ->
paginated_params(
Server,
Request,
fun list_tools/2,
fun mcp_toolkit@core@protocol:list_tools_result_to_json/1
);
M@8 when M@8 =:= <<"tools/call"/utf8>> ->
require_params(
Server,
Request,
fun call_tool_handler/2,
mcp_toolkit@core@protocol:call_tool_request_decoder(
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
),
fun mcp_toolkit@core@protocol:call_tool_result_to_json/1
);
_ ->
_pipe@5 = {json_rpc_error, -32601, <<"Method not found"/utf8>>},
_pipe@6 = jsonrpcx:error_response(
_pipe@5,
erlang:element(4, Request)
),
_pipe@7 = jsonrpcx:error_response_to_json(
_pipe@6,
fun jsonrpcx:nothing_to_json/1
),
{ok, _pipe@7}
end.
-file("src/mcp_toolkit/core/server.gleam", 291).
-spec handle_message(server(), binary()) -> {ok,
gleam@option:option(gleam@json:json())} |
{error, gleam@json:json()}.
handle_message(Server, Message) ->
Result = begin
_pipe = gleam@json:parse(Message, jsonrpcx:message_decoder()),
_pipe@1 = gleam@result:map_error(_pipe, fun jsonrpcx:json_error/1),
_pipe@2 = gleam@result:map_error(
_pipe@1,
fun(_capture) -> jsonrpcx:error_response(_capture, null_id) end
),
gleam@result:map_error(
_pipe@2,
fun(_capture@1) ->
jsonrpcx:error_response_to_json(
_capture@1,
fun jsonrpcx:nothing_to_json/1
)
end
)
end,
gleam@result:'try'(Result, fun(Msg) -> case Msg of
{request_message, Request} ->
_pipe@3 = handle_request(Server, Request),
gleam@result:map(
_pipe@3,
fun(Field@0) -> {some, Field@0} end
);
{notification_message, Notification} ->
_ = handle_notification(Server, Notification),
{ok, none};
_ ->
{ok, none}
end end).