feat(webapi): mount MCP routes and initialize MCP server in apphost
zhenyi committed
Modified app/apihost/src/main.rs app/apihost/src/main.rs +1 −1 View app/apihost/src/main.rs
@@ -60,7 +60,7 @@
6060 let listener = TcpListener::bind(addr).await?;
6161 info!(%addr, "webapi listening");
6262
63 serve(listener, router(services))
63 serve(listener, router(services).into_make_service_with_connect_info::<SocketAddr>())
6464 .with_graceful_shutdown(shutdown_signal())
6565 .await?;
6666 info!("apihost shut down cleanly");
Modified lib/webapi/Cargo.toml lib/webapi/Cargo.toml +1 −0 View lib/webapi/Cargo.toml
@@ -36,5 +36,6 @@
3636space = { workspace = true }
3737storage = { workspace = true }
3838user = { workspace = true }
39mcp = { path = "../mcp" }
3940utoipa-scalar.workspace = true
4041once_cell = "1.21.4"
No newline at end of file
Modified lib/webapi/router.rs lib/webapi/router.rs +2 −1 View lib/webapi/router.rs
@@ -16,7 +16,8 @@
1616 .merge(project::project_router(services.project))
1717 .merge(repo::repo_router(services.repo))
1818 .merge(space::space_router(services.space))
19 .merge(user::user_router(services.user)),
19 .merge(user::user_router(services.user))
20 .merge(mcp::mcp_router(services.mcp)),
2021 )
2122 .route("/api-docs", get(openapi::docs))
2223}
Modified lib/webapi/services.rs lib/webapi/services.rs +15 −0 View lib/webapi/services.rs
@@ -10,6 +10,7 @@
1010use issues::service::IssueService;
1111use jwt::JwtState;
1212use jwt::keys::SigningKeyCache;
13use mcp::McpService;
1314use project::service::ProjectService;
1415use queue::{Queue, QueueBuilder};
1516use repo::service::RepoService;
@@ -32,6 +33,8 @@
3233 Queue(#[from] queue::QueueError),
3334 #[error("storage: {0}")]
3435 Storage(#[from] storage::StorageError),
36 #[error("mcp: {0}")]
37 Mcp(#[from] mcp::McpError),
3538 #[error("email service is required (auth depends on it); enable email in config")]
3639 EmailRequired,
3740}
@@ -51,6 +54,7 @@
5154 pub repo: RepoService,
5255 pub space: SpaceService,
5356 pub user: UserService,
57 pub mcp: McpService,
5458}
5559
5660impl AppServices {
@@ -116,6 +120,16 @@
116120 let user = UserService::new(db.clone(), kv.clone(), jwt.clone(), storage.clone())
117121 .with_config(Arc::new(cfg.user.clone()));
118122
123 let mcp = McpService::new(
124 cfg.mcp.clone(),
125 db.clone(),
126 repo.clone(),
127 issues.clone(),
128 project.clone(),
129 space.clone(),
130 )?;
131 tracing::info!("mcp ready");
132
119133 tracing::info!("service stack ready");
120134
121135 Ok(Self {
@@ -131,6 +145,7 @@
131145 repo,
132146 space,
133147 user,
148 mcp,
134149 })
135150 }
136151}