|
28 | 28 | import io.modelcontextprotocol.server.McpServer.AsyncSpecification; |
29 | 29 | import io.modelcontextprotocol.server.McpServer.SyncSpecification; |
30 | 30 | import io.modelcontextprotocol.server.McpServerFeatures; |
| 31 | +import io.modelcontextprotocol.server.McpServerFeatures.AsyncCompletionSpecification; |
31 | 32 | import io.modelcontextprotocol.server.McpServerFeatures.AsyncPromptSpecification; |
32 | 33 | import io.modelcontextprotocol.server.McpServerFeatures.AsyncResourceSpecification; |
33 | 34 | import io.modelcontextprotocol.server.McpServerFeatures.AsyncToolSpecification; |
| 35 | +import io.modelcontextprotocol.server.McpServerFeatures.SyncCompletionSpecification; |
34 | 36 | import io.modelcontextprotocol.server.McpServerFeatures.SyncPromptSpecification; |
35 | 37 | import io.modelcontextprotocol.server.McpServerFeatures.SyncResourceSpecification; |
36 | 38 | import io.modelcontextprotocol.server.McpServerFeatures.SyncToolSpecification; |
@@ -173,6 +175,7 @@ public McpSyncServer mcpSyncServer(McpServerTransportProvider transportProvider, |
173 | 175 | ObjectProvider<List<SyncToolSpecification>> tools, |
174 | 176 | ObjectProvider<List<SyncResourceSpecification>> resources, |
175 | 177 | ObjectProvider<List<SyncPromptSpecification>> prompts, |
| 178 | + ObjectProvider<List<SyncCompletionSpecification>> completions, |
176 | 179 | ObjectProvider<BiConsumer<McpSyncServerExchange, List<McpSchema.Root>>> rootsChangeConsumers, |
177 | 180 | List<ToolCallbackProvider> toolCallbackProvider) { |
178 | 181 |
|
@@ -216,6 +219,15 @@ public McpSyncServer mcpSyncServer(McpServerTransportProvider transportProvider, |
216 | 219 | + serverProperties.isPromptChangeNotification()); |
217 | 220 | } |
218 | 221 |
|
| 222 | + List<SyncCompletionSpecification> completionSpecifications = completions.stream() |
| 223 | + .flatMap(List::stream) |
| 224 | + .toList(); |
| 225 | + if (!CollectionUtils.isEmpty(completionSpecifications)) { |
| 226 | + serverBuilder.completions(completionSpecifications); |
| 227 | + capabilitiesBuilder.completions(); |
| 228 | + logger.info("Registered completions: " + completionSpecifications.size()); |
| 229 | + } |
| 230 | + |
219 | 231 | rootsChangeConsumers.ifAvailable(consumer -> { |
220 | 232 | serverBuilder.rootsChangeHandler((exchange, roots) -> consumer.accept(exchange, roots)); |
221 | 233 | logger.info("Registered roots change consumer"); |
@@ -270,6 +282,7 @@ public McpAsyncServer mcpAsyncServer(McpServerTransportProvider transportProvide |
270 | 282 | ObjectProvider<List<AsyncToolSpecification>> tools, |
271 | 283 | ObjectProvider<List<AsyncResourceSpecification>> resources, |
272 | 284 | ObjectProvider<List<AsyncPromptSpecification>> prompts, |
| 285 | + ObjectProvider<List<AsyncCompletionSpecification>> completions, |
273 | 286 | ObjectProvider<BiConsumer<McpAsyncServerExchange, List<McpSchema.Root>>> rootsChangeConsumer, |
274 | 287 | List<ToolCallbackProvider> toolCallbackProvider) { |
275 | 288 |
|
@@ -313,6 +326,15 @@ public McpAsyncServer mcpAsyncServer(McpServerTransportProvider transportProvide |
313 | 326 | + serverProperties.isPromptChangeNotification()); |
314 | 327 | } |
315 | 328 |
|
| 329 | + List<AsyncCompletionSpecification> completionSpecifications = completions.stream() |
| 330 | + .flatMap(List::stream) |
| 331 | + .toList(); |
| 332 | + if (!CollectionUtils.isEmpty(completionSpecifications)) { |
| 333 | + serverBuilder.completions(completionSpecifications); |
| 334 | + capabilitiesBuilder.completions(); |
| 335 | + logger.info("Registered completions: " + completionSpecifications.size()); |
| 336 | + } |
| 337 | + |
316 | 338 | rootsChangeConsumer.ifAvailable(consumer -> { |
317 | 339 | BiFunction<McpAsyncServerExchange, List<McpSchema.Root>, Mono<Void>> asyncConsumer = (exchange, roots) -> { |
318 | 340 | consumer.accept(exchange, roots); |
|
0 commit comments