@@ -106,8 +106,9 @@ func WithLogger(logger util.Logger) StreamableHTTPOption {
106
106
// - Batching of requests/notifications/responses in arrays.
107
107
// - Stream Resumability
108
108
type StreamableHTTPServer struct {
109
- server * MCPServer
110
- sessionTools * sessionToolsStore
109
+ server * MCPServer
110
+ sessionTools * sessionToolsStore
111
+ sessionRequestIDs sync.Map // sessionId --> last requestID(*atomic.Int64)
111
112
112
113
httpServer * http.Server
113
114
mu sync.RWMutex
@@ -394,7 +395,7 @@ func (s *StreamableHTTPServer) handleGet(w http.ResponseWriter, r *http.Request)
394
395
case <- ticker .C :
395
396
message := mcp.JSONRPCRequest {
396
397
JSONRPC : "2.0" ,
397
- ID : mcp .NewRequestId (session . requestID . Add ( 1 )),
398
+ ID : mcp .NewRequestId (s . nextRequestID ( sessionID )),
398
399
Request : mcp.Request {
399
400
Method : "ping" ,
400
401
},
@@ -448,6 +449,9 @@ func (s *StreamableHTTPServer) handleDelete(w http.ResponseWriter, r *http.Reque
448
449
// remove the session relateddata from the sessionToolsStore
449
450
s .sessionTools .set (sessionID , nil )
450
451
452
+ // remove current session's requstID information
453
+ s .sessionRequestIDs .Delete (sessionID )
454
+
451
455
w .WriteHeader (http .StatusOK )
452
456
}
453
457
@@ -479,6 +483,13 @@ func (s *StreamableHTTPServer) writeJSONRPCError(
479
483
}
480
484
}
481
485
486
+ // nextRequestID gets the next incrementing requestID for the current session
487
+ func (s * StreamableHTTPServer ) nextRequestID (sessionID string ) int64 {
488
+ actual , _ := s .sessionRequestIDs .LoadOrStore (sessionID , new (atomic.Int64 ))
489
+ counter := actual .(* atomic.Int64 )
490
+ return counter .Add (1 )
491
+ }
492
+
482
493
// --- session ---
483
494
484
495
type sessionToolsStore struct {
@@ -512,7 +523,6 @@ type streamableHttpSession struct {
512
523
notificationChannel chan mcp.JSONRPCNotification // server -> client notifications
513
524
tools * sessionToolsStore
514
525
upgradeToSSE atomic.Bool
515
- requestID atomic.Int64
516
526
}
517
527
518
528
func newStreamableHttpSession (sessionID string , toolStore * sessionToolsStore ) * streamableHttpSession {
0 commit comments