use std::net::SocketAddr;
use std::sync::Arc;
use rmcp::transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
};
use tokio::sync::Mutex;
use crate::server::ZendriverServer;
use crate::state::{SessionState, StealthProfileChoice};
pub async fn serve(
addr: SocketAddr,
default_profile: StealthProfileChoice,
) -> Result<(), Box<dyn std::error::Error>> {
let service = StreamableHttpService::new(
move || {
let state = Arc::new(Mutex::new(SessionState {
stealth_profile_choice: default_profile,
..SessionState::new()
}));
Ok(ZendriverServer { state })
},
LocalSessionManager::default().into(),
StreamableHttpServerConfig::default(),
);
let router = axum::Router::new().nest_service("/mcp", service);
let listener = tokio::net::TcpListener::bind(addr).await?;
tracing::info!(%addr, "zendriver-mcp HTTP listening on /mcp");
axum::serve(listener, router).await?;
Ok(())
}