use crate::mcp::tools::{McpServer, Request, Response};
use axum::{
extract::State,
response::{
sse::{Event, KeepAlive, Sse},
Json,
},
routing::{get, post},
Router,
};
use futures_util::stream::{self, Stream};
use std::{convert::Infallible, sync::Arc, time::Duration};
pub fn router(server: McpServer) -> Router {
Router::new()
.route("/mcp", post(json_rpc_handler))
.route("/mcp/sse", get(sse_handler))
.with_state(Arc::new(server))
}
async fn json_rpc_handler(
State(server): State<Arc<McpServer>>,
Json(req): Json<Request>,
) -> Json<Response> {
Json(server.dispatch(req).await)
}
async fn sse_handler(
State(_server): State<Arc<McpServer>>,
) -> Sse<impl Stream<Item = Result<Event, Infallible>>> {
let ready = Event::default()
.event("ready")
.data(r#"{"status":"ready"}"#);
let stream = stream::iter(vec![Ok(ready)]);
Sse::new(stream).keep_alive(
KeepAlive::new()
.interval(Duration::from_secs(15))
.text("keep-alive"),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn router_builds() {
let server = McpServer::new("http://127.0.0.1:1");
let _r: Router = router(server);
}
}