use crate::server::McpServer;
use ferridriver::backend::BackendKind;
use ferridriver::state::ConnectMode;
use rmcp::ServiceExt;
use std::sync::Arc;
pub async fn serve_stdio(mode: ConnectMode, backend: BackendKind, headless: bool) -> anyhow::Result<()> {
let svc = Box::pin(McpServer::new_headless(mode, backend, headless).serve(rmcp::transport::io::stdio())).await?;
svc.waiting().await?;
Ok(())
}
pub async fn serve_http(mode: ConnectMode, backend: BackendKind, port: u16, headless: bool) -> anyhow::Result<()> {
use rmcp::transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
};
let ct = tokio_util::sync::CancellationToken::new();
let config = StreamableHttpServerConfig::default()
.with_cancellation_token(ct.child_token())
.with_stateful_mode(true);
let svc = StreamableHttpService::new(
move || Ok(McpServer::new_headless(mode.clone(), backend, headless)),
Arc::new(LocalSessionManager::default()),
config,
);
let listener = tokio::net::TcpListener::bind(("0.0.0.0", port)).await?;
eprintln!("ferridriver listening on http://0.0.0.0:{port}/mcp");
axum::serve(listener, axum::Router::new().nest_service("/mcp", svc))
.with_graceful_shutdown(async move { ct.cancelled_owned().await })
.await?;
Ok(())
}
pub async fn serve_stdio_with(server: McpServer) -> anyhow::Result<()> {
let svc = Box::pin(server.serve(rmcp::transport::io::stdio())).await?;
svc.waiting().await?;
Ok(())
}
pub async fn serve_http_with(server: McpServer, port: u16) -> anyhow::Result<()> {
use rmcp::transport::streamable_http_server::{
StreamableHttpServerConfig, StreamableHttpService, session::local::LocalSessionManager,
};
let ct = tokio_util::sync::CancellationToken::new();
let config = StreamableHttpServerConfig::default()
.with_cancellation_token(ct.child_token())
.with_stateful_mode(true);
let svc = StreamableHttpService::new(
move || Ok(server.clone()),
Arc::new(LocalSessionManager::default()),
config,
);
let listener = tokio::net::TcpListener::bind(("0.0.0.0", port)).await?;
eprintln!("ferridriver listening on http://0.0.0.0:{port}/mcp");
axum::serve(listener, axum::Router::new().nest_service("/mcp", svc))
.with_graceful_shutdown(async move { ct.cancelled_owned().await })
.await?;
Ok(())
}