My agentic slop goes here. Not intended for anyone else!
at main 7.2 kB view raw
1(** MCP Content Block types *) 2 3(* Annotations *) 4 5module Audience = struct 6 type t = User | Assistant 7 8 let jsont : t Jsont.t = 9 Jsont.enum [ 10 "user", User; 11 "assistant", Assistant; 12 ] 13 14 let pp fmt = function 15 | User -> Format.fprintf fmt "user" 16 | Assistant -> Format.fprintf fmt "assistant" 17end 18 19module Annotations = struct 20 type t = { 21 audience : Audience.t list option; 22 priority : float option; 23 unknown : Jsont.json; 24 } 25 26 let empty = 27 let unknown = Jsont.Object ([], Jsont.Meta.none) in 28 { audience = None; priority = None; unknown } 29 30 let jsont : t Jsont.t = 31 let make audience priority unknown = { audience; priority; unknown } in 32 Jsont.Object.map ~kind:"Annotations" make 33 |> Jsont.Object.opt_mem "audience" (Jsont.list Audience.jsont) 34 ~enc:(fun a -> a.audience) 35 |> Jsont.Object.opt_mem "priority" Jsont.number 36 ~enc:(fun a -> a.priority) 37 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun a -> a.unknown) 38 |> Jsont.Object.finish 39 40 let pp fmt _ann = 41 Format.fprintf fmt "{annotations}" 42end 43 44(* Text Content *) 45 46module Text = struct 47 type t = { 48 text : string; 49 annotations : Annotations.t option; 50 unknown : Jsont.json; 51 } 52 53 let make text = 54 let unknown = Jsont.Object ([], Jsont.Meta.none) in 55 { text; annotations = None; unknown } 56 57 let jsont : t Jsont.t = 58 let make text annotations unknown = { text; annotations; unknown } in 59 Jsont.Object.map ~kind:"TextContent" make 60 |> Jsont.Object.mem "text" Jsont.string ~enc:(fun t -> t.text) 61 |> Jsont.Object.opt_mem "annotations" Annotations.jsont 62 ~enc:(fun t -> t.annotations) 63 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun t -> t.unknown) 64 |> Jsont.Object.finish 65 66 let pp fmt t = 67 Format.fprintf fmt "%S" t.text 68end 69 70(* Image Content *) 71 72module Image = struct 73 type t = { 74 data : string; 75 mime_type : string; 76 annotations : Annotations.t option; 77 unknown : Jsont.json; 78 } 79 80 let make ~data ~mime_type = 81 let unknown = Jsont.Object ([], Jsont.Meta.none) in 82 { data; mime_type; annotations = None; unknown } 83 84 let jsont : t Jsont.t = 85 let make data mime_type annotations unknown = 86 { data; mime_type; annotations; unknown } 87 in 88 Jsont.Object.map ~kind:"ImageContent" make 89 |> Jsont.Object.mem "data" Jsont.string ~enc:(fun i -> i.data) 90 |> Jsont.Object.mem "mimeType" Jsont.string ~enc:(fun i -> i.mime_type) 91 |> Jsont.Object.opt_mem "annotations" Annotations.jsont 92 ~enc:(fun i -> i.annotations) 93 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun i -> i.unknown) 94 |> Jsont.Object.finish 95 96 let pp fmt i = 97 Format.fprintf fmt "Image(%s, %d bytes)" i.mime_type (String.length i.data) 98end 99 100(* Audio Content *) 101 102module Audio = struct 103 type t = { 104 data : string; 105 mime_type : string; 106 annotations : Annotations.t option; 107 unknown : Jsont.json; 108 } 109 110 let make ~data ~mime_type = 111 let unknown = Jsont.Object ([], Jsont.Meta.none) in 112 { data; mime_type; annotations = None; unknown } 113 114 let jsont : t Jsont.t = 115 let make data mime_type annotations unknown = 116 { data; mime_type; annotations; unknown } 117 in 118 Jsont.Object.map ~kind:"AudioContent" make 119 |> Jsont.Object.mem "data" Jsont.string ~enc:(fun a -> a.data) 120 |> Jsont.Object.mem "mimeType" Jsont.string ~enc:(fun a -> a.mime_type) 121 |> Jsont.Object.opt_mem "annotations" Annotations.jsont 122 ~enc:(fun a -> a.annotations) 123 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun a -> a.unknown) 124 |> Jsont.Object.finish 125 126 let pp fmt a = 127 Format.fprintf fmt "Audio(%s, %d bytes)" a.mime_type (String.length a.data) 128end 129 130(* Embedded Resource *) 131 132module Embedded_resource = struct 133 type resource = { 134 uri : string; 135 mime_type : string option; 136 text : string option; 137 blob : string option; 138 unknown : Jsont.json; 139 } 140 141 let resource_jsont : resource Jsont.t = 142 let make uri mime_type text blob unknown = 143 { uri; mime_type; text; blob; unknown } 144 in 145 Jsont.Object.map ~kind:"Resource" make 146 |> Jsont.Object.mem "uri" Jsont.string ~enc:(fun r -> r.uri) 147 |> Jsont.Object.opt_mem "mimeType" Jsont.string ~enc:(fun r -> r.mime_type) 148 |> Jsont.Object.opt_mem "text" Jsont.string ~enc:(fun r -> r.text) 149 |> Jsont.Object.opt_mem "blob" Jsont.string ~enc:(fun r -> r.blob) 150 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun r -> r.unknown) 151 |> Jsont.Object.finish 152 153 type t = { 154 resource : resource; 155 annotations : Annotations.t option; 156 unknown : Jsont.json; 157 } 158 159 let make_text ~uri ~text ?mime_type () = 160 let unknown = Jsont.Object ([], Jsont.Meta.none) in 161 let resource = { 162 uri; 163 mime_type; 164 text = Some text; 165 blob = None; 166 unknown; 167 } in 168 { resource; annotations = None; unknown } 169 170 let make_blob ~uri ~blob ~mime_type = 171 let unknown = Jsont.Object ([], Jsont.Meta.none) in 172 let resource = { 173 uri; 174 mime_type = Some mime_type; 175 text = None; 176 blob = Some blob; 177 unknown; 178 } in 179 { resource; annotations = None; unknown } 180 181 let jsont : t Jsont.t = 182 let make resource annotations unknown = 183 { resource; annotations; unknown } 184 in 185 Jsont.Object.map ~kind:"EmbeddedResource" make 186 |> Jsont.Object.mem "resource" resource_jsont ~enc:(fun e -> e.resource) 187 |> Jsont.Object.opt_mem "annotations" Annotations.jsont 188 ~enc:(fun e -> e.annotations) 189 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun e -> e.unknown) 190 |> Jsont.Object.finish 191 192 let pp fmt e = 193 Format.fprintf fmt "Resource(%s)" e.resource.uri 194end 195 196(* Content Block *) 197 198type block = 199 | Text of Text.t 200 | Image of Image.t 201 | Audio of Audio.t 202 | Embedded_resource of Embedded_resource.t 203 204let block_jsont : block Jsont.t = 205 (* Content blocks use "type" discriminator *) 206 let case_map kind obj dec = Jsont.Object.Case.map kind obj ~dec in 207 208 let case_text = case_map "text" Text.jsont (fun v -> Text v) in 209 let case_image = case_map "image" Image.jsont (fun v -> Image v) in 210 let case_audio = case_map "audio" Audio.jsont (fun v -> Audio v) in 211 let case_resource = case_map "resource" Embedded_resource.jsont 212 (fun v -> Embedded_resource v) 213 in 214 215 let enc_case = function 216 | Text v -> Jsont.Object.Case.value case_text v 217 | Image v -> Jsont.Object.Case.value case_image v 218 | Audio v -> Jsont.Object.Case.value case_audio v 219 | Embedded_resource v -> Jsont.Object.Case.value case_resource v 220 in 221 222 let cases = Jsont.Object.Case.[ 223 make case_text; 224 make case_image; 225 make case_audio; 226 make case_resource; 227 ] in 228 229 Jsont.Object.map ~kind:"ContentBlock" Fun.id 230 |> Jsont.Object.case_mem "type" Jsont.string ~enc:Fun.id ~enc_case cases 231 ~tag_to_string:Fun.id ~tag_compare:String.compare 232 |> Jsont.Object.finish 233 234let pp_block fmt = function 235 | Text t -> Text.pp fmt t 236 | Image i -> Image.pp fmt i 237 | Audio a -> Audio.pp fmt a 238 | Embedded_resource e -> Embedded_resource.pp fmt e 239 240(* Convenience constructors *) 241 242let text s = Text (Text.make s) 243 244let image ~data ~mime_type = Image (Image.make ~data ~mime_type) 245 246let audio ~data ~mime_type = Audio (Audio.make ~data ~mime_type)