@@ -115,8 +115,9 @@ func WithLogger(logger util.Logger) StreamableHTTPOption {
115
115
// - Batching of requests/notifications/responses in arrays.
116
116
// - Stream Resumability
117
117
type StreamableHTTPServer struct {
118
- server * MCPServer
119
- sessionTools * sessionToolsStore
118
+ server * MCPServer
119
+ sessionTools * sessionToolsStore
120
+ sessionRequestIDs sync.Map // sessionId --> last requestID(*atomic.Int64)
120
121
121
122
httpServer * http.Server
122
123
mu sync.RWMutex
@@ -407,15 +408,16 @@ func (s *StreamableHTTPServer) handleGet(w http.ResponseWriter, r *http.Request)
407
408
go func () {
408
409
ticker := time .NewTicker (s .listenHeartbeatInterval )
409
410
defer ticker .Stop ()
410
- message := mcp.JSONRPCRequest {
411
- JSONRPC : "2.0" ,
412
- Request : mcp.Request {
413
- Method : "ping" ,
414
- },
415
- }
416
411
for {
417
412
select {
418
413
case <- ticker .C :
414
+ message := mcp.JSONRPCRequest {
415
+ JSONRPC : "2.0" ,
416
+ ID : mcp .NewRequestId (s .nextRequestID (sessionID )),
417
+ Request : mcp.Request {
418
+ Method : "ping" ,
419
+ },
420
+ }
419
421
select {
420
422
case writeChan <- message :
421
423
case <- done :
@@ -465,6 +467,9 @@ func (s *StreamableHTTPServer) handleDelete(w http.ResponseWriter, r *http.Reque
465
467
// remove the session relateddata from the sessionToolsStore
466
468
s .sessionTools .set (sessionID , nil )
467
469
470
+ // remove current session's requstID information
471
+ s .sessionRequestIDs .Delete (sessionID )
472
+
468
473
w .WriteHeader (http .StatusOK )
469
474
}
470
475
@@ -496,6 +501,13 @@ func (s *StreamableHTTPServer) writeJSONRPCError(
496
501
}
497
502
}
498
503
504
+ // nextRequestID gets the next incrementing requestID for the current session
505
+ func (s * StreamableHTTPServer ) nextRequestID (sessionID string ) int64 {
506
+ actual , _ := s .sessionRequestIDs .LoadOrStore (sessionID , new (atomic.Int64 ))
507
+ counter := actual .(* atomic.Int64 )
508
+ return counter .Add (1 )
509
+ }
510
+
499
511
// --- session ---
500
512
501
513
type sessionToolsStore struct {
0 commit comments