| 
31 | 31 | import io.modelcontextprotocol.server.McpServerFeatures.AsyncCompletionSpecification;  | 
32 | 32 | import io.modelcontextprotocol.server.McpServerFeatures.AsyncPromptSpecification;  | 
33 | 33 | import io.modelcontextprotocol.server.McpServerFeatures.AsyncResourceSpecification;  | 
 | 34 | +import io.modelcontextprotocol.server.McpServerFeatures.AsyncResourceTemplateSpecification;  | 
34 | 35 | import io.modelcontextprotocol.server.McpServerFeatures.AsyncToolSpecification;  | 
35 | 36 | import io.modelcontextprotocol.server.McpServerFeatures.SyncCompletionSpecification;  | 
36 | 37 | import io.modelcontextprotocol.server.McpServerFeatures.SyncPromptSpecification;  | 
37 | 38 | import io.modelcontextprotocol.server.McpServerFeatures.SyncResourceSpecification;  | 
 | 39 | +import io.modelcontextprotocol.server.McpServerFeatures.SyncResourceTemplateSpecification;  | 
38 | 40 | import io.modelcontextprotocol.server.McpServerFeatures.SyncToolSpecification;  | 
39 | 41 | import io.modelcontextprotocol.server.McpSyncServer;  | 
40 | 42 | import io.modelcontextprotocol.server.McpSyncServerExchange;  | 
@@ -111,6 +113,7 @@ public McpSyncServer mcpSyncServer(McpServerTransportProviderBase transportProvi  | 
111 | 113 | 			McpServerChangeNotificationProperties changeNotificationProperties,  | 
112 | 114 | 			ObjectProvider<List<SyncToolSpecification>> tools,  | 
113 | 115 | 			ObjectProvider<List<SyncResourceSpecification>> resources,  | 
 | 116 | +			ObjectProvider<List<SyncResourceTemplateSpecification>> resourceTemplates,  | 
114 | 117 | 			ObjectProvider<List<SyncPromptSpecification>> prompts,  | 
115 | 118 | 			ObjectProvider<List<SyncCompletionSpecification>> completions,  | 
116 | 119 | 			ObjectProvider<BiConsumer<McpSyncServerExchange, List<McpSchema.Root>>> rootsChangeConsumers,  | 
@@ -157,6 +160,21 @@ public McpSyncServer mcpSyncServer(McpServerTransportProviderBase transportProvi  | 
157 | 160 | 			}  | 
158 | 161 | 		}  | 
159 | 162 | 
 
  | 
 | 163 | +		// Resources Templates  | 
 | 164 | +		if (serverProperties.getCapabilities().isResource()) {  | 
 | 165 | +			logger.info("Enable resources templates capabilities, notification: "  | 
 | 166 | +					+ changeNotificationProperties.isResourceChangeNotification());  | 
 | 167 | +			capabilitiesBuilder.resources(false, changeNotificationProperties.isResourceChangeNotification());  | 
 | 168 | + | 
 | 169 | +			List<SyncResourceTemplateSpecification> resourceTemplateSpecifications = resourceTemplates.stream()  | 
 | 170 | +				.flatMap(List::stream)  | 
 | 171 | +				.toList();  | 
 | 172 | +			if (!CollectionUtils.isEmpty(resourceTemplateSpecifications)) {  | 
 | 173 | +				serverBuilder.resourceTemplates(resourceTemplateSpecifications);  | 
 | 174 | +				logger.info("Registered resource templates: " + resourceTemplateSpecifications.size());  | 
 | 175 | +			}  | 
 | 176 | +		}  | 
 | 177 | + | 
160 | 178 | 		// Prompts  | 
161 | 179 | 		if (serverProperties.getCapabilities().isPrompt()) {  | 
162 | 180 | 			logger.info("Enable prompts capabilities, notification: "  | 
@@ -210,6 +228,7 @@ public McpAsyncServer mcpAsyncServer(McpServerTransportProviderBase transportPro  | 
210 | 228 | 			McpServerChangeNotificationProperties changeNotificationProperties,  | 
211 | 229 | 			ObjectProvider<List<AsyncToolSpecification>> tools,  | 
212 | 230 | 			ObjectProvider<List<AsyncResourceSpecification>> resources,  | 
 | 231 | +			ObjectProvider<List<AsyncResourceTemplateSpecification>> resourceTemplates,  | 
213 | 232 | 			ObjectProvider<List<AsyncPromptSpecification>> prompts,  | 
214 | 233 | 			ObjectProvider<List<AsyncCompletionSpecification>> completions,  | 
215 | 234 | 			ObjectProvider<BiConsumer<McpAsyncServerExchange, List<McpSchema.Root>>> rootsChangeConsumer) {  | 
@@ -255,6 +274,21 @@ public McpAsyncServer mcpAsyncServer(McpServerTransportProviderBase transportPro  | 
255 | 274 | 			}  | 
256 | 275 | 		}  | 
257 | 276 | 
 
  | 
 | 277 | +		// Resources Templates  | 
 | 278 | +		if (serverProperties.getCapabilities().isResource()) {  | 
 | 279 | +			logger.info("Enable resources templates capabilities, notification: "  | 
 | 280 | +					+ changeNotificationProperties.isResourceChangeNotification());  | 
 | 281 | +			capabilitiesBuilder.resources(false, changeNotificationProperties.isResourceChangeNotification());  | 
 | 282 | + | 
 | 283 | +			List<AsyncResourceTemplateSpecification> resourceTemplateSpecifications = resourceTemplates.stream()  | 
 | 284 | +				.flatMap(List::stream)  | 
 | 285 | +				.toList();  | 
 | 286 | +			if (!CollectionUtils.isEmpty(resourceTemplateSpecifications)) {  | 
 | 287 | +				serverBuilder.resourceTemplates(resourceTemplateSpecifications);  | 
 | 288 | +				logger.info("Registered resources templates: " + resourceTemplateSpecifications.size());  | 
 | 289 | +			}  | 
 | 290 | +		}  | 
 | 291 | + | 
258 | 292 | 		// Prompts  | 
259 | 293 | 		if (serverProperties.getCapabilities().isPrompt()) {  | 
260 | 294 | 			logger.info("Enable prompts capabilities, notification: "  | 
 | 
0 commit comments