77require_relative "methods"
88require_relative "logging_message_notification"
99require_relative "progress"
10+ require_relative "protocol_deprecations"
1011require_relative "server_context"
1112require_relative "server/pagination"
1213require_relative "server/transports"
@@ -139,6 +140,7 @@ def initialize(
139140 self . page_size = page_size
140141 @configuration = MCP . configuration . merge ( configuration )
141142 @client = nil
143+ @client_protocol_version = nil
142144
143145 validate!
144146
@@ -250,10 +252,15 @@ def notify_resources_list_changed
250252 report_exception ( e , { notification : "resources_list_changed" } )
251253 end
252254
255+ # @deprecated MCP Logging (`logging/setLevel` and `notifications/message`)
256+ # is deprecated as of MCP protocol version 2026-07-28 (SEP-2577).
257+ # Use stderr or OpenTelemetry instead.
253258 def notify_log_message ( data :, level :, logger : nil )
254259 return unless @transport
255260 return unless logging_message_notification &.should_notify? ( level )
256261
262+ warn_if_deprecated_protocol_feature ( :logging , uplevel : 1 )
263+
257264 params = { "data" => data , "level" => level }
258265 params [ "logger" ] = logger if logger
259266
@@ -266,7 +273,13 @@ def notify_log_message(data:, level:, logger: nil)
266273 # Called when a client notifies the server that its filesystem roots have changed.
267274 #
268275 # @yield [params] The notification params (typically `nil`).
276+ # @deprecated MCP Roots (`roots/list` and
277+ # `notifications/roots/list_changed`) is deprecated as of MCP protocol
278+ # version 2026-07-28 (SEP-2577). Use tool parameters, resource URIs,
279+ # server configuration, or environment variables instead.
269280 def roots_list_changed_handler ( &block )
281+ warn_if_deprecated_protocol_feature ( :roots , uplevel : 1 )
282+
270283 @handlers [ Methods ::NOTIFICATIONS_ROOTS_LIST_CHANGED ] = block
271284 end
272285
@@ -448,6 +461,8 @@ def handle_request(request, method, session: nil, related_request_id: nil)
448461 server_context : { request : request } ,
449462 exception_already_reported : -> ( e ) { reported_exception . equal? ( e ) } ,
450463 ) do
464+ warn_if_deprecated_protocol_feature ( :roots , session : session , uplevel : 2 ) if method == Methods ::NOTIFICATIONS_ROOTS_LIST_CHANGED
465+
451466 result = case method
452467 when Methods ::INITIALIZE
453468 init ( params , session : session )
@@ -562,7 +577,11 @@ def init(params, session: nil)
562577 response_instructions = nil
563578 end
564579
565- session &.mark_initialized!
580+ if session
581+ session . mark_initialized! ( protocol_version : negotiated_version )
582+ else
583+ @client_protocol_version = negotiated_version
584+ end
566585
567586 {
568587 protocolVersion : negotiated_version ,
@@ -577,6 +596,8 @@ def configure_logging_level(request, session: nil)
577596 raise RequestHandlerError . new ( "Server does not support logging" , request , error_type : :internal_error )
578597 end
579598
599+ warn_if_deprecated_protocol_feature ( :logging , session : session , uplevel : 2 )
600+
580601 logging_message_notification = LoggingMessageNotification . new ( level : request [ :level ] )
581602 unless logging_message_notification . valid_level?
582603 raise RequestHandlerError . new ( "Invalid log level #{ request [ :level ] } " , request , error_type : :invalid_params )
@@ -588,6 +609,19 @@ def configure_logging_level(request, session: nil)
588609 { }
589610 end
590611
612+ def warn_if_deprecated_protocol_feature ( feature , session : nil , uplevel : 1 )
613+ protocol_version = effective_deprecation_protocol_version ( session )
614+ MCP ::ProtocolDeprecations . warn_for ( feature , protocol_version : protocol_version , uplevel : uplevel )
615+ end
616+
617+ def effective_deprecation_protocol_version ( session )
618+ session &.protocol_version || @client_protocol_version || explicit_protocol_version
619+ end
620+
621+ def explicit_protocol_version
622+ configuration . protocol_version if configuration . protocol_version?
623+ end
624+
591625 def list_tools ( request )
592626 page = paginate ( @tools . values , cursor : cursor_from ( request ) , page_size : @page_size , request : request , &:to_h )
593627
0 commit comments