use axum::{routing::get, Json, Router};
use std::sync::atomic::{AtomicBool, Ordering};
use crate::state::AppState;
static MCP_SERVER_RUNNING: AtomicBool = AtomicBool::new(false);
pub fn router() -> Router<AppState> {
Router::new().route("/", get(get_status).post(start_server).delete(stop_server))
}
async fn get_status() -> Json<serde_json::Value> {
if MCP_SERVER_RUNNING.load(Ordering::Relaxed) {
Json(serde_json::json!({
"running": true,
"mcpUrl": "/api/mcp",
"transports": ["streamable-http"],
"message": "MCP server is running (embedded in Rust backend).",
}))
} else {
Json(serde_json::json!({
"running": false,
"message": "Standalone MCP server is not running. POST to /api/mcp-server to start it.",
"fallback": "/api/mcp (embedded Streamable HTTP route)",
}))
}
}
async fn start_server() -> Json<serde_json::Value> {
MCP_SERVER_RUNNING.store(true, Ordering::Relaxed);
Json(serde_json::json!({
"running": true,
"mcpUrl": "/api/mcp",
"transports": ["streamable-http"],
"message": "MCP server started (embedded). Use /api/mcp for Streamable HTTP.",
}))
}
async fn stop_server() -> Json<serde_json::Value> {
MCP_SERVER_RUNNING.store(false, Ordering::Relaxed);
Json(serde_json::json!({
"running": false,
"message": "Standalone MCP server stopped. /api/mcp endpoint remains available.",
}))
}