Model Context Protocol in OCaml
at main 6.9 kB view raw
1(** MCP SDK - Model Context Protocol SDK for OCaml *) 2 3open Mcp 4open Jsonrpc 5 6val version : string 7(** SDK version *) 8 9(** Context for tools and resources *) 10module Context : sig 11 type t 12 13 val create : 14 ?request_id:RequestId.t -> 15 ?progress_token:ProgressToken.t -> 16 ?lifespan_context:(string * Json.t) list -> 17 unit -> 18 t 19 20 val get_context_value : t -> string -> Json.t option 21 val report_progress : t -> float -> float -> JSONRPCMessage.t option 22end 23 24(** Tools for the MCP server *) 25module Tool : sig 26 type handler = Context.t -> Json.t -> (Json.t, string) result 27 28 type t = { 29 name : string; 30 description : string option; 31 input_schema : Json.t; 32 handler : handler; 33 } 34 35 val create : 36 name:string -> 37 ?description:string -> 38 input_schema:Json.t -> 39 handler:handler -> 40 unit -> 41 t 42 43 val to_json : t -> Json.t 44 45 val to_rpc_tool_list_tool : t -> Mcp_rpc.ToolsList.Tool.t 46 (** Convert to Mcp_rpc.ToolsList.Tool.t *) 47 48 val to_rpc_tools_list : t list -> Mcp_rpc.ToolsList.Tool.t list 49 (** Convert a list of Tool.t to the format needed for tools/list response *) 50 51 val rpc_content_to_mcp_content : 52 Mcp_rpc.ToolsCall.ToolContent.t list -> Mcp.content list 53 (** Convert Mcp_rpc.ToolsCall response content to Mcp.content list *) 54 55 val mcp_content_to_rpc_content : 56 Mcp.content list -> Mcp_rpc.ToolsCall.ToolContent.t list 57 (** Convert Mcp.content list to Mcp_rpc.ToolsCall.ToolContent.t list *) 58 59 val create_tool_result : Mcp.content list -> is_error:bool -> Json.t 60 (** Create a tool result with content *) 61 62 val create_error_result : string -> Json.t 63 (** Create a tool error result with structured content *) 64 65 val handle_execution_error : string -> Json.t 66 (** Handle tool execution errors *) 67 68 val handle_unknown_tool_error : string -> Json.t 69 (** Handle unknown tool error *) 70 71 val handle_execution_exception : exn -> Json.t 72 (** Handle general tool execution exception *) 73end 74 75(** Resources for the MCP server *) 76module Resource : sig 77 type handler = Context.t -> string list -> (string, string) result 78 79 type t = { 80 uri : string; 81 name : string; 82 description : string option; 83 mime_type : string option; 84 handler : handler; 85 } 86 87 val create : 88 uri:string -> 89 name:string -> 90 ?description:string -> 91 ?mime_type:string -> 92 handler:handler -> 93 unit -> 94 t 95 96 val to_json : t -> Json.t 97 98 val to_rpc_resource_list_resource : t -> Mcp_rpc.ResourcesList.Resource.t 99 (** Convert to Mcp_rpc.ResourcesList.Resource.t *) 100 101 val to_rpc_resources_list : t list -> Mcp_rpc.ResourcesList.Resource.t list 102 (** Convert a list of Resource.t to the format needed for resources/list 103 response *) 104end 105 106(** Resource Templates for the MCP server *) 107module ResourceTemplate : sig 108 type handler = Context.t -> string list -> (string, string) result 109 110 type t = { 111 uri_template : string; 112 name : string; 113 description : string option; 114 mime_type : string option; 115 handler : handler; 116 } 117 118 val create : 119 uri_template:string -> 120 name:string -> 121 ?description:string -> 122 ?mime_type:string -> 123 handler:handler -> 124 unit -> 125 t 126 127 val to_json : t -> Json.t 128 129 val to_rpc_resource_template : 130 t -> Mcp_rpc.ListResourceTemplatesResult.ResourceTemplate.t 131 (** Convert to Mcp_rpc.ResourceTemplatesList.ResourceTemplate.t *) 132 133 val to_rpc_resource_templates_list : 134 t list -> Mcp_rpc.ListResourceTemplatesResult.ResourceTemplate.t list 135 (** Convert a list of ResourceTemplate.t to the format needed for 136 resources/templates/list response *) 137end 138 139(** Prompts for the MCP server *) 140module Prompt : sig 141 type argument = { 142 name : string; 143 description : string option; 144 required : bool; 145 } 146 147 type message = { role : Role.t; content : content } 148 149 type handler = 150 Context.t -> (string * string) list -> (message list, string) result 151 152 type t = { 153 name : string; 154 description : string option; 155 arguments : argument list; 156 handler : handler; 157 } 158 159 val create : 160 name:string -> 161 ?description:string -> 162 ?arguments:argument list -> 163 handler:handler -> 164 unit -> 165 t 166 167 val create_argument : 168 name:string -> ?description:string -> ?required:bool -> unit -> argument 169 170 val to_json : t -> Json.t 171 172 val argument_to_rpc_prompt_argument : 173 argument -> Mcp_rpc.PromptsList.PromptArgument.t 174 (** Convert argument to Mcp_rpc.PromptsList.PromptArgument.t *) 175 176 val to_rpc_prompt_list_prompt : t -> Mcp_rpc.PromptsList.Prompt.t 177 (** Convert to Mcp_rpc.PromptsList.Prompt.t *) 178 179 val to_rpc_prompts_list : t list -> Mcp_rpc.PromptsList.Prompt.t list 180 (** Convert a list of Prompt.t to the format needed for prompts/list response 181 *) 182 183 val message_to_rpc_prompt_message : message -> PromptMessage.t 184 (** Convert message to Mcp_rpc.PromptMessage.t *) 185 186 val messages_to_rpc_prompt_messages : message list -> PromptMessage.t list 187 (** Convert a list of messages to the format needed for prompts/get response 188 *) 189end 190 191type server 192(** Main server type *) 193 194val name : server -> string 195val version : server -> string 196val protocol_version : server -> string 197val capabilities : server -> Json.t 198val tools : server -> Tool.t list 199val resources : server -> Resource.t list 200val resource_templates : server -> ResourceTemplate.t list 201val prompts : server -> Prompt.t list 202 203val create_server : 204 name:string -> ?version:string -> ?protocol_version:string -> unit -> server 205(** Create a new server *) 206 207val default_capabilities : 208 ?with_tools:bool -> 209 ?with_resources:bool -> 210 ?with_resource_templates:bool -> 211 ?with_prompts:bool -> 212 unit -> 213 Json.t 214(** Default capabilities for the server *) 215 216val add_tool : 217 server -> 218 name:string -> 219 ?description:string -> 220 ?schema_properties:(string * string * string) list -> 221 ?schema_required:string list -> 222 (Json.t -> Json.t) -> 223 Tool.t 224(** Create and register a tool in one step *) 225 226val add_resource : 227 server -> 228 uri:string -> 229 name:string -> 230 ?description:string -> 231 ?mime_type:string -> 232 (string list -> string) -> 233 Resource.t 234(** Create and register a resource in one step *) 235 236val add_resource_template : 237 server -> 238 uri_template:string -> 239 name:string -> 240 ?description:string -> 241 ?mime_type:string -> 242 (string list -> string) -> 243 ResourceTemplate.t 244(** Create and register a resource template in one step *) 245 246val add_prompt : 247 server -> 248 name:string -> 249 ?description:string -> 250 ?arguments:(string * string option * bool) list -> 251 ((string * string) list -> Prompt.message list) -> 252 Prompt.t 253(** Create and register a prompt in one step *) 254 255val configure_server : 256 server -> 257 ?with_tools:bool -> 258 ?with_resources:bool -> 259 ?with_resource_templates:bool -> 260 ?with_prompts:bool -> 261 unit -> 262 server 263(** Configure server with default capabilities based on registered components *) 264 265val make_tool_schema : (string * string * string) list -> string list -> Json.t