Skip to content

Add protocol version negotiation to server initialization#223

Open
duboff wants to merge 1 commit intomodelcontextprotocol:mainfrom
chattermill:md-protocol-negotiation
Open

Add protocol version negotiation to server initialization#223
duboff wants to merge 1 commit intomodelcontextprotocol:mainfrom
chattermill:md-protocol-negotiation

Conversation

@duboff
Copy link
Contributor

@duboff duboff commented Feb 1, 2026

Motivation and Context

Currently server launched enforces the latest protocol regardless of the protocols supported by the client. This leads to issues when a client (eg. Claude Desktop) supports only protocol versions (2025-06-18) behind the current version supported by the server (2025-11-25).

This PR adds full protocol version negotiation logic (as per the MCP Spec), including dropping parameters not supported by each individual protocol version, to maximize compatibility.

How Has This Been Tested?

Tested with the Chattermill MCP (proprietary).

Breaking Changes

No breaking changes expected.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

A potential consideration could be to add a config option to enumerate supported protocols if the server developer wants to explicitly avoid supporting all possible protocols. Not implemented here as doesn't seem necessary.

@duboff duboff force-pushed the md-protocol-negotiation branch from 92a0880 to 3c3f0d5 Compare February 1, 2026 14:49
@duboff duboff marked this pull request as ready for review February 1, 2026 14:59
@duboff duboff force-pushed the md-protocol-negotiation branch from 3c3f0d5 to 1c14f65 Compare February 1, 2026 15:00
atesgoral
atesgoral previously approved these changes Feb 4, 2026
Copy link
Contributor

@atesgoral atesgoral left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for doing this!

@duboff duboff force-pushed the md-protocol-negotiation branch 2 times, most recently from 211753e to 8d1ac82 Compare February 4, 2026 20:10
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@duboff duboff force-pushed the md-protocol-negotiation branch from 8d1ac82 to 8ad04db Compare February 4, 2026 20:50
@koic
Copy link
Member

koic commented Feb 5, 2026

Thanks! Can you rebase on the latest main branch and resolve the conflicts?


info = server_info
info = info.reject { |key| [:description, :icons].include?(key) } if negotiated_version <= "2025-06-18"
info = info.reject { |key| [:title, :websiteUrl].include?(key) } if negotiated_version <= "2025-03-26"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The filtering loop logic seems a bit redundant, and the terminology could be clearer. Can you update it?

diff --git a/lib/mcp/server.rb b/lib/mcp/server.rb
index af3ea15..03628bb 100644
--- a/lib/mcp/server.rb
+++ b/lib/mcp/server.rb
@@ -18,6 +18,9 @@ module MCP
   class Server
     DEFAULT_VERSION = "0.1.0"
 
+    UNSUPPORTED_PROPERTIES_UNTIL_2025_06_18 = [:description, :icons].freeze
+    UNSUPPORTED_PROPERTIES_UNTIL_2025_03_26 = [:title, :websiteUrl].freeze
+
     class RequestHandlerError < StandardError
       attr_reader :error_type
       attr_reader :original_error
@@ -321,9 +324,10 @@ module MCP
         configuration.protocol_version
       end
 
-      info = server_info
-      info = info.reject { |key| [:description, :icons].include?(key) } if negotiated_version <= "2025-06-18"
-      info = info.reject { |key| [:title, :websiteUrl].include?(key) } if negotiated_version <= "2025-03-26"
+      info = server_info.reject do |property|
+        negotiated_version <= "2025-06-18" && UNSUPPORTED_PROPERTIES_UNTIL_2025_06_18.include?(property) ||
+          negotiated_version <= "2025-03-26" && UNSUPPORTED_PROPERTIES_UNTIL_2025_03_26.include?(property)
+      end
 
       response_instructions = instructions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants