Model Context Protocol in OCaml
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