diff --git a/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerPromptRegister.java b/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerPromptRegister.java index 520b637..7698e8b 100644 --- a/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerPromptRegister.java +++ b/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerPromptRegister.java @@ -29,7 +29,7 @@ public McpSyncServerPromptRegister(Set> promptClasses) { @Override public void registerTo(McpSyncServer server) { for (Class promptClass : promptClasses) { - Set methods = ReflectionHelper.getMethodsAnnotatedWith(promptClass, McpPrompt.class); + List methods = ReflectionHelper.getMethodsAnnotatedWith(promptClass, McpPrompt.class); for (Method method : methods) { McpServerFeatures.SyncPromptSpecification prompt = createComponentFrom(promptClass, method); server.addPrompt(prompt); @@ -59,7 +59,7 @@ public McpServerFeatures.SyncPromptSpecification createComponentFrom(Class cl } private List createPromptArguments(Method method) { - Set parameters = ReflectionHelper.getParametersAnnotatedWith(method, McpPromptParam.class); + List parameters = ReflectionHelper.getParametersAnnotatedWith(method, McpPromptParam.class); List promptArguments = new ArrayList<>(parameters.size()); for (Parameter parameter : parameters) { McpPromptParam promptParam = parameter.getAnnotation(McpPromptParam.class); diff --git a/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerResourceRegister.java b/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerResourceRegister.java index ae715ca..c8b8edf 100644 --- a/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerResourceRegister.java +++ b/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerResourceRegister.java @@ -26,7 +26,7 @@ public McpSyncServerResourceRegister(Set> resourceClasses) { @Override public void registerTo(McpSyncServer server) { for (Class resourceClass : resourceClasses) { - Set methods = ReflectionHelper.getMethodsAnnotatedWith(resourceClass, McpResource.class); + List methods = ReflectionHelper.getMethodsAnnotatedWith(resourceClass, McpResource.class); for (Method method : methods) { McpServerFeatures.SyncResourceSpecification resource = createComponentFrom(resourceClass, method); server.addResource(resource); diff --git a/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerToolRegister.java b/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerToolRegister.java index a10d80c..8d1a7c5 100644 --- a/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerToolRegister.java +++ b/src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpSyncServerToolRegister.java @@ -12,7 +12,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.ArrayList; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -33,7 +33,7 @@ public McpSyncServerToolRegister(Set> toolClasses) { @Override public void registerTo(McpSyncServer server) { for (Class toolClass : toolClasses) { - Set methods = ReflectionHelper.getMethodsAnnotatedWith(toolClass, McpTool.class); + List methods = ReflectionHelper.getMethodsAnnotatedWith(toolClass, McpTool.class); for (Method method : methods) { McpServerFeatures.SyncToolSpecification tool = createComponentFrom(toolClass, method); server.addTool(tool); @@ -63,10 +63,11 @@ public McpServerFeatures.SyncToolSpecification createComponentFrom(Class claz } private McpSchema.JsonSchema createJsonSchema(Method method) { - Map properties = new HashMap<>(); + //has to use linkedhashmap to make order correct + Map properties = new LinkedHashMap<>(); List required = new ArrayList<>(); - Set parameters = ReflectionHelper.getParametersAnnotatedWith(method, McpToolParam.class); + List parameters = ReflectionHelper.getParametersAnnotatedWith(method, McpToolParam.class); for (Parameter parameter : parameters) { McpToolParam toolParam = parameter.getAnnotation(McpToolParam.class); final String parameterName = toolParam.name(); diff --git a/src/main/java/com/github/codeboyzhou/mcp/declarative/util/ReflectionHelper.java b/src/main/java/com/github/codeboyzhou/mcp/declarative/util/ReflectionHelper.java index efa3e79..b876cb1 100644 --- a/src/main/java/com/github/codeboyzhou/mcp/declarative/util/ReflectionHelper.java +++ b/src/main/java/com/github/codeboyzhou/mcp/declarative/util/ReflectionHelper.java @@ -5,22 +5,34 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Parameter; +import java.util.Arrays; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; -import java.util.Set; - -import static java.util.stream.Collectors.toSet; +import java.util.stream.Stream; public final class ReflectionHelper { - public static Set getMethodsAnnotatedWith(Class clazz, Class annotation) { + /** + * has to use list as result to make order correct + * @param clazz + * @param annotation + * @return + */ + public static List getMethodsAnnotatedWith(Class clazz, Class annotation) { Method[] methods = clazz.getMethods(); - return Set.of(methods).stream().filter(m -> m.isAnnotationPresent(annotation)).collect(toSet()); + return Stream.of(methods).filter(m -> m.isAnnotationPresent(annotation)).toList(); } - public static Set getParametersAnnotatedWith(Method method, Class annotation) { + /** + * has to use list as result to make order correct + * @param method + * @param annotation + * @return + */ + public static List getParametersAnnotatedWith(Method method, Class annotation) { Parameter[] parameters = method.getParameters(); - return Set.of(parameters).stream().filter(p -> p.isAnnotationPresent(annotation)).collect(toSet()); + return Stream.of(parameters).filter(p -> p.isAnnotationPresent(annotation)).toList(); } public static Object invokeMethod(Class clazz, Method method) throws Exception {