mcp_stdio_proxy/server/
router_layer.rs

1use axum::{
2    Router,
3    extract::DefaultBodyLimit,
4    routing::{delete, get, post},
5};
6use http::Method;
7use tower_http::cors::{self, CorsLayer};
8
9use crate::{
10    AppError, AppState, DynamicRouterService,
11    model::{GLOBAL_SSE_MCP_ROUTES_PREFIX, GLOBAL_STREAM_MCP_ROUTES_PREFIX, McpProtocol},
12    server::handlers::check_mcp_is_status_handler,
13};
14
15use super::{
16    get_health, get_ready,
17    handlers::{
18        add_route_handler, check_mcp_status_handler_sse, check_mcp_status_handler_stream,
19        delete_route_handler, run_code_handler,
20    },
21    set_layer,
22};
23
24/// 获取路由
25pub async fn get_router(state: AppState) -> Result<Router, AppError> {
26    let health = Router::new()
27        .route("/health", get(get_health))
28        .route("/ready", get(get_ready));
29
30    let cors = CorsLayer::new()
31        // allow `GET` and `POST` when accessing the resource
32        .allow_methods([
33            Method::GET,
34            Method::POST,
35            Method::PATCH,
36            Method::DELETE,
37            Method::PUT,
38        ])
39        .allow_origin(cors::Any)
40        .allow_headers(cors::Any);
41
42    let api = Router::new()
43        // .layer(from_fn_with_state(state.clone(), verify_token::<AppState>))
44        //mcp sse 协议路由
45        .route_service(
46            &format!("{GLOBAL_SSE_MCP_ROUTES_PREFIX}/proxy/{{*path}}"),
47            DynamicRouterService(McpProtocol::Sse),
48        )
49        .route(
50            &format!("{GLOBAL_SSE_MCP_ROUTES_PREFIX}/add"),
51            post(add_route_handler),
52        )
53        .route("/mcp/config/delete/{mcp_id}", delete(delete_route_handler))
54        .route(
55            "/mcp/check/status/{mcp_id}",
56            get(check_mcp_is_status_handler),
57        )
58        .route(
59            &format!("{GLOBAL_SSE_MCP_ROUTES_PREFIX}/check_status"),
60            post(check_mcp_status_handler_sse),
61        )
62        //mcp stream 协议路由
63        .route_service(
64            &format!("{GLOBAL_STREAM_MCP_ROUTES_PREFIX}/proxy/{{*path}}"),
65            DynamicRouterService(McpProtocol::Stream),
66        )
67        .route(
68            &format!("{GLOBAL_STREAM_MCP_ROUTES_PREFIX}/check_status"),
69            post(check_mcp_status_handler_stream),
70        )
71        .route("/api/run_code_with_log", post(run_code_handler))
72        .layer(DefaultBodyLimit::max(20 * 1024 * 1024))
73        .layer(cors);
74
75    // 创建基本路由
76    let app: Router<AppState> = Router::new().merge(health).merge(api);
77
78    // 添加状态
79    let app = app.with_state(state.clone());
80    let router = set_layer(app, state);
81    Ok(router)
82}