Skip to content

Commit 403ace1

Browse files
google-genai-botcopybara-github
authored andcommitted
refactor: Refactor McpSessionManager to support custom transport builders
PiperOrigin-RevId: 783885274
1 parent 1e114cd commit 403ace1

File tree

3 files changed

+83
-34
lines changed

3 files changed

+83
-34
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.google.adk.tools.mcp;
2+
3+
import com.google.common.collect.ImmutableMap;
4+
import io.modelcontextprotocol.client.transport.HttpClientSseClientTransport;
5+
import io.modelcontextprotocol.client.transport.ServerParameters;
6+
import io.modelcontextprotocol.client.transport.StdioClientTransport;
7+
import io.modelcontextprotocol.spec.McpClientTransport;
8+
import java.util.Collection;
9+
import java.util.Optional;
10+
11+
/**
12+
* The default builder for creating MCP client transports. Supports StdioClientTransport based on
13+
* {@link ServerParameters} and the standard HttpClientSseClientTransport based on {@link
14+
* SseServerParameters}.
15+
*/
16+
public class DefaultMcpTransportBuilder implements McpTransportBuilder {
17+
18+
@Override
19+
public McpClientTransport build(Object connectionParams) {
20+
if (connectionParams instanceof ServerParameters serverParameters) {
21+
return new StdioClientTransport(serverParameters);
22+
} else if (connectionParams instanceof SseServerParameters sseServerParams) {
23+
return HttpClientSseClientTransport.builder(sseServerParams.url())
24+
.sseEndpoint("sse")
25+
.customizeRequest(
26+
builder ->
27+
Optional.ofNullable(sseServerParams.headers())
28+
.map(ImmutableMap::entrySet)
29+
.stream()
30+
.flatMap(Collection::stream)
31+
.forEach(
32+
entry ->
33+
builder.header(
34+
entry.getKey(),
35+
Optional.ofNullable(entry.getValue())
36+
.map(Object::toString)
37+
.orElse(""))))
38+
.build();
39+
} else {
40+
throw new IllegalArgumentException(
41+
"DefaultMcpTransportBuilder supports only ServerParameters or SseServerParameters, but"
42+
+ " got "
43+
+ connectionParams.getClass().getName());
44+
}
45+
}
46+
}

core/src/main/java/com/google/adk/tools/mcp/McpSessionManager.java

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,20 @@
1616

1717
package com.google.adk.tools.mcp;
1818

19-
import com.google.common.collect.ImmutableMap;
2019
import io.modelcontextprotocol.client.McpClient;
2120
import io.modelcontextprotocol.client.McpSyncClient;
22-
import io.modelcontextprotocol.client.transport.HttpClientSseClientTransport;
23-
import io.modelcontextprotocol.client.transport.ServerParameters;
24-
import io.modelcontextprotocol.client.transport.StdioClientTransport;
2521
import io.modelcontextprotocol.spec.McpClientTransport;
2622
import io.modelcontextprotocol.spec.McpSchema.ClientCapabilities;
2723
import io.modelcontextprotocol.spec.McpSchema.InitializeResult;
24+
import java.time.Duration;
2825
import org.slf4j.Logger;
2926
import org.slf4j.LoggerFactory;
3027

31-
import java.time.Duration;
32-
import java.util.Collection;
33-
import java.util.Optional;
34-
3528
/**
3629
* Manages MCP client sessions.
3730
*
3831
* <p>This class provides methods for creating and initializing MCP client sessions, handling
39-
* different connection parameters (Stdio and SSE).
32+
* different connection parameters and transport builders.
4033
*/
4134
// TODO(b/413489523): Implement this class.
4235
public class McpSessionManager {
@@ -53,31 +46,21 @@ public McpSyncClient createSession() {
5346
}
5447

5548
public static McpSyncClient initializeSession(Object connectionParams) {
56-
McpClientTransport transport;
57-
if (connectionParams instanceof ServerParameters serverParameters) {
58-
transport = new StdioClientTransport(serverParameters);
59-
} else if (connectionParams instanceof SseServerParameters sseServerParams) {
60-
transport = HttpClientSseClientTransport.builder(sseServerParams.url())
61-
.sseEndpoint("sse")
62-
.customizeRequest(builder ->
63-
Optional.ofNullable(sseServerParams.headers())
64-
.map(ImmutableMap::entrySet)
65-
.stream().flatMap(Collection::stream)
66-
.forEach(entry ->
67-
builder.header(
68-
entry.getKey(),
69-
Optional.ofNullable(entry.getValue())
70-
.map(Object::toString)
71-
.orElse("")
72-
)
73-
)
74-
)
75-
.build();
76-
} else {
77-
throw new IllegalArgumentException(
78-
"Connection parameters must be either ServerParameters or SseServerParameters, but got "
79-
+ connectionParams.getClass().getName());
80-
}
49+
McpClientTransport transport = new DefaultMcpTransportBuilder().build(connectionParams);
50+
McpSyncClient client =
51+
McpClient.sync(transport)
52+
.requestTimeout(Duration.ofSeconds(10))
53+
.capabilities(ClientCapabilities.builder().build())
54+
.build();
55+
InitializeResult initResult = client.initialize();
56+
logger.debug("Initialize Client Result: {}", initResult);
57+
return client;
58+
}
59+
60+
public static McpSyncClient initializeSession(
61+
Object connectionParams, McpTransportBuilder transportBuilder) {
62+
McpClientTransport transport = transportBuilder.build(connectionParams);
63+
8164
McpSyncClient client =
8265
McpClient.sync(transport)
8366
.requestTimeout(Duration.ofSeconds(10))
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.google.adk.tools.mcp;
2+
3+
import io.modelcontextprotocol.spec.McpClientTransport;
4+
5+
/**
6+
* Interface for building McpClientTransport instances. Implementations of this interface are
7+
* responsible for constructing concrete McpClientTransport objects based on the provided connection
8+
* parameters.
9+
*/
10+
public interface McpTransportBuilder {
11+
/**
12+
* Builds an McpClientTransport based on the provided connection parameters.
13+
*
14+
* @param connectionParams The parameters required to configure the transport. The type of this
15+
* object determines the type of transport built.
16+
* @return An instance of McpClientTransport.
17+
* @throws IllegalArgumentException if the connectionParams are not supported or invalid.
18+
*/
19+
McpClientTransport build(Object connectionParams);
20+
}

0 commit comments

Comments
 (0)