···
let report_progress ctx value total =
match ctx.progress_token, ctx.request_id with
-
| Some token, Some id ->
("progress", `Float value);
···
("required", required_json)
-
(* Server implementation *)
-
type startup_hook = unit -> unit
-
type shutdown_hook = unit -> unit
-
protocol_version: string;
-
mutable capabilities: Json.t;
-
mutable tools: Tool.t list;
-
mutable resources: Resource.t list;
-
mutable prompts: Prompt.t list;
-
mutable lifespan_context: (string * Json.t) list;
-
startup_hook: startup_hook option;
-
shutdown_hook: shutdown_hook option;
-
let create ~name ?(version="0.1.0") ?(protocol_version="2024-11-05") ?startup_hook ?shutdown_hook () =
-
capabilities = `Assoc [];
-
let register_tool server tool =
-
server.tools <- tool :: server.tools;
-
(* Register a resource *)
-
let register_resource server resource =
-
server.resources <- resource :: server.resources;
-
(* Register a prompt *)
-
let register_prompt server prompt =
-
server.prompts <- prompt :: server.prompts;
-
(* Default server capabilities *)
-
let default_capabilities ?(with_tools=true) ?(with_resources=false) ?(with_prompts=false) () =
-
("listChanged", `Bool true)
-
("listChanged", `Bool true);
-
("subscribe", `Bool false)
-
else if not with_resources then
-
("listChanged", `Bool false);
-
("subscribe", `Bool false)
-
("listChanged", `Bool true)
-
else if not with_prompts then
-
("listChanged", `Bool false)
-
(* Update server capabilities *)
-
let update_capabilities server capabilities =
-
server.capabilities <- capabilities
-
(* Process a message *)
-
let process_message _server _json =
-
(* Placeholder implementation *)
-
(* Helper function for default capabilities *)
-
let default_capabilities = Server.default_capabilities
-
(* Add syntactic sugar for creating a server *)
-
module MakeServer(S: sig val name: string val version: string option end) = struct
-
let _config = (S.name, S.version) (* Used to prevent unused parameter warning *)
-
let server = Server.create
-
~protocol_version:"2024-11-05"
-
let tool ?name ?description ?(schema_properties=[]) ?(schema_required=[]) handler =
-
let name = match name with
-
| Some None | None -> "tool" in
-
let input_schema = make_tool_schema schema_properties schema_required in
-
let handler' ctx args =
-
Error (Printexc.to_string exn)
-
server.tools <- tool :: server.tools;
-
(* Create a resource *)
-
let resource ?uri_template ?description ?mime_type handler =
-
let uri_template = match uri_template with
-
| Some (Some uri) -> uri
-
| Some None | None -> "resource://" in
-
let handler' ctx params =
-
Error (Printexc.to_string exn)
-
let resource = Resource.create
-
server.resources <- resource :: server.resources;
-
let prompt ?name ?description ?(arguments=[]) handler =
-
let name = match name with
-
| Some None | None -> "prompt" in
-
let prompt_args = List.map (fun (name, desc, required) ->
-
Prompt.create_argument ~name ?description:desc ~required ()
-
let handler' ctx args =
-
Error (Printexc.to_string exn)
-
let prompt = Prompt.create
-
server.prompts <- prompt :: server.prompts;
-
let run ?with_tools ?with_resources ?with_prompts () =
-
let with_tools = match with_tools with
-
| None -> server.tools <> []
-
let with_resources = match with_resources with
-
| None -> server.resources <> []
-
let with_prompts = match with_prompts with
-
| None -> server.prompts <> []
-
let capabilities = Server.default_capabilities ~with_tools ~with_resources ~with_prompts () in
-
server.capabilities <- capabilities;
-
Log.info "Starting server...";
-
Log.info (Printf.sprintf "Server info: %s v%s" server.name
-
(match S.version with Some v -> v | None -> "unknown"));
-
Printexc.record_backtrace true;
-
set_binary_mode_out stdout false;
-
Log.info "This is just a placeholder server implementation."