Packages
Model Context Protocol (MCP) implementation in Elixir with Phoenix integration
Current section
Files
Jump to
Current section
Files
lib/backplane/mcp_protocol/server/handlers/completion.ex
defmodule Backplane.McpProtocol.Server.Handlers.Completion do
@moduledoc false
alias Backplane.McpProtocol.MCP.Error
alias Backplane.McpProtocol.Server.Frame
alias Backplane.McpProtocol.Server.Response
@spec handle_complete(map(), Frame.t(), module()) ::
{:reply, map(), Frame.t()} | {:error, Error.t(), Frame.t()}
def handle_complete(%{"params" => params}, frame, server) do
%{"ref" => ref} = params
argument = Map.get(params, "argument", %{})
if Backplane.McpProtocol.exported?(server, :handle_completion, 3) do
case server.handle_completion(ref, argument, frame) do
{:reply, %Response{type: :completion} = response, frame} ->
result = Response.to_protocol(response)
{:reply, %{"completion" => result}, frame}
{:reply, %{"values" => values}, frame} when is_list(values) ->
{:reply, %{"completion" => %{"values" => values}}, frame}
{:reply, %{"values" => values, "total" => total, "hasMore" => has_more}, frame} ->
result = %{
"completion" => %{
"values" => values,
"total" => total,
"hasMore" => has_more
}
}
{:reply, result, frame}
{:error, %Error{} = error, frame} ->
{:error, error, frame}
end
else
error =
Error.protocol(:method_not_found, %{
method: "completion/complete",
message: "Server does not implement handle_completion/3"
})
{:error, error, frame}
end
end
def handle_complete(%{}, frame, _server) do
error =
Error.protocol(:invalid_params, %{
message: "Missing required parameter: ref"
})
{:error, error, frame}
end
end