forked from
anil.recoil.org/monopam-myspace
My aggregated monorepo of OCaml code, automaintained
1(*---------------------------------------------------------------------------
2 Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved.
3 SPDX-License-Identifier: ISC
4 ---------------------------------------------------------------------------*)
5
6module J = Jsont.Json
7
8type t = {
9 name : string;
10 description : string;
11 input_schema : Jsont.json;
12 handler : Tool_input.t -> (Jsont.json, string) result;
13}
14
15let create ~name ~description ~input_schema ~handler =
16 { name; description; input_schema; handler }
17
18let name t = t.name
19let description t = t.description
20let input_schema t = t.input_schema
21let call t input = t.handler input
22
23(* Convenience constructors using Jsont.Json builders *)
24
25let text_result s =
26 J.list [
27 J.object' [
28 J.mem (J.name "type") (J.string "text");
29 J.mem (J.name "text") (J.string s)
30 ]
31 ]
32
33let error_result s =
34 J.list [
35 J.object' [
36 J.mem (J.name "type") (J.string "text");
37 J.mem (J.name "text") (J.string s);
38 J.mem (J.name "is_error") (J.bool true)
39 ]
40 ]
41
42(* Schema helpers *)
43
44let schema_string = J.object' [J.mem (J.name "type") (J.string "string")]
45let schema_int = J.object' [J.mem (J.name "type") (J.string "integer")]
46let schema_number = J.object' [J.mem (J.name "type") (J.string "number")]
47let schema_bool = J.object' [J.mem (J.name "type") (J.string "boolean")]
48
49let schema_array item_schema =
50 J.object' [
51 J.mem (J.name "type") (J.string "array");
52 J.mem (J.name "items") item_schema
53 ]
54
55let schema_string_enum values =
56 J.object' [
57 J.mem (J.name "type") (J.string "string");
58 J.mem (J.name "enum") (J.list (List.map J.string values))
59 ]
60
61let schema_object props ~required =
62 J.object' [
63 J.mem (J.name "type") (J.string "object");
64 J.mem (J.name "properties") (J.object' (List.map (fun (k, v) -> J.mem (J.name k) v) props));
65 J.mem (J.name "required") (J.list (List.map J.string required))
66 ]