@@ -204,30 +204,34 @@ export class McpSessionDO extends DurableObject {
204204 } ;
205205 }
206206
207- private async loadSessionMeta ( ) : Promise < SessionMeta | null > {
208- if ( this . sessionMeta ) return this . sessionMeta ;
209- const stored = await this . ctx . storage . get < SessionMeta > ( SESSION_META_KEY ) ;
210- this . sessionMeta = stored ?? null ;
211- return this . sessionMeta ;
207+ private loadSessionMeta ( ) : Effect . Effect < SessionMeta | null > {
208+ return Effect . promise ( async ( ) => {
209+ if ( this . sessionMeta ) return this . sessionMeta ;
210+ const stored = await this . ctx . storage . get < SessionMeta > ( SESSION_META_KEY ) ;
211+ this . sessionMeta = stored ?? null ;
212+ return this . sessionMeta ;
213+ } ) . pipe ( Effect . withSpan ( "mcp.session.load_meta" ) ) ;
212214 }
213215
214216 private async saveSessionMeta ( sessionMeta : SessionMeta ) : Promise < void > {
215217 this . sessionMeta = sessionMeta ;
216218 await this . ctx . storage . put ( SESSION_META_KEY , sessionMeta ) ;
217219 }
218220
219- private async clearSessionState ( ) : Promise < void > {
220- this . sessionMeta = null ;
221- this . initialized = false ;
222- this . lastActivityMs = 0 ;
223-
224- await Promise . all ( [
225- this . ctx . storage . delete ( TRANSPORT_STATE_KEY ) . catch ( ( ) => false ) ,
226- this . ctx . storage . delete ( SESSION_META_KEY ) . catch ( ( ) => false ) ,
227- ] ) ;
221+ private clearSessionState ( ) : Effect . Effect < void > {
222+ return Effect . promise ( async ( ) => {
223+ this . sessionMeta = null ;
224+ this . initialized = false ;
225+ this . lastActivityMs = 0 ;
226+
227+ await Promise . all ( [
228+ this . ctx . storage . delete ( TRANSPORT_STATE_KEY ) . catch ( ( ) => false ) ,
229+ this . ctx . storage . delete ( SESSION_META_KEY ) . catch ( ( ) => false ) ,
230+ ] ) ;
231+ } ) . pipe ( Effect . withSpan ( "mcp.session.clear_state" ) ) ;
228232 }
229233
230- private createConnectedRuntimeEffect (
234+ private createConnectedRuntime (
231235 sessionMeta : SessionMeta ,
232236 options : { readonly dbHandle : DbHandle ; readonly enableJsonResponse ?: boolean } ,
233237 ) {
@@ -263,26 +267,28 @@ export class McpSessionDO extends DurableObject {
263267 ) ;
264268 }
265269
266- private resolveAndStoreSessionMetaEffect ( token : McpSessionInit ) {
270+ private resolveAndStoreSessionMeta ( token : McpSessionInit ) {
267271 const self = this ;
268272 return Effect . gen ( function * ( ) {
269273 const dbHandle = makeRequestScopedDb ( ) ;
270274 try {
271275 const sessionMeta = yield * resolveSessionMeta ( token . organizationId ) . pipe (
272276 Effect . provide ( makeResolveOrganizationServices ( dbHandle ) ) ,
273277 ) ;
274- yield * Effect . promise ( ( ) => self . saveSessionMeta ( sessionMeta ) ) ;
278+ yield * Effect . promise ( ( ) => self . saveSessionMeta ( sessionMeta ) ) . pipe (
279+ Effect . withSpan ( "mcp.session.save_meta" ) ,
280+ ) ;
275281 return sessionMeta ;
276282 } finally {
277283 yield * Effect . promise ( ( ) => dbHandle . end ( ) ) ;
278284 }
279- } ) ;
285+ } ) . pipe ( Effect . withSpan ( "mcp.session.resolve_and_store_meta" ) ) ;
280286 }
281287
282288 async init ( token : McpSessionInit , incoming ?: IncomingTraceHeaders ) : Promise < void > {
283289 if ( this . initialized ) return ;
284290 return Effect . runPromise (
285- this . doInitEffect ( token ) . pipe (
291+ this . doInit ( token ) . pipe (
286292 Effect . withSpan ( "McpSessionDO.init" , {
287293 attributes : { "mcp.auth.organization_id" : token . organizationId } ,
288294 } ) ,
@@ -292,7 +298,7 @@ export class McpSessionDO extends DurableObject {
292298 ) ;
293299 }
294300
295- private doInitEffect ( token : McpSessionInit ) {
301+ private doInit ( token : McpSessionInit ) {
296302 const self = this ;
297303 // Single Effect chain so every sub-span (resolveSessionMeta,
298304 // createRuntime, createScopedExecutor, createExecutorMcpServer,
@@ -302,7 +308,7 @@ export class McpSessionDO extends DurableObject {
302308 // each sub-span into its own root trace and made init opaque —
303309 // dashboard saw one 2.77s span with nothing under it.
304310 return Effect . gen ( function * ( ) {
305- const sessionMeta = yield * self . resolveAndStoreSessionMetaEffect ( token ) ;
311+ const sessionMeta = yield * self . resolveAndStoreSessionMeta ( token ) ;
306312
307313 if ( ! requestScopedRuntimeEnabled ) {
308314 self . dbHandle = makeLongLivedDb ( ) ;
@@ -313,7 +319,7 @@ export class McpSessionDO extends DurableObject {
313319 // POSTs the callback fires after `Effect.ensuring` clears the field
314320 // and engine spans orphan into new root traces. GET still streams
315321 // (the GET handler doesn't consult `enableJsonResponse`).
316- const runtime = yield * self . createConnectedRuntimeEffect ( sessionMeta , {
322+ const runtime = yield * self . createConnectedRuntime ( sessionMeta , {
317323 dbHandle : self . dbHandle ,
318324 enableJsonResponse : true ,
319325 } ) ;
@@ -343,10 +349,10 @@ export class McpSessionDO extends DurableObject {
343349 ) ;
344350 }
345351
346- private handleRequestWithRequestScopedRuntimeEffect ( request : Request ) {
352+ private handleRequestWithRequestScopedRuntime ( request : Request ) {
347353 const self = this ;
348354 return Effect . gen ( function * ( ) {
349- const sessionMeta = yield * Effect . promise ( ( ) => self . loadSessionMeta ( ) ) ;
355+ const sessionMeta = yield * self . loadSessionMeta ( ) ;
350356 if ( ! sessionMeta ) {
351357 return jsonRpcError ( 404 , - 32001 , "Session timed out due to inactivity — please reconnect" ) ;
352358 }
@@ -355,30 +361,48 @@ export class McpSessionDO extends DurableObject {
355361 self . lastActivityMs = Date . now ( ) ;
356362
357363 const dbHandle = makeRequestScopedDb ( ) ;
358- const cleanupDb = Effect . promise ( ( ) => dbHandle . end ( ) ) ;
364+ const cleanupDb = Effect . promise ( ( ) => dbHandle . end ( ) ) . pipe (
365+ Effect . withSpan ( "mcp.session.db.close" ) ,
366+ ) ;
359367 return yield * Effect . acquireUseRelease (
360- self . createConnectedRuntimeEffect ( sessionMeta , {
368+ self . createConnectedRuntime ( sessionMeta , {
361369 dbHandle,
362370 enableJsonResponse : request . method !== "GET" ,
363371 } ) ,
364372 ( { transport } ) =>
365373 Effect . gen ( function * ( ) {
366374 const response = yield * Effect . promise ( ( ) => transport . handleRequest ( request ) ) . pipe (
367- Effect . withSpan ( "McpSessionDO.transport.handleRequest" ) ,
375+ Effect . withSpan ( "McpSessionDO.transport.handleRequest" , {
376+ attributes : {
377+ "mcp.request.method" : request . method ,
378+ "mcp.request.content_type" :
379+ request . headers . get ( "content-type" ) ?? "" ,
380+ "mcp.request.content_length" :
381+ request . headers . get ( "content-length" ) ?? "" ,
382+ } ,
383+ } ) ,
368384 ) ;
385+ yield * Effect . annotateCurrentSpan ( {
386+ "mcp.response.status_code" : response . status ,
387+ } ) ;
369388 if ( request . method === "DELETE" ) {
370- yield * Effect . promise ( ( ) => self . clearSessionState ( ) ) ;
389+ yield * self . clearSessionState ( ) ;
371390 }
372391 return response ;
373392 } ) ,
374393 ( { mcpServer, transport } ) =>
375394 Effect . gen ( function * ( ) {
376- yield * Effect . promise ( ( ) => transport . close ( ) . catch ( ( ) => undefined ) ) ;
377- yield * Effect . promise ( ( ) => mcpServer . close ( ) . catch ( ( ) => undefined ) ) ;
395+ yield * Effect . promise ( ( ) => transport . close ( ) . catch ( ( ) => undefined ) ) . pipe (
396+ Effect . withSpan ( "mcp.session.transport.close" ) ,
397+ ) ;
398+ yield * Effect . promise ( ( ) => mcpServer . close ( ) . catch ( ( ) => undefined ) ) . pipe (
399+ Effect . withSpan ( "mcp.session.server.close" ) ,
400+ ) ;
378401 yield * cleanupDb ;
379- } ) ,
402+ } ) . pipe ( Effect . withSpan ( "mcp.session.runtime.release" ) ) ,
380403 ) ;
381404 } ) . pipe (
405+ Effect . withSpan ( "mcp.session.request_scoped_runtime" ) ,
382406 Effect . catchAllCause ( ( cause ) =>
383407 Effect . sync ( ( ) => {
384408 console . error ( "[mcp-session] request-scoped handleRequest error:" , cause ) ;
@@ -410,7 +434,7 @@ export class McpSessionDO extends DurableObject {
410434 const span = yield * Effect . currentSpan ;
411435 self . currentRequestSpan = span ;
412436
413- return yield * self . dispatchRequestEffect ( request ) . pipe (
437+ return yield * self . dispatchRequest ( request ) . pipe (
414438 Effect . tap ( ( response ) =>
415439 Effect . annotateCurrentSpan ( {
416440 "mcp.response.status_code" : response . status ,
@@ -435,9 +459,9 @@ export class McpSessionDO extends DurableObject {
435459 return Effect . runPromise ( program ) ;
436460 }
437461
438- private dispatchRequestEffect ( request : Request ) : Effect . Effect < Response > {
462+ private dispatchRequest ( request : Request ) : Effect . Effect < Response > {
439463 if ( requestScopedRuntimeEnabled ) {
440- return this . handleRequestWithRequestScopedRuntimeEffect ( request ) ;
464+ return this . handleRequestWithRequestScopedRuntime ( request ) ;
441465 }
442466
443467 if ( ! this . initialized || ! this . transport ) {
@@ -451,10 +475,23 @@ export class McpSessionDO extends DurableObject {
451475 const self = this ;
452476 return Effect . gen ( function * ( ) {
453477 const response = yield * Effect . promise ( ( ) => transport . handleRequest ( request ) ) . pipe (
454- Effect . withSpan ( "McpSessionDO.transport.handleRequest" ) ,
478+ Effect . withSpan ( "McpSessionDO.transport.handleRequest" , {
479+ attributes : {
480+ "mcp.request.method" : request . method ,
481+ "mcp.request.content_type" :
482+ request . headers . get ( "content-type" ) ?? "" ,
483+ "mcp.request.content_length" :
484+ request . headers . get ( "content-length" ) ?? "" ,
485+ } ,
486+ } ) ,
455487 ) ;
488+ yield * Effect . annotateCurrentSpan ( {
489+ "mcp.response.status_code" : response . status ,
490+ } ) ;
456491 if ( request . method === "DELETE" ) {
457- yield * Effect . promise ( ( ) => self . cleanup ( ) ) ;
492+ yield * Effect . promise ( ( ) => self . cleanup ( ) ) . pipe (
493+ Effect . withSpan ( "mcp.session.cleanup" ) ,
494+ ) ;
458495 }
459496 return response ;
460497 } ) . pipe (
@@ -498,6 +535,6 @@ export class McpSessionDO extends DurableObject {
498535 await this . dbHandle . end ( ) ;
499536 this . dbHandle = null ;
500537 }
501- await this . clearSessionState ( ) ;
538+ await Effect . runPromise ( this . clearSessionState ( ) ) ;
502539 }
503540}
0 commit comments