This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-mcp-server.git

commit ccefd17931ce40f909841b88d540fca7e2bacd1f
Author: Robert Munteanu <[email protected]>
AuthorDate: Tue Jan 13 15:58:35 2026 +0100

    chore(mcp): update McpServerContribution methods to return List instead of 
Optional
    
    This makes the implementations much more flexible
---
 .../apache/sling/mcp/server/impl/McpServlet.java   | 11 +++++-----
 .../mcp/server/spi/McpServerContribution.java      | 25 ++++++++++++----------
 2 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/src/main/java/org/apache/sling/mcp/server/impl/McpServlet.java 
b/src/main/java/org/apache/sling/mcp/server/impl/McpServlet.java
index 316b8a0..a7ae71b 100644
--- a/src/main/java/org/apache/sling/mcp/server/impl/McpServlet.java
+++ b/src/main/java/org/apache/sling/mcp/server/impl/McpServlet.java
@@ -23,7 +23,6 @@ import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 
 import io.modelcontextprotocol.common.McpTransportContext;
 import io.modelcontextprotocol.json.McpJsonMapper;
@@ -122,7 +121,7 @@ public class McpServlet extends 
SlingJakartaAllMethodsServlet {
 
         var completions = contributions.stream()
                 .map(McpServerContribution::getSyncCompletionSpecification)
-                .flatMap(Optional::stream)
+                .flatMap(List::stream)
                 .toList();
 
         syncServer = McpServer.sync(transportProvider)
@@ -141,22 +140,22 @@ public class McpServlet extends 
SlingJakartaAllMethodsServlet {
 
         contributions.stream()
                 .map(McpServerContribution::getSyncToolSpecification)
-                .flatMap(Optional::stream)
+                .flatMap(List::stream)
                 .forEach(syncTool -> syncServer.addTool(syncTool));
 
         contributions.stream()
                 .map(McpServerContribution::getSyncResourceSpecification)
-                .flatMap(Optional::stream)
+                .flatMap(List::stream)
                 .forEach(syncResource -> syncServer.addResource(syncResource));
 
         contributions.stream()
                 
.map(McpServerContribution::getSyncResourceTemplateSpecification)
-                .flatMap(Optional::stream)
+                .flatMap(List::stream)
                 .forEach(syncResource -> 
syncServer.addResourceTemplate(syncResource));
 
         contributions.stream()
                 .map(McpServerContribution::getSyncPromptSpecification)
-                .flatMap(Optional::stream)
+                .flatMap(List::stream)
                 .forEach(syncPrompt -> syncServer.addPrompt(syncPrompt));
     }
 
diff --git 
a/src/main/java/org/apache/sling/mcp/server/spi/McpServerContribution.java 
b/src/main/java/org/apache/sling/mcp/server/spi/McpServerContribution.java
index 58a5d42..70ada37 100644
--- a/src/main/java/org/apache/sling/mcp/server/spi/McpServerContribution.java
+++ b/src/main/java/org/apache/sling/mcp/server/spi/McpServerContribution.java
@@ -18,7 +18,7 @@
  */
 package org.apache.sling.mcp.server.spi;
 
-import java.util.Optional;
+import java.util.List;
 
 import 
io.modelcontextprotocol.server.McpStatelessServerFeatures.SyncCompletionSpecification;
 import 
io.modelcontextprotocol.server.McpStatelessServerFeatures.SyncPromptSpecification;
@@ -37,26 +37,29 @@ import 
io.modelcontextprotocol.server.McpStatelessServerFeatures.SyncToolSpecifi
  *
  * <p>This abstraction is needed because the contributions themselves are Java 
records and cannot
  * be registered as OSGi services directly.</p>
+ *
+ * <p><strong>Note:</strong> This API can change in incompatible ways while 
the bundle version is &lt; 1.0 . The exported package
+ * version will remain 1.0.0 and will be changed to 1.1.0 once the bundle 
version becomes 1.0 .</p>
  */
 public interface McpServerContribution {
 
-    default Optional<SyncToolSpecification> getSyncToolSpecification() {
-        return Optional.empty();
+    default List<SyncToolSpecification> getSyncToolSpecification() {
+        return List.of();
     }
 
-    default Optional<SyncResourceSpecification> getSyncResourceSpecification() 
{
-        return Optional.empty();
+    default List<SyncResourceSpecification> getSyncResourceSpecification() {
+        return List.of();
     }
 
-    default Optional<SyncResourceTemplateSpecification> 
getSyncResourceTemplateSpecification() {
-        return Optional.empty();
+    default List<SyncResourceTemplateSpecification> 
getSyncResourceTemplateSpecification() {
+        return List.of();
     }
 
-    default Optional<SyncPromptSpecification> getSyncPromptSpecification() {
-        return Optional.empty();
+    default List<SyncPromptSpecification> getSyncPromptSpecification() {
+        return List.of();
     }
 
-    default Optional<SyncCompletionSpecification> 
getSyncCompletionSpecification() {
-        return Optional.empty();
+    default List<SyncCompletionSpecification> getSyncCompletionSpecification() 
{
+        return List.of();
     }
 }

Reply via email to