use futures::FutureExt;
use futures::future::Shared;
use tokio::sync::oneshot;
use crate::context::Context;
use crate::executor::CliCommandExecutor;
#[derive(Clone)]
pub struct McpServerHandle {
pub port: Shared<oneshot::Receiver<u16>>,
}
pub fn spawn(ctx: Context) -> McpServerHandle {
let (port_tx, port_rx) = oneshot::channel::<u16>();
let config = objectiveai_mcp::Config {
address: "127.0.0.1".to_string(),
port: 0,
suppress_output: true,
config_base_dir: ctx.config.config_base_dir.clone(),
};
let executor = CliCommandExecutor::new(ctx);
tokio::spawn(async move {
match objectiveai_mcp::setup(config, executor).await {
Ok((listener, app)) => {
let addr = match listener.local_addr() {
Ok(a) => a,
Err(_) => return,
};
if port_tx.send(addr.port()).is_err() {
return;
}
let _ = axum::serve(listener, app).await;
}
Err(_) => {
}
}
});
McpServerHandle {
port: port_rx.shared(),
}
}