mcp_stdio_proxy/server/middlewares/
mod.rs

1mod auth;
2mod mcp_router_json;
3mod mcp_update_latest_layer;
4mod opentelemetry_middleware;
5mod server_time;
6
7use crate::model::AppState;
8use axum::Router;
9use axum::middleware::from_fn;
10use mcp_router_json::mcp_json_config_extract;
11use opentelemetry_middleware::opentelemetry_tracing_middleware;
12use server_time::ServerTimeLayer;
13use tower::ServiceBuilder;
14use tower_http::compression::CompressionLayer;
15
16pub use mcp_update_latest_layer::MySseRouterLayer;
17pub use opentelemetry_middleware::extract_trace_id;
18
19// pub use auth::{extract_user, verify_token};
20
21// pub trait TokenVerify {
22//     type Error: fmt::Debug;
23//     fn verify(&self, token: &str) -> Result<User, Self::Error>;
24// }
25
26const REQUEST_ID_HEADER: &str = "x-request-id";
27const SERVER_TIME_HEADER: &str = "x-server-time";
28
29pub fn set_layer(app: Router, state: AppState) -> Router {
30    app.layer(
31        ServiceBuilder::new()
32            // OpenTelemetry 追踪中间件 - 自动生成 trace_id 和 span
33            .layer(from_fn(opentelemetry_tracing_middleware))
34            // MCP 配置提取中间件
35            .layer(from_fn(mcp_json_config_extract))
36            // HTTP 压缩
37            .layer(CompressionLayer::new().gzip(true).br(true).deflate(true))
38            // 服务器时间响应头
39            .layer(ServerTimeLayer)
40            // SSE 路由层
41            .layer(MySseRouterLayer::new(state.clone())),
42    )
43}