Current section

Files

Jump to
pi_bridge lib pi mcp jsonrpc.ex
Raw

lib/pi/mcp/jsonrpc.ex

defmodule Pi.MCP.JSONRPC do
@moduledoc "JSON-RPC response helpers for MCP HTTP transports."
alias Pi.MCP.Tools
def handle(%{"jsonrpc" => "2.0", "id" => id, "method" => "tools/call", "params" => params}) do
name = params["name"]
args = params["arguments"] || %{}
case Tools.dispatch(name, args) do
{:ok, text} -> success(id, text)
{:error, message} -> tool_error(id, message)
end
end
def handle(%{"jsonrpc" => "2.0", "id" => id, "method" => "initialize"}), do: empty(id)
def handle(%{"jsonrpc" => "2.0", "id" => id}), do: empty(id)
def handle(_), do: {:error, %{error: "Invalid request"}}
def success(id, text) do
{:ok, %{jsonrpc: "2.0", id: id, result: %{content: [%{type: "text", text: text}]}}}
end
def tool_error(id, message) do
{:ok,
%{
jsonrpc: "2.0",
id: id,
result: %{content: [%{type: "text", text: message}], isError: true}
}}
end
def empty(id), do: {:ok, %{jsonrpc: "2.0", id: id, result: %{}}}
end