feat: implement MCP protocol version per transport support (#404)

- Add protocolVersion() method to transport and transport provider interfaces and implementations
- Replace hardcoded HTTP header strings with HttpHeaders constants
- Update protocol versions to be transport-specific rather than global
- Deprecate McpSchema.LATEST_PROTOCOL_VERSION in favor of transport-specific versions
- Standardize header names: MCP-Protocol-Version, mcp-session-id, last-event-id
- Update clients and servers to use transport.protocolVersion() for initialization
- Refactor tests to use transport-specific protocol versions
- Include MCP-Protocol-Version header in all GET/POST/DELETE requests
- Update WebClientStreamableHttpTransport, WebFluxSseClientTransport,
  HttpClientSseClientTransport, and HttpClientStreamableHttpTransport

Related to #398 , #363 , #250

Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
This commit is contained in:
Christian Tzolov 2025-07-30 23:54:28 +02:00 • committed by GitHub
commit 9d58621918
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 169 additions and 34 deletions

View file

@ -209,6 +209,11 @@ public class WebMvcSseServerTransportProvider implements McpServerTransportProvi
}
}
@Override
public String protocolVersion() {
return "2024-11-05";
}
@Override
public void setSessionFactory(McpServerSession.Factory sessionFactory) {
this.sessionFactory = sessionFactory;

View file

@ -147,6 +147,11 @@ public class WebMvcStreamableServerTransportProvider implements McpStreamableSer
}
}
@Override
public String protocolVersion() {
return "2025-03-26";
}
@Override
public void setSessionFactory(McpStreamableServerSession.Factory sessionFactory) {
this.sessionFactory = sessionFactory;

View file

@ -91,8 +91,15 @@ class WebMvcSseCustomContextPathTests {
@Bean
public WebMvcSseServerTransportProvider webMvcSseServerTransportProvider() {
return new WebMvcSseServerTransportProvider(new ObjectMapper(), CUSTOM_CONTEXT_PATH, MESSAGE_ENDPOINT,
WebMvcSseServerTransportProvider.DEFAULT_SSE_ENDPOINT);
return WebMvcSseServerTransportProvider.builder()
.objectMapper(new ObjectMapper())
.baseUrl(CUSTOM_CONTEXT_PATH)
.messageEndpoint(MESSAGE_ENDPOINT)
.sseEndpoint(WebMvcSseServerTransportProvider.DEFAULT_SSE_ENDPOINT)
.build();
// return new WebMvcSseServerTransportProvider(new ObjectMapper(),
// CUSTOM_CONTEXT_PATH, MESSAGE_ENDPOINT,
// WebMvcSseServerTransportProvider.DEFAULT_SSE_ENDPOINT);
}
@Bean