Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,11 @@ public class StatelessToolCallbackConverterAutoConfiguration {
matchIfMissing = true)
public List<McpStatelessServerFeatures.SyncToolSpecification> syncTools(
ObjectProvider<List<ToolCallback>> toolCalls, List<ToolCallback> toolCallbackList,
List<ToolCallbackProvider> toolCallbackProvider, McpServerProperties serverProperties) {
ObjectProvider<List<ToolCallbackProvider>> tcbProviderList,
ObjectProvider<ToolCallbackProvider> tcbProviders, McpServerProperties serverProperties) {

List<ToolCallback> tools = this.aggregateToolCallbacks(toolCalls, toolCallbackList, toolCallbackProvider);
List<ToolCallback> tools = this.aggregateToolCallbacks(toolCalls, toolCallbackList, tcbProviderList,
tcbProviders);

return this.toSyncToolSpecifications(tools, serverProperties);
}
Expand Down Expand Up @@ -81,9 +83,11 @@ private List<McpStatelessServerFeatures.SyncToolSpecification> toSyncToolSpecifi
@ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
public List<McpStatelessServerFeatures.AsyncToolSpecification> asyncTools(
ObjectProvider<List<ToolCallback>> toolCalls, List<ToolCallback> toolCallbackList,
List<ToolCallbackProvider> toolCallbackProvider, McpServerProperties serverProperties) {
ObjectProvider<List<ToolCallbackProvider>> tcbProviderList,
ObjectProvider<ToolCallbackProvider> tcbProviders, McpServerProperties serverProperties) {

List<ToolCallback> tools = this.aggregateToolCallbacks(toolCalls, toolCallbackList, toolCallbackProvider);
List<ToolCallback> tools = this.aggregateToolCallbacks(toolCalls, toolCallbackList, tcbProviderList,
tcbProviders);

return this.toAsyncToolSpecification(tools, serverProperties);
}
Expand All @@ -107,15 +111,24 @@ private List<McpStatelessServerFeatures.AsyncToolSpecification> toAsyncToolSpeci
}

private List<ToolCallback> aggregateToolCallbacks(ObjectProvider<List<ToolCallback>> toolCalls,
List<ToolCallback> toolCallbacksList, List<ToolCallbackProvider> toolCallbackProvider) {
List<ToolCallback> toolCallbacksList, ObjectProvider<List<ToolCallbackProvider>> tcbProviderList,
ObjectProvider<ToolCallbackProvider> tcbProviders) {

// Merge ToolCallbackProviders from both ObjectProviders.
List<ToolCallbackProvider> totalToolCallbackProviders = new ArrayList<>(
tcbProviderList.stream().flatMap(List::stream).toList());
totalToolCallbackProviders.addAll(tcbProviders.stream().toList());

// De-duplicate ToolCallbackProviders
totalToolCallbackProviders = totalToolCallbackProviders.stream().distinct().toList();

List<ToolCallback> tools = new ArrayList<>(toolCalls.stream().flatMap(List::stream).toList());

if (!CollectionUtils.isEmpty(toolCallbacksList)) {
tools.addAll(toolCallbacksList);
}

List<ToolCallback> providerToolCallbacks = toolCallbackProvider.stream()
List<ToolCallback> providerToolCallbacks = totalToolCallbackProviders.stream()
.map(pr -> List.of(pr.getToolCallbacks()))
.flatMap(List::stream)
.filter(fc -> fc instanceof ToolCallback)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,19 @@ public class ToolCallbackConverterAutoConfiguration {
@ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, name = "type", havingValue = "SYNC",
matchIfMissing = true)
public List<McpServerFeatures.SyncToolSpecification> syncTools(ObjectProvider<List<ToolCallback>> toolCalls,
List<ToolCallback> toolCallbacksList, List<ToolCallbackProvider> toolCallbackProvider,
McpServerProperties serverProperties) {
List<ToolCallback> toolCallbacksList, ObjectProvider<List<ToolCallbackProvider>> tcbProviderList,
ObjectProvider<ToolCallbackProvider> tcbProviders, McpServerProperties serverProperties) {

// Merge ToolCallbackProviders from both ObjectProviders.
List<ToolCallbackProvider> totalToolCallbackProviders = new ArrayList<>(
tcbProviderList.stream().flatMap(List::stream).toList());
totalToolCallbackProviders.addAll(tcbProviders.stream().toList());

// De-duplicate ToolCallbackProviders
totalToolCallbackProviders = totalToolCallbackProviders.stream().distinct().toList();

List<ToolCallback> tools = this.aggregateToolCallbacks(toolCalls, toolCallbacksList, toolCallbackProvider);
List<ToolCallback> tools = this.aggregateToolCallbacks(toolCalls, toolCallbacksList, tcbProviderList,
tcbProviders);

return this.toSyncToolSpecifications(tools, serverProperties);
}
Expand All @@ -63,10 +72,7 @@ private List<McpServerFeatures.SyncToolSpecification> toSyncToolSpecifications(L
// De-duplicate tools by their name, keeping the first occurrence of each tool
// name
return tools.stream() // Key: tool name
.collect(Collectors.toMap(tool -> tool.getToolDefinition().name(), tool -> tool, // Value:
// the
// tool
// itself
.collect(Collectors.toMap(tool -> tool.getToolDefinition().name(), tool -> tool,
(existing, replacement) -> existing)) // On duplicate key, keep the
// existing tool
.values()
Expand All @@ -83,10 +89,11 @@ private List<McpServerFeatures.SyncToolSpecification> toSyncToolSpecifications(L
@Bean
@ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
public List<McpServerFeatures.AsyncToolSpecification> asyncTools(ObjectProvider<List<ToolCallback>> toolCalls,
List<ToolCallback> toolCallbacksList, List<ToolCallbackProvider> toolCallbackProvider,
McpServerProperties serverProperties) {
List<ToolCallback> toolCallbacksList, ObjectProvider<List<ToolCallbackProvider>> tcbProviderList,
ObjectProvider<ToolCallbackProvider> tcbProviders, McpServerProperties serverProperties) {

List<ToolCallback> tools = this.aggregateToolCallbacks(toolCalls, toolCallbacksList, toolCallbackProvider);
List<ToolCallback> tools = this.aggregateToolCallbacks(toolCalls, toolCallbacksList, tcbProviderList,
tcbProviders);

return this.toAsyncToolSpecification(tools, serverProperties);
}
Expand Down Expand Up @@ -114,15 +121,24 @@ private List<McpServerFeatures.AsyncToolSpecification> toAsyncToolSpecification(
}

private List<ToolCallback> aggregateToolCallbacks(ObjectProvider<List<ToolCallback>> toolCalls,
List<ToolCallback> toolCallbacksList, List<ToolCallbackProvider> toolCallbackProvider) {
List<ToolCallback> toolCallbacksList, ObjectProvider<List<ToolCallbackProvider>> tcbProviderList,
ObjectProvider<ToolCallbackProvider> tcbProviders) {

// Merge ToolCallbackProviders from both ObjectProviders.
List<ToolCallbackProvider> totalToolCallbackProviders = new ArrayList<>(
tcbProviderList.stream().flatMap(List::stream).toList());
totalToolCallbackProviders.addAll(tcbProviders.stream().toList());

// De-duplicate ToolCallbackProviders
totalToolCallbackProviders = totalToolCallbackProviders.stream().distinct().toList();

List<ToolCallback> tools = new ArrayList<>(toolCalls.stream().flatMap(List::stream).toList());

if (!CollectionUtils.isEmpty(toolCallbacksList)) {
tools.addAll(toolCallbacksList);
}

List<ToolCallback> providerToolCallbacks = toolCallbackProvider.stream()
List<ToolCallback> providerToolCallbacks = totalToolCallbackProviders.stream()
.map(pr -> List.of(pr.getToolCallbacks()))
.flatMap(List::stream)
.filter(fc -> fc instanceof ToolCallback)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,24 @@ public class ToolCallingAutoConfiguration {
*/
@Bean
@ConditionalOnMissingBean
ToolCallbackResolver toolCallbackResolver(GenericApplicationContext applicationContext,
List<ToolCallback> toolCallbacks, List<ToolCallbackProvider> tcbProviders) {
ToolCallbackResolver toolCallbackResolver(
GenericApplicationContext applicationContext, // @formatter:off
List<ToolCallback> toolCallbacks,
// Deprecated in favor of the tcbProviders. Kept for backward compatibility.
ObjectProvider<List<ToolCallbackProvider>> tcbProviderList,
ObjectProvider<ToolCallbackProvider> tcbProviders) { // @formatter:on

List<ToolCallback> allFunctionAndToolCallbacks = new ArrayList<>(toolCallbacks);
tcbProviders.stream()

// Merge ToolCallbackProviders from both ObjectProviders.
List<ToolCallbackProvider> totalToolCallbackProviders = new ArrayList<>(
tcbProviderList.stream().flatMap(List::stream).toList());
totalToolCallbackProviders.addAll(tcbProviders.stream().toList());

// De-duplicate ToolCallbackProviders
totalToolCallbackProviders = totalToolCallbackProviders.stream().distinct().toList();

totalToolCallbackProviders.stream()
.filter(pr -> !isMcpToolCallbackProvider(ResolvableType.forInstance(pr)))
.map(pr -> List.of(pr.getToolCallbacks()))
.forEach(allFunctionAndToolCallbacks::addAll);
Expand Down
Loading