Skip to main content

include/barrel_mcp.hrl

%%%-------------------------------------------------------------------
%%% @doc barrel_mcp shared types and macros
%%% @end
%%%-------------------------------------------------------------------

-ifndef(BARREL_MCP_HRL).
-define(BARREL_MCP_HRL, true).

%% MCP Protocol Version (the server's preferred version, used in
%% `initialize' responses when the client requests one we don't
%% speak). The actual negotiated value for a session is whatever the
%% client asked for if it's in `?MCP_SUPPORTED_VERSIONS'.
-define(MCP_PROTOCOL_VERSION, <<"2025-11-25">>).
%% Legacy protocol version (JSON-RPC only transport)
-define(MCP_PROTOCOL_VERSION_LEGACY, <<"2024-11-05">>).
%% Latest protocol version targeted by the client; the client negotiates
%% downward when the peer reports an older revision.
-define(MCP_CLIENT_PROTOCOL_VERSION, <<"2025-11-25">>).
%% Older revisions the client knows how to speak (in preference order).
-define(MCP_CLIENT_SUPPORTED_VERSIONS, [
    <<"2025-11-25">>, <<"2025-06-18">>, <<"2025-03-26">>, <<"2024-11-05">>
]).
%% Versions the server is willing to accept on the
%% `MCP-Protocol-Version' request header. Same set as the client list
%% today; bumping the server's preferred default is a separate change.
-define(MCP_SUPPORTED_VERSIONS, [
    <<"2025-11-25">>, <<"2025-06-18">>, <<"2025-03-26">>, <<"2024-11-05">>
]).

%% JSON-RPC Error Codes
-define(JSONRPC_PARSE_ERROR, -32700).
-define(JSONRPC_INVALID_REQUEST, -32600).
-define(JSONRPC_METHOD_NOT_FOUND, -32601).
-define(JSONRPC_INVALID_PARAMS, -32602).
-define(JSONRPC_INTERNAL_ERROR, -32603).

%% MCP-specific error codes
-define(MCP_TOOL_ERROR, -32000).
-define(MCP_RESOURCE_ERROR, -32001).
-define(MCP_PROMPT_ERROR, -32002).

%% Handler types
-type handler_type() ::
    tool
    | resource
    | prompt
    | resource_template
    | completion.

%% Tool definition
-type tool_def() :: #{
    module := module(),
    function := atom(),
    description => binary(),
    input_schema => map()
}.

%% Resource definition
-type resource_def() :: #{
    module := module(),
    function := atom(),
    name := binary(),
    uri := binary(),
    description => binary(),
    mime_type => binary()
}.

%% Prompt definition
-type prompt_def() :: #{
    module := module(),
    function := atom(),
    name := binary(),
    description => binary(),
    arguments => [prompt_arg()]
}.

-type prompt_arg() :: #{
    name := binary(),
    description => binary(),
    required => boolean()
}.

%% MCP Content types
-type text_content() :: #{
    % <<"text">>
    type := binary(),
    text := binary()
}.

-type image_content() :: #{
    % <<"image">>
    type := binary(),
    data := binary(),
    mimeType := binary()
}.

-type resource_content() :: #{
    % <<"resource">>
    type := binary(),
    resource := #{
        uri := binary(),
        text => binary(),
        blob => binary(),
        mimeType => binary()
    }
}.

-type mcp_content() :: text_content() | image_content() | resource_content().

%% Registry key for persistent_term
-define(REGISTRY_KEY, barrel_mcp_handlers).

%% ETS table name
-define(REGISTRY_TABLE, barrel_mcp_registry).

-endif.