77require_relative "methods"
88require_relative "logging_message_notification"
99require_relative "progress"
10+ require_relative "protocol_deprecations"
1011require_relative "server_context"
1112require_relative "server/capabilities"
1213require_relative "server/pagination"
@@ -140,6 +141,7 @@ def initialize(
140141 self . page_size = page_size
141142 @configuration = MCP . configuration . merge ( configuration )
142143 @client = nil
144+ @client_protocol_version = nil
143145
144146 validate!
145147
@@ -256,10 +258,15 @@ def notify_resources_list_changed
256258 report_exception ( e , { notification : "resources_list_changed" } )
257259 end
258260
261+ # @deprecated MCP Logging (`logging/setLevel` and `notifications/message`)
262+ # is deprecated as of MCP protocol version 2026-07-28 (SEP-2577).
263+ # Use stderr or OpenTelemetry instead.
259264 def notify_log_message ( data :, level :, logger : nil )
260265 return unless @transport
261266 return unless logging_message_notification &.should_notify? ( level )
262267
268+ warn_if_deprecated_protocol_feature ( :logging , uplevel : 1 )
269+
263270 params = { "data" => data , "level" => level }
264271 params [ "logger" ] = logger if logger
265272
@@ -272,7 +279,13 @@ def notify_log_message(data:, level:, logger: nil)
272279 # Called when a client notifies the server that its filesystem roots have changed.
273280 #
274281 # @yield [params] The notification params (typically `nil`).
282+ # @deprecated MCP Roots (`roots/list` and
283+ # `notifications/roots/list_changed`) is deprecated as of MCP protocol
284+ # version 2026-07-28 (SEP-2577). Use tool parameters, resource URIs,
285+ # server configuration, or environment variables instead.
275286 def roots_list_changed_handler ( &block )
287+ warn_if_deprecated_protocol_feature ( :roots , uplevel : 1 )
288+
276289 @handlers [ Methods ::NOTIFICATIONS_ROOTS_LIST_CHANGED ] = block
277290 end
278291
@@ -454,6 +467,8 @@ def handle_request(request, method, session: nil, related_request_id: nil)
454467 server_context : { request : request } ,
455468 exception_already_reported : -> ( e ) { reported_exception . equal? ( e ) } ,
456469 ) do
470+ warn_if_deprecated_protocol_feature ( :roots , session : session , uplevel : 2 ) if method == Methods ::NOTIFICATIONS_ROOTS_LIST_CHANGED
471+
457472 result = case method
458473 when Methods ::INITIALIZE
459474 init ( params , session : session )
@@ -568,7 +583,11 @@ def init(params, session: nil)
568583 response_instructions = nil
569584 end
570585
571- session &.mark_initialized!
586+ if session
587+ session . mark_initialized! ( protocol_version : negotiated_version )
588+ else
589+ @client_protocol_version = negotiated_version
590+ end
572591
573592 {
574593 protocolVersion : negotiated_version ,
@@ -583,6 +602,8 @@ def configure_logging_level(request, session: nil)
583602 raise RequestHandlerError . new ( "Server does not support logging" , request , error_type : :internal_error )
584603 end
585604
605+ warn_if_deprecated_protocol_feature ( :logging , session : session , uplevel : 2 )
606+
586607 logging_message_notification = LoggingMessageNotification . new ( level : request [ :level ] )
587608 unless logging_message_notification . valid_level?
588609 raise RequestHandlerError . new ( "Invalid log level #{ request [ :level ] } " , request , error_type : :invalid_params )
@@ -594,6 +615,19 @@ def configure_logging_level(request, session: nil)
594615 { }
595616 end
596617
618+ def warn_if_deprecated_protocol_feature ( feature , session : nil , uplevel : 1 )
619+ protocol_version = effective_deprecation_protocol_version ( session )
620+ MCP ::ProtocolDeprecations . warn_for ( feature , protocol_version : protocol_version , uplevel : uplevel )
621+ end
622+
623+ def effective_deprecation_protocol_version ( session )
624+ session &.protocol_version || @client_protocol_version || explicit_protocol_version
625+ end
626+
627+ def explicit_protocol_version
628+ configuration . protocol_version if configuration . protocol_version?
629+ end
630+
597631 def list_tools ( request )
598632 page = paginate ( @tools . values , cursor : cursor_from ( request ) , page_size : @page_size , request : request , &:to_h )
599633
0 commit comments