@@ -149,11 +149,11 @@ private List<McpServerFeatures.SyncToolSpecification> toSyncToolSpecifications(L
149149
150150 // De-duplicate tools by their name, keeping the first occurrence of each tool
151151 // name
152- return tools .stream ()
153- .collect (Collectors .toMap (tool -> tool .getToolDefinition ().name (), // Key :
154- // tool
155- // name
156- tool -> tool , // Value: the tool itself
152+ return tools .stream () // Key: tool name
153+ .collect (Collectors .toMap (tool -> tool .getToolDefinition ().name (), tool -> tool , // Value :
154+ // the
155+ // tool
156+ // itself
157157 (existing , replacement ) -> existing )) // On duplicate key, keep the
158158 // existing tool
159159 .values ()
@@ -185,47 +185,66 @@ public McpSyncServer mcpSyncServer(McpServerTransportProvider transportProvider,
185185 // Create the server with both tool and resource capabilities
186186 SyncSpecification serverBuilder = McpServer .sync (transportProvider ).serverInfo (serverInfo );
187187
188- List <SyncToolSpecification > toolSpecifications = new ArrayList <>(tools .stream ().flatMap (List ::stream ).toList ());
188+ // Tools
189+ if (serverProperties .getCapabilities ().isTool ()) {
190+ logger .info ("Enable tools capabilities, notification: " + serverProperties .isToolChangeNotification ());
191+ capabilitiesBuilder .tools (serverProperties .isToolChangeNotification ());
189192
190- List <ToolCallback > providerToolCallbacks = toolCallbackProvider .stream ()
191- .map (pr -> List .of (pr .getToolCallbacks ()))
192- .flatMap (List ::stream )
193- .filter (fc -> fc instanceof ToolCallback )
194- .map (fc -> (ToolCallback ) fc )
195- .toList ();
193+ List <SyncToolSpecification > toolSpecifications = new ArrayList <>(
194+ tools .stream ().flatMap (List ::stream ).toList ());
196195
197- toolSpecifications .addAll (this .toSyncToolSpecifications (providerToolCallbacks , serverProperties ));
196+ List <ToolCallback > providerToolCallbacks = toolCallbackProvider .stream ()
197+ .map (pr -> List .of (pr .getToolCallbacks ()))
198+ .flatMap (List ::stream )
199+ .filter (fc -> fc instanceof ToolCallback )
200+ .map (fc -> (ToolCallback ) fc )
201+ .toList ();
198202
199- if (!CollectionUtils .isEmpty (toolSpecifications )) {
200- serverBuilder .tools (toolSpecifications );
201- capabilitiesBuilder .tools (serverProperties .isToolChangeNotification ());
202- logger .info ("Registered tools: " + toolSpecifications .size () + ", notification: "
203- + serverProperties .isToolChangeNotification ());
203+ toolSpecifications .addAll (this .toSyncToolSpecifications (providerToolCallbacks , serverProperties ));
204+
205+ if (!CollectionUtils .isEmpty (toolSpecifications )) {
206+ serverBuilder .tools (toolSpecifications );
207+ logger .info ("Registered tools: " + toolSpecifications .size ());
208+ }
204209 }
205210
206- List <SyncResourceSpecification > resourceSpecifications = resources .stream ().flatMap (List ::stream ).toList ();
207- if (!CollectionUtils .isEmpty (resourceSpecifications )) {
208- serverBuilder .resources (resourceSpecifications );
211+ // Resources
212+ if (serverProperties .getCapabilities ().isResource ()) {
213+ logger .info (
214+ "Enable resources capabilities, notification: " + serverProperties .isResourceChangeNotification ());
209215 capabilitiesBuilder .resources (false , serverProperties .isResourceChangeNotification ());
210- logger .info ("Registered resources: " + resourceSpecifications .size () + ", notification: "
211- + serverProperties .isResourceChangeNotification ());
216+
217+ List <SyncResourceSpecification > resourceSpecifications = resources .stream ().flatMap (List ::stream ).toList ();
218+ if (!CollectionUtils .isEmpty (resourceSpecifications )) {
219+ serverBuilder .resources (resourceSpecifications );
220+ logger .info ("Registered resources: " + resourceSpecifications .size ());
221+ }
212222 }
213223
214- List < SyncPromptSpecification > promptSpecifications = prompts . stream (). flatMap ( List :: stream ). toList ();
215- if (! CollectionUtils . isEmpty ( promptSpecifications )) {
216- serverBuilder . prompts ( promptSpecifications );
224+ // Prompts
225+ if (serverProperties . getCapabilities (). isPrompt ( )) {
226+ logger . info ( "Enable prompts capabilities, notification: " + serverProperties . isPromptChangeNotification () );
217227 capabilitiesBuilder .prompts (serverProperties .isPromptChangeNotification ());
218- logger .info ("Registered prompts: " + promptSpecifications .size () + ", notification: "
219- + serverProperties .isPromptChangeNotification ());
228+
229+ List <SyncPromptSpecification > promptSpecifications = prompts .stream ().flatMap (List ::stream ).toList ();
230+ if (!CollectionUtils .isEmpty (promptSpecifications )) {
231+ serverBuilder .prompts (promptSpecifications );
232+ logger .info ("Registered prompts: " + promptSpecifications .size ());
233+ }
220234 }
221235
222- List <SyncCompletionSpecification > completionSpecifications = completions .stream ()
223- .flatMap (List ::stream )
224- .toList ();
225- if (!CollectionUtils .isEmpty (completionSpecifications )) {
226- serverBuilder .completions (completionSpecifications );
236+ // Completions
237+ if (serverProperties .getCapabilities ().isCompletion ()) {
238+ logger .info ("Enable completions capabilities" );
227239 capabilitiesBuilder .completions ();
228- logger .info ("Registered completions: " + completionSpecifications .size ());
240+
241+ List <SyncCompletionSpecification > completionSpecifications = completions .stream ()
242+ .flatMap (List ::stream )
243+ .toList ();
244+ if (!CollectionUtils .isEmpty (completionSpecifications )) {
245+ serverBuilder .completions (completionSpecifications );
246+ logger .info ("Registered completions: " + completionSpecifications .size ());
247+ }
229248 }
230249
231250 rootsChangeConsumers .ifAvailable (consumer -> {
@@ -257,11 +276,11 @@ private List<McpServerFeatures.AsyncToolSpecification> toAsyncToolSpecification(
257276 McpServerProperties serverProperties ) {
258277 // De-duplicate tools by their name, keeping the first occurrence of each tool
259278 // name
260- return tools .stream ()
261- .collect (Collectors .toMap (tool -> tool .getToolDefinition ().name (), // Key :
262- // tool
263- // name
264- tool -> tool , // Value: the tool itself
279+ return tools .stream () // Key: tool name
280+ .collect (Collectors .toMap (tool -> tool .getToolDefinition ().name (), tool -> tool , // Value :
281+ // the
282+ // tool
283+ // itself
265284 (existing , replacement ) -> existing )) // On duplicate key, keep the
266285 // existing tool
267286 .values ()
@@ -303,35 +322,51 @@ public McpAsyncServer mcpAsyncServer(McpServerTransportProvider transportProvide
303322
304323 toolSpecifications .addAll (this .toAsyncToolSpecification (providerToolCallbacks , serverProperties ));
305324
325+ // Tools
326+ if (serverProperties .getCapabilities ().isTool ()) {
327+ logger .info ("Enable tools capabilities, notification: " + serverProperties .isToolChangeNotification ());
328+ capabilitiesBuilder .tools (serverProperties .isToolChangeNotification ());
329+ }
330+
306331 if (!CollectionUtils .isEmpty (toolSpecifications )) {
307332 serverBuilder .tools (toolSpecifications );
308- capabilitiesBuilder .tools (serverProperties .isToolChangeNotification ());
309- logger .info ("Registered tools: " + toolSpecifications .size () + ", notification: "
310- + serverProperties .isToolChangeNotification ());
333+ logger .info ("Registered tools: " + toolSpecifications .size ());
334+ }
335+
336+ // Resources
337+ if (serverProperties .getCapabilities ().isResource ()) {
338+ logger .info (
339+ "Enable resources capabilities, notification: " + serverProperties .isResourceChangeNotification ());
340+ capabilitiesBuilder .resources (false , serverProperties .isResourceChangeNotification ());
311341 }
312342
313343 List <AsyncResourceSpecification > resourceSpecifications = resources .stream ().flatMap (List ::stream ).toList ();
314344 if (!CollectionUtils .isEmpty (resourceSpecifications )) {
315345 serverBuilder .resources (resourceSpecifications );
316- capabilitiesBuilder .resources (false , serverProperties .isResourceChangeNotification ());
317- logger .info ("Registered resources: " + resourceSpecifications .size () + ", notification: "
318- + serverProperties .isResourceChangeNotification ());
346+ logger .info ("Registered resources: " + resourceSpecifications .size ());
319347 }
320348
349+ // Prompts
350+ if (serverProperties .getCapabilities ().isPrompt ()) {
351+ logger .info ("Enable prompts capabilities, notification: " + serverProperties .isPromptChangeNotification ());
352+ capabilitiesBuilder .prompts (serverProperties .isPromptChangeNotification ());
353+ }
321354 List <AsyncPromptSpecification > promptSpecifications = prompts .stream ().flatMap (List ::stream ).toList ();
322355 if (!CollectionUtils .isEmpty (promptSpecifications )) {
323356 serverBuilder .prompts (promptSpecifications );
324- capabilitiesBuilder .prompts (serverProperties .isPromptChangeNotification ());
325- logger .info ("Registered prompts: " + promptSpecifications .size () + ", notification: "
326- + serverProperties .isPromptChangeNotification ());
357+ logger .info ("Registered prompts: " + promptSpecifications .size ());
327358 }
328359
360+ // Completions
361+ if (serverProperties .getCapabilities ().isCompletion ()) {
362+ logger .info ("Enable completions capabilities" );
363+ capabilitiesBuilder .completions ();
364+ }
329365 List <AsyncCompletionSpecification > completionSpecifications = completions .stream ()
330366 .flatMap (List ::stream )
331367 .toList ();
332368 if (!CollectionUtils .isEmpty (completionSpecifications )) {
333369 serverBuilder .completions (completionSpecifications );
334- capabilitiesBuilder .completions ();
335370 logger .info ("Registered completions: " + completionSpecifications .size ());
336371 }
337372
0 commit comments