From 6ccbc7d2c0e53fe89d6e5308975c9a883713a5f9 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Tue, 27 Jan 2026 00:59:53 -0600 Subject: [PATCH] fix: implement MCP protocol version negotiation Claude Desktop requests protocol version 2025-06-18 but Vestige was responding with 2025-11-25, causing Claude Desktop to disconnect. Now the server negotiates: if the client requests an older version, use it. This maintains backward compatibility with older clients. Fixes: Claude Desktop "Server transport closed unexpectedly" error Co-Authored-By: Claude Opus 4.5 --- crates/vestige-mcp/src/server.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/vestige-mcp/src/server.rs b/crates/vestige-mcp/src/server.rs index e09537f..ce35900 100644 --- a/crates/vestige-mcp/src/server.rs +++ b/crates/vestige-mcp/src/server.rs @@ -73,16 +73,25 @@ impl McpServer { &mut self, params: Option, ) -> Result { - let _request: InitializeRequest = match params { + let request: InitializeRequest = match params { Some(p) => serde_json::from_value(p).map_err(|e| JsonRpcError::invalid_params(&e.to_string()))?, None => InitializeRequest::default(), }; + // Version negotiation: use client's version if older than server's + // Claude Desktop rejects servers with newer protocol versions + let negotiated_version = if request.protocol_version < MCP_VERSION.to_string() { + info!("Client requested older protocol version {}, using it", request.protocol_version); + request.protocol_version.clone() + } else { + MCP_VERSION.to_string() + }; + self.initialized = true; - info!("MCP session initialized"); + info!("MCP session initialized with protocol version {}", negotiated_version); let result = InitializeResult { - protocol_version: MCP_VERSION.to_string(), + protocol_version: negotiated_version, server_info: ServerInfo { name: "vestige".to_string(), version: env!("CARGO_PKG_VERSION").to_string(),