···
85
+
(* Convert to Mcp_rpc.ToolsList.Tool.t *)
86
+
let to_rpc_tool_list_tool (tool:t) =
87
+
Mcp_rpc.ToolsList.Tool.{
89
+
description = tool.description;
90
+
input_schema = tool.input_schema;
91
+
annotations = None; (* Could be extended to support annotations *)
94
+
(* Convert a list of Tool.t to the format needed for tools/list response *)
95
+
let to_rpc_tools_list tools =
96
+
List.map to_rpc_tool_list_tool tools
98
+
(* Convert Mcp_rpc.ToolsCall response content to Mcp.content list *)
99
+
let rpc_content_to_mcp_content content =
101
+
| Mcp_rpc.ToolsCall.ToolContent.Text t ->
102
+
Mcp.Text { TextContent.text = t.text; annotations = None }
103
+
| Mcp_rpc.ToolsCall.ToolContent.Image i ->
105
+
ImageContent.mime_type = i.mime_type;
109
+
| Mcp_rpc.ToolsCall.ToolContent.Audio a ->
111
+
AudioContent.mime_type = a.mime_type;
115
+
| Mcp_rpc.ToolsCall.ToolContent.Resource r ->
116
+
(* Create a simple text resource from the embedded resource *)
117
+
let uri = match r with
118
+
| { EmbeddedResource.resource = `Text tr; _ } -> tr.uri
119
+
| { EmbeddedResource.resource = `Blob br; _ } -> br.uri
121
+
let text_content = match r with
122
+
| { EmbeddedResource.resource = `Text tr; _ } -> tr.text
123
+
| { EmbeddedResource.resource = `Blob br; _ } -> "Binary content"
125
+
let mime_type = match r with
126
+
| { EmbeddedResource.resource = `Text tr; _ } -> tr.mime_type
127
+
| { EmbeddedResource.resource = `Blob br; _ } -> br.mime_type
129
+
let text_resource = {
130
+
TextResourceContents.uri;
131
+
text = text_content;
135
+
EmbeddedResource.resource = `Text text_resource;
140
+
(* Convert Mcp.content list to Mcp_rpc.ToolsCall.ToolContent.t list *)
141
+
let mcp_content_to_rpc_content content =
144
+
Mcp_rpc.ToolsCall.ToolContent.Text t
146
+
Mcp_rpc.ToolsCall.ToolContent.Image img
148
+
Mcp_rpc.ToolsCall.ToolContent.Audio aud
149
+
| Mcp.Resource res ->
150
+
let resource_data = match res.resource with
151
+
| `Text txt -> `Text txt
152
+
| `Blob blob -> `Blob blob
155
+
EmbeddedResource.resource = resource_data;
156
+
annotations = res.annotations
158
+
Mcp_rpc.ToolsCall.ToolContent.Resource resource
(* Create a tool result with content *)
let create_tool_result content ~is_error =
···
214
+
(* Convert to Mcp_rpc.ResourcesList.Resource.t *)
215
+
let to_rpc_resource_list_resource (resource:t) =
216
+
Mcp_rpc.ResourcesList.Resource.{
217
+
uri = resource.uri_template;
218
+
name = resource.uri_template; (* Use uri as name by default *)
219
+
description = resource.description;
220
+
mime_type = resource.mime_type;
221
+
size = None; (* Size can be added when we have actual resource content *)
224
+
(* Convert a list of Resource.t to the format needed for resources/list response *)
225
+
let to_rpc_resources_list resources =
226
+
List.map to_rpc_resource_list_resource resources
(* Prompts for the MCP server *)
···
288
+
(* Convert argument to Mcp_rpc.PromptsList.PromptArgument.t *)
289
+
let argument_to_rpc_prompt_argument (arg:argument) =
290
+
Mcp_rpc.PromptsList.PromptArgument.{
292
+
description = arg.description;
293
+
required = arg.required;
296
+
(* Convert to Mcp_rpc.PromptsList.Prompt.t *)
297
+
let to_rpc_prompt_list_prompt (prompt:t) =
298
+
Mcp_rpc.PromptsList.Prompt.{
299
+
name = prompt.name;
300
+
description = prompt.description;
301
+
arguments = List.map argument_to_rpc_prompt_argument prompt.arguments;
304
+
(* Convert a list of Prompt.t to the format needed for prompts/list response *)
305
+
let to_rpc_prompts_list prompts =
306
+
List.map to_rpc_prompt_list_prompt prompts
308
+
(* Convert message to Mcp_rpc.PromptMessage.t *)
309
+
let message_to_rpc_prompt_message msg =
311
+
PromptMessage.role = msg.role;
312
+
PromptMessage.content = msg.content;
315
+
(* Convert a list of messages to the format needed for prompts/get response *)
316
+
let messages_to_rpc_prompt_messages messages =
317
+
List.map message_to_rpc_prompt_message messages
let make_tool_schema properties required =