@@ -268,16 +268,30 @@ final class MCPRouter: Sendable {
268268 return encodeError ( MCPError . internalError ( " Server not fully initialized " ) , id: id)
269269 }
270270
271+ let session = await server. session ( for: sessionId)
272+ let toolTask = Task {
273+ try await handler ( name, arguments, sessionId)
274+ }
275+ if let session {
276+ await session. addRunningTask ( id, task: Task { _ = try ? await toolTask. value } )
277+ }
278+
271279 do {
272- let toolResult = try await handler ( name, arguments, sessionId)
280+ let toolResult = try await toolTask. value
281+ if let session { _ = await session. removeRunningTask ( id) }
273282 let resultData = try encoder. encode ( toolResult)
274283 guard let resultValue = try ? decoder. decode ( JSONValue . self, from: resultData) else {
275284 return encodeError ( MCPError . internalError ( " Failed to encode tool result " ) , id: id)
276285 }
277286 return encodeRawResult ( resultValue, id: id, sessionId: sessionId)
287+ } catch is CancellationError {
288+ if let session { _ = await session. removeRunningTask ( id) }
289+ return encodeError ( MCPError . timeout ( " Request was cancelled " ) , id: id)
278290 } catch let mcpError as MCPError {
291+ if let session { _ = await session. removeRunningTask ( id) }
279292 return encodeError ( mcpError, id: id)
280293 } catch {
294+ if let session { _ = await session. removeRunningTask ( id) }
281295 return encodeError ( MCPError . internalError ( error. localizedDescription) , id: id)
282296 }
283297 }
@@ -651,8 +665,8 @@ extension MCPRouter {
651665 ] ) ,
652666 " format " : . object( [
653667 " type " : " string " ,
654- " description " : " Export format: csv, json, sql, or xlsx " ,
655- " enum " : . array( [ . string( " csv " ) , . string( " json " ) , . string( " sql " ) , . string ( " xlsx " ) ] )
668+ " description " : " Export format: csv, json, or sql " ,
669+ " enum " : . array( [ . string( " csv " ) , . string( " json " ) , . string( " sql " ) ] )
656670 ] ) ,
657671 " query " : . object( [
658672 " type " : " string " ,
0 commit comments