@@ -36,9 +36,8 @@ const DefaultPageSize = 1000
3636// sessions by using [Server.Run].
3737type Server struct {
3838 // fixed at creation
39- impl * Implementation
40- opts ServerOptions
41- logger * slog.Logger
39+ impl * Implementation
40+ opts ServerOptions
4241
4342 mu sync.Mutex
4443 prompts * featureSet [* serverPrompt ]
@@ -55,7 +54,7 @@ type Server struct {
5554type ServerOptions struct {
5655 // Optional instructions for connected clients.
5756 Instructions string
58- // Logger is used for server-side logging. If nil, disable logging .
57+ // If non- nil, log server activity .
5958 Logger * slog.Logger
6059 // If non-nil, called when "notifications/initialized" is received.
6160 InitializedHandler func (context.Context , * InitializedRequest )
@@ -136,7 +135,6 @@ func NewServer(impl *Implementation, options *ServerOptions) *Server {
136135 return & Server {
137136 impl : impl ,
138137 opts : opts ,
139- logger : ensureLogger (opts .Logger ),
140138 prompts : newFeatureSet (func (p * serverPrompt ) string { return p .prompt .Name }),
141139 tools : newFeatureSet (func (t * serverTool ) string { return t .tool .Name }),
142140 resources : newFeatureSet (func (r * serverResource ) string { return r .resource .URI }),
@@ -664,7 +662,7 @@ func (s *Server) ResourceUpdated(ctx context.Context, params *ResourceUpdatedNot
664662 sessions := slices .Collect (maps .Keys (subscribedSessions ))
665663 s .mu .Unlock ()
666664 notifySessions (sessions , notificationResourceUpdated , params )
667- s .logger .Info ("resource updated notification sent" , "uri" , params .URI , "subscriber_count" , len (sessions ))
665+ s .opts . Logger .Info ("resource updated notification sent" , "uri" , params .URI , "subscriber_count" , len (sessions ))
668666 return nil
669667}
670668
@@ -682,7 +680,7 @@ func (s *Server) subscribe(ctx context.Context, req *SubscribeRequest) (*emptyRe
682680 s .resourceSubscriptions [req .Params .URI ] = make (map [* ServerSession ]bool )
683681 }
684682 s .resourceSubscriptions [req .Params .URI ][req .Session ] = true
685- s .logger .Info ("resource subscribed" , "uri" , req .Params .URI , "session_id" , req .Session .ID ())
683+ s .opts . Logger .Info ("resource subscribed" , "uri" , req .Params .URI , "session_id" , req .Session .ID ())
686684
687685 return & emptyResult {}, nil
688686}
@@ -704,7 +702,7 @@ func (s *Server) unsubscribe(ctx context.Context, req *UnsubscribeRequest) (*emp
704702 delete (s .resourceSubscriptions , req .Params .URI )
705703 }
706704 }
707- s .logger .Info ("resource unsubscribed" , "uri" , req .Params .URI , "session_id" , req .Session .ID ())
705+ s .opts . Logger .Info ("resource unsubscribed" , "uri" , req .Params .URI , "session_id" , req .Session .ID ())
708706
709707 return & emptyResult {}, nil
710708}
@@ -723,10 +721,10 @@ func (s *Server) unsubscribe(ctx context.Context, req *UnsubscribeRequest) (*emp
723721// It need not be called on servers that are used for multiple concurrent connections,
724722// as with [StreamableHTTPHandler].
725723func (s * Server ) Run (ctx context.Context , t Transport ) error {
726- s .logger .Info ("server run start" )
724+ s .opts . Logger .Info ("server run start" )
727725 ss , err := s .Connect (ctx , t , nil )
728726 if err != nil {
729- s .logger .Error ("server connect failed" , "error" , err )
727+ s .opts . Logger .Error ("server connect failed" , "error" , err )
730728 return err
731729 }
732730
@@ -738,13 +736,13 @@ func (s *Server) Run(ctx context.Context, t Transport) error {
738736 select {
739737 case <- ctx .Done ():
740738 ss .Close ()
741- s .logger . Info ("server run cancelled" , "error" , ctx .Err ())
739+ s .opts . Logger . Error ("server run cancelled" , "error" , ctx .Err ())
742740 return ctx .Err ()
743741 case err := <- ssClosed :
744742 if err != nil {
745- s .logger .Error ("server session ended with error" , "error" , err )
743+ s .opts . Logger .Error ("server session ended with error" , "error" , err )
746744 } else {
747- s .logger .Info ("server session ended" )
745+ s .opts . Logger .Info ("server session ended" )
748746 }
749747 return err
750748 }
@@ -761,7 +759,7 @@ func (s *Server) bind(mcpConn Connection, conn *jsonrpc2.Connection, state *Serv
761759 s .mu .Lock ()
762760 s .sessions = append (s .sessions , ss )
763761 s .mu .Unlock ()
764- s .logger .Info ("server session connected" , "session_id" , ss .ID ())
762+ s .opts . Logger .Info ("server session connected" , "session_id" , ss .ID ())
765763 return ss
766764}
767765
@@ -777,7 +775,7 @@ func (s *Server) disconnect(cc *ServerSession) {
777775 for _ , subscribedSessions := range s .resourceSubscriptions {
778776 delete (subscribedSessions , cc )
779777 }
780- s .logger .Info ("server session disconnected" , "session_id" , cc .ID ())
778+ s .opts . Logger .Info ("server session disconnected" , "session_id" , cc .ID ())
781779}
782780
783781// ServerSessionOptions configures the server session.
@@ -803,10 +801,10 @@ func (s *Server) Connect(ctx context.Context, t Transport, opts *ServerSessionOp
803801 onClose = opts .onClose
804802 }
805803
806- s .logger .Info ("server connecting" )
804+ s .opts . Logger .Info ("server connecting" )
807805 ss , err := connect (ctx , t , s , state , onClose )
808806 if err != nil {
809- s .logger .Error ("server connect error" , "error" , err )
807+ s .opts . Logger .Error ("server connect error" , "error" , err )
810808 return nil , err
811809 }
812810 return ss , nil
@@ -829,11 +827,11 @@ func (ss *ServerSession) initialized(ctx context.Context, params *InitializedPar
829827 })
830828
831829 if ! wasInit {
832- ss .server .logger . Warn ("initialized before initialize" )
830+ ss .server .opts . Logger . Error ("initialized before initialize" )
833831 return nil , fmt .Errorf ("%q before %q" , notificationInitialized , methodInitialize )
834832 }
835833 if wasInitd {
836- ss .server .logger . Warn ("duplicate initialized notification" )
834+ ss .server .opts . Logger . Error ("duplicate initialized notification" )
837835 return nil , fmt .Errorf ("duplicate %q received" , notificationInitialized )
838836 }
839837 if ss .server .opts .KeepAlive > 0 {
@@ -842,7 +840,7 @@ func (ss *ServerSession) initialized(ctx context.Context, params *InitializedPar
842840 if h := ss .server .opts .InitializedHandler ; h != nil {
843841 h (ctx , serverRequestFor (ss , params ))
844842 }
845- ss .server .logger .Info ("session initialized" )
843+ ss .server .opts . Logger .Info ("session initialized" )
846844 return nil , nil
847845}
848846
@@ -1080,7 +1078,7 @@ func (ss *ServerSession) handle(ctx context.Context, req *jsonrpc.Request) (any,
10801078 case methodInitialize , methodPing , notificationInitialized :
10811079 default :
10821080 if ! initialized {
1083- ss .server .logger . Warn ("method invalid during initialization" , "method" , req .Method )
1081+ ss .server .opts . Logger . Error ("method invalid during initialization" , "method" , req .Method )
10841082 return nil , fmt .Errorf ("method %q is invalid during session initialization" , req .Method )
10851083 }
10861084 }
@@ -1137,7 +1135,7 @@ func (ss *ServerSession) setLevel(_ context.Context, params *SetLoggingLevelPara
11371135 ss .updateState (func (state * ServerSessionState ) {
11381136 state .LogLevel = params .Level
11391137 })
1140- ss .server .logger .Info ("client log level set" , "level" , params .Level )
1138+ ss .server .opts . Logger .Info ("client log level set" , "level" , params .Level )
11411139 return & emptyResult {}, nil
11421140}
11431141
0 commit comments