Skip to content

Commit cf71d7b

Browse files
committed
fix(mcp): honor stdioServerParams in McpToolset.fromConfig
1 parent 8bfa02f commit cf71d7b

2 files changed

Lines changed: 60 additions & 4 deletions

File tree

‎core/src/main/java/com/google/adk/tools/mcp/McpToolset.java‎

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.google.adk.tools.BaseTool;
2626
import com.google.adk.tools.BaseToolset;
2727
import com.google.adk.tools.ToolPredicate;
28+
import com.google.common.annotations.VisibleForTesting;
2829
import com.google.common.collect.ImmutableList;
2930
import com.google.common.primitives.Booleans;
3031
import io.modelcontextprotocol.client.McpSyncClient;
@@ -416,10 +417,7 @@ public static McpToolset fromConfig(BaseTool.ToolConfig config, String configAbs
416417
}
417418

418419
List<String> toolNames = mcpToolsetConfig.toolFilter();
419-
Object connectionParameters =
420-
Optional.<Object>ofNullable(mcpToolsetConfig.stdioConnectionParams())
421-
.or(() -> Optional.ofNullable(mcpToolsetConfig.sseServerParams()))
422-
.orElse(mcpToolsetConfig.stdioConnectionParams());
420+
Object connectionParameters = resolveConnectionParameters(mcpToolsetConfig);
423421

424422
// Create McpToolset with McpSessionManager having appropriate connection parameters
425423
if (toolNames != null) {
@@ -431,4 +429,20 @@ public static McpToolset fromConfig(BaseTool.ToolConfig config, String configAbs
431429
throw new ConfigurationException("Failed to parse McpToolsetConfig from ToolArgsConfig", e);
432430
}
433431
}
432+
433+
/**
434+
* Resolves the single connection-parameters object from an already-validated config. {@code
435+
* stdioServerParams} is converted to the MCP SDK {@link ServerParameters}, the type {@link
436+
* DefaultMcpTransportBuilder} accepts; the other variants pass through unchanged.
437+
*/
438+
@VisibleForTesting
439+
static Object resolveConnectionParameters(McpToolsetConfig mcpToolsetConfig) {
440+
return Optional.<Object>ofNullable(mcpToolsetConfig.stdioConnectionParams())
441+
.or(() -> Optional.ofNullable(mcpToolsetConfig.sseServerParams()))
442+
.or(
443+
() ->
444+
Optional.ofNullable(mcpToolsetConfig.stdioServerParams())
445+
.map(StdioServerParameters::toServerParameters))
446+
.orElseThrow(() -> new IllegalStateException("Validated MCP connection params missing."));
447+
}
434448
}

‎core/src/test/java/com/google/adk/tools/mcp/McpToolsetTest.java‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.google.common.collect.ImmutableList;
3232
import com.google.common.collect.ImmutableMap;
3333
import io.modelcontextprotocol.client.McpSyncClient;
34+
import io.modelcontextprotocol.client.transport.ServerParameters;
3435
import io.modelcontextprotocol.json.McpJsonDefaults;
3536
import io.modelcontextprotocol.json.McpJsonMapper;
3637
import io.modelcontextprotocol.spec.McpSchema;
@@ -369,4 +370,45 @@ public void getTools_succeedsOnLastRetryAttempt() {
369370
verify(mockMcpSessionManager, times(3)).createSession();
370371
verify(mockMcpSyncClient, times(3)).listTools();
371372
}
373+
374+
@Test
375+
public void resolveConnectionParameters_stdioServerParams_convertsToSdkServerParameters() {
376+
McpToolsetConfig config = new McpToolsetConfig();
377+
config.setStdioServerParams(StdioServerParameters.builder().command("my-command").build());
378+
379+
Object resolved = McpToolset.resolveConnectionParameters(config);
380+
381+
// Regression, Finding 1: this branch used to resolve to null (stdioServerParams was never
382+
// consulted), deferring the failure to an NPE in DefaultMcpTransportBuilder.build(null).
383+
assertThat(resolved).isInstanceOf(ServerParameters.class);
384+
}
385+
386+
@Test
387+
public void resolveConnectionParameters_sseServerParams_passesThrough() {
388+
McpToolsetConfig config = new McpToolsetConfig();
389+
SseServerParameters sseParams =
390+
SseServerParameters.builder().url("http://localhost:8080").build();
391+
config.setSseServerParams(sseParams);
392+
393+
assertThat(McpToolset.resolveConnectionParameters(config)).isSameInstanceAs(sseParams);
394+
}
395+
396+
@Test
397+
public void resolveConnectionParameters_stdioConnectionParams_passesThrough() {
398+
McpToolsetConfig config = new McpToolsetConfig();
399+
StdioConnectionParameters connectionParams =
400+
StdioConnectionParameters.builder()
401+
.serverParams(StdioServerParameters.builder().command("my-command").build())
402+
.build();
403+
config.setStdioConnectionParams(connectionParams);
404+
405+
assertThat(McpToolset.resolveConnectionParameters(config)).isSameInstanceAs(connectionParams);
406+
}
407+
408+
@Test
409+
public void resolveConnectionParameters_nothingSet_throwsIllegalStateException() {
410+
assertThrows(
411+
IllegalStateException.class,
412+
() -> McpToolset.resolveConnectionParameters(new McpToolsetConfig()));
413+
}
372414
}

0 commit comments

Comments
 (0)