···435435436436let log_warning ex = Logs.warn (fun f -> f "%a" Eio.Exn.pp ex)
437437438438+(** run the server using http transport *)
438439let run_server ?(port = 8080) ?(on_error = log_warning) env server =
439440 let net = Eio.Stdenv.net env in
440441 let addr = `Tcp (Eio.Net.Ipaddr.V4.loopback, port) in
···451452 Log.infof "MCP HTTP Server listening on http://localhost:%d" port;
452453453454 Cohttp_eio.Server.run server_socket server_spec ~on_error
455455+456456+(** run the server using the stdio transport *)
457457+let run_sdtio_server env server =
458458+ let stdin = Eio.Stdenv.stdin env in
459459+ let stdout = Eio.Stdenv.stdout env in
460460+461461+ Log.debugf "Starting MCP server: %s v%s" (name server) (version server);
462462+ Log.debugf "Protocol version: %s" (protocol_version server);
463463+464464+ (* Enable exception backtraces *)
465465+ Printexc.record_backtrace true;
466466+467467+ let buf = Eio.Buf_read.of_flow stdin ~initial_size:100 ~max_size:1_000_000 in
468468+469469+ (* Main processing loop *)
470470+ try
471471+ while true do
472472+ Log.debug "Waiting for message...";
473473+ let line = Eio.Buf_read.line buf in
474474+475475+ (* Process the input and send response if needed *)
476476+ match process_input_line server line with
477477+ | Some response -> send_response stdout response
478478+ | None -> Log.debug "No response needed for this message"
479479+ done
480480+ with
481481+ | End_of_file ->
482482+ Log.debug "End of file received on stdin";
483483+ ()
484484+ | Eio.Exn.Io _ as exn ->
485485+ Log.errorf "I/O error while reading: %s" (Printexc.to_string exn);
486486+ ()
487487+ | exn ->
488488+ Log.errorf "Exception while reading: %s" (Printexc.to_string exn);
489489+ ()