Skip to content

Commit c274c8f

Browse files
author
userjyx
committed
fix: preserve caller-provided server capabilities
1 parent 8ee8ccb commit c274c8f

3 files changed

Lines changed: 67 additions & 3 deletions

File tree

mcp-core/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public class McpAsyncServer {
136136
this.mcpTransportProvider = mcpTransportProvider;
137137
this.jsonMapper = jsonMapper;
138138
this.serverInfo = features.serverInfo();
139-
this.serverCapabilities = features.serverCapabilities().mutate().logging().build();
139+
this.serverCapabilities = features.serverCapabilities();
140140
this.instructions = features.instructions();
141141
this.tools.addAll(withStructuredOutputHandling(jsonSchemaValidator, features.tools()));
142142
this.resources.putAll(features.resources());
@@ -167,7 +167,7 @@ public class McpAsyncServer {
167167
this.mcpTransportProvider = mcpTransportProvider;
168168
this.jsonMapper = jsonMapper;
169169
this.serverInfo = features.serverInfo();
170-
this.serverCapabilities = features.serverCapabilities().mutate().logging().build();
170+
this.serverCapabilities = features.serverCapabilities();
171171
this.instructions = features.instructions();
172172
this.tools.addAll(withStructuredOutputHandling(jsonSchemaValidator, features.tools()));
173173
this.resources.putAll(features.resources());
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright 2024-2026 the original author or authors.
3+
*/
4+
5+
package io.modelcontextprotocol.server;
6+
7+
import io.modelcontextprotocol.json.McpJsonMapper;
8+
import io.modelcontextprotocol.json.schema.JsonSchemaValidator;
9+
import io.modelcontextprotocol.spec.McpSchema;
10+
import io.modelcontextprotocol.spec.McpServerTransportProvider;
11+
import io.modelcontextprotocol.spec.McpStreamableServerTransportProvider;
12+
import org.junit.jupiter.api.Test;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
import static org.mockito.Mockito.mock;
16+
17+
class McpAsyncServerCapabilitiesTests {
18+
19+
@Test
20+
void standardTransportPreservesCallerProvidedCapabilities() {
21+
McpServerTransportProvider transportProvider = mock(McpServerTransportProvider.class);
22+
McpSchema.ServerCapabilities capabilities = McpSchema.ServerCapabilities.builder().tools(true).build();
23+
24+
McpAsyncServer server = McpServer.async(transportProvider)
25+
.jsonMapper(mock(McpJsonMapper.class))
26+
.jsonSchemaValidator(mock(JsonSchemaValidator.class))
27+
.capabilities(capabilities)
28+
.build();
29+
30+
assertThat(server.getServerCapabilities()).isEqualTo(capabilities);
31+
assertThat(server.getServerCapabilities().logging()).isNull();
32+
}
33+
34+
@Test
35+
void streamableTransportPreservesCallerProvidedCapabilities() {
36+
McpStreamableServerTransportProvider transportProvider = mock(McpStreamableServerTransportProvider.class);
37+
McpSchema.ServerCapabilities capabilities = McpSchema.ServerCapabilities.builder().tools(true).build();
38+
39+
McpAsyncServer server = McpServer.async(transportProvider)
40+
.jsonMapper(mock(McpJsonMapper.class))
41+
.jsonSchemaValidator(mock(JsonSchemaValidator.class))
42+
.capabilities(capabilities)
43+
.build();
44+
45+
assertThat(server.getServerCapabilities()).isEqualTo(capabilities);
46+
assertThat(server.getServerCapabilities().logging()).isNull();
47+
}
48+
49+
@Test
50+
void preservesExplicitLoggingCapability() {
51+
McpServerTransportProvider transportProvider = mock(McpServerTransportProvider.class);
52+
McpSchema.ServerCapabilities capabilities = McpSchema.ServerCapabilities.builder().logging().build();
53+
54+
McpAsyncServer server = McpServer.async(transportProvider)
55+
.jsonMapper(mock(McpJsonMapper.class))
56+
.jsonSchemaValidator(mock(JsonSchemaValidator.class))
57+
.capabilities(capabilities)
58+
.build();
59+
60+
assertThat(server.getServerCapabilities()).isEqualTo(capabilities);
61+
assertThat(server.getServerCapabilities().logging()).isNotNull();
62+
}
63+
64+
}

mcp-test/src/main/java/io/modelcontextprotocol/AbstractMcpClientServerIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1493,7 +1493,7 @@ void testLoggingNotification() throws InterruptedException {
14931493
.build();
14941494

14951495
var mcpServer = prepareAsyncServerBuilder().serverInfo("test-server", "1.0.0")
1496-
.capabilities(ServerCapabilities.builder().tools(true).build())
1496+
.capabilities(ServerCapabilities.builder().tools(true).logging().build())
14971497
.tools(tool)
14981498
.build();
14991499

0 commit comments

Comments
 (0)