@@ -18,6 +18,7 @@ use rmcp::{
1818} ;
1919use serde_json:: Value ;
2020use tokio:: try_join;
21+ use tokio_util:: sync:: CancellationToken ;
2122use windmill_common:: db:: UserDB ;
2223use windmill_common:: worker:: to_raw_value;
2324use windmill_common:: { utils:: StripPath , DB } ;
@@ -47,7 +48,7 @@ use axum::{
4748 extract:: Path , http:: Request , middleware:: Next , response:: Response , routing:: get, Json , Router ,
4849} ;
4950use rmcp:: transport:: streamable_http_server:: {
50- session:: local:: LocalSessionManager , SessionManager , StreamableHttpService ,
51+ session:: local:: LocalSessionManager , StreamableHttpService ,
5152} ;
5253use windmill_common:: error:: JsonResult ;
5354
@@ -126,6 +127,7 @@ impl Runner {
126127 idempotent_hint : Some ( false ) , // Are not guaranteed to be idempotent
127128 open_world_hint : Some ( true ) , // Can interact with external services
128129 } ) ,
130+ meta : None ,
129131 } )
130132 }
131133}
@@ -471,7 +473,7 @@ impl ServerHandler for Runner {
471473 ) ;
472474 }
473475
474- Ok ( ListToolsResult { tools, next_cursor : None } )
476+ Ok ( ListToolsResult { tools, next_cursor : None , meta : None } )
475477 }
476478
477479 fn get_info ( & self ) -> ServerInfo {
@@ -498,7 +500,7 @@ impl ServerHandler for Runner {
498500 _request : Option < PaginatedRequestParam > ,
499501 _context : RequestContext < RoleServer > ,
500502 ) -> Result < ListResourcesResult , ErrorData > {
501- Ok ( ListResourcesResult { resources : vec ! [ ] , next_cursor : None } )
503+ Ok ( ListResourcesResult { resources : vec ! [ ] , next_cursor : None , meta : None } )
502504 }
503505
504506 async fn list_prompts (
@@ -530,11 +532,13 @@ pub async fn extract_and_store_workspace_id(
530532}
531533
532534/// Setup the MCP server with HTTP transport
533- pub async fn setup_mcp_server ( ) -> anyhow:: Result < ( Router , Arc < LocalSessionManager > ) > {
535+ pub async fn setup_mcp_server ( ) -> anyhow:: Result < ( Router , CancellationToken ) > {
536+ let cancellation_token = CancellationToken :: new ( ) ;
534537 let session_manager = Arc :: new ( LocalSessionManager :: default ( ) ) ;
535538 let service_config = StreamableHttpServerConfig {
536539 sse_keep_alive : Some ( Duration :: from_secs ( 15 ) ) ,
537540 stateful_mode : false ,
541+ cancellation_token : cancellation_token. clone ( ) ,
538542 } ;
539543 let service = StreamableHttpService :: new (
540544 || Ok ( Runner :: new ( ) ) ,
@@ -543,34 +547,7 @@ pub async fn setup_mcp_server() -> anyhow::Result<(Router, Arc<LocalSessionManag
543547 ) ;
544548
545549 let router = axum:: Router :: new ( ) . nest_service ( "/" , service) ;
546- Ok ( ( router, session_manager) )
547- }
548-
549- /// Shutdown the MCP server gracefully by closing all active sessions
550- pub async fn shutdown_mcp_server ( session_manager : Arc < LocalSessionManager > ) {
551- let session_ids_to_close = {
552- let sessions_map = session_manager. sessions . read ( ) . await ;
553- sessions_map. keys ( ) . cloned ( ) . collect :: < Vec < _ > > ( )
554- } ;
555-
556- if !session_ids_to_close. is_empty ( ) {
557- tracing:: info!(
558- "Closing {} active MCP session(s)..." ,
559- session_ids_to_close. len( )
560- ) ;
561- let close_futures = session_ids_to_close
562- . iter ( )
563- . map ( |session_id| {
564- let manager_clone = session_manager. clone ( ) ;
565- async move {
566- if let Err ( _) = manager_clone. close_session ( session_id) . await {
567- tracing:: warn!( "Error closing MCP session" ) ;
568- }
569- }
570- } )
571- . collect :: < Vec < _ > > ( ) ;
572- futures:: future:: join_all ( close_futures) . await ;
573- }
550+ Ok ( ( router, cancellation_token) )
574551}
575552
576553/// HTTP handler to list MCP tools as JSON
0 commit comments