use crate::server::BrepServer;
use hyper_util::rt::TokioIo;
use hyper_util::service::TowerToHyperService;
use rmcp::transport::streamable_http_server::session::local::LocalSessionManager;
use rmcp::transport::{StreamableHttpServerConfig, StreamableHttpService};
use std::sync::Arc;
use tokio::net::TcpListener;
pub fn url(port: u16) -> String {
format!("http://127.0.0.1:{port}/mcp")
}
pub async fn serve_http(server: BrepServer, listener: TcpListener) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let state = server.state.clone();
let service = StreamableHttpService::new(
move || Ok(BrepServer { state: state.clone() }),
Arc::new(LocalSessionManager::default()),
StreamableHttpServerConfig::default().with_sse_retry(None),
);
loop {
let (stream, _peer) = listener.accept().await?;
let io = TokioIo::new(stream);
let svc = TowerToHyperService::new(service.clone());
tokio::spawn(async move {
if let Err(e) = hyper::server::conn::http1::Builder::new().serve_connection(io, svc).await {
eprintln!("brep-mcp http: {e}");
}
});
}
}