@@ -53,9 +53,8 @@ public McpServerFeatures.SyncToolSpecification create(Class<?> clazz, Method met
5353 boolean isError = false ;
5454 try {
5555 Object instance = InjectorProvider .getInstance ().getInjector ().getInstance (clazz );
56- Map <String , Object > args = request .arguments ();
57- Map <String , Object > typedArgs = asTypedParameters (paramSchema , args );
58- result = method .invoke (instance , typedArgs .values ().toArray ());
56+ List <Object > typedValues = asTypedParameterValues (method , request .arguments ());
57+ result = method .invoke (instance , typedValues .toArray ());
5958 } catch (Exception e ) {
6059 log .error ("Error invoking tool method" , e );
6160 result = e + ": " + e .getMessage ();
@@ -147,23 +146,23 @@ private Map<String, Object> createJsonSchemaDefinition(Class<?> definitionClass)
147146 return definitionJsonSchema ;
148147 }
149148
150- @ SuppressWarnings ( "unchecked" )
151- private Map < String , Object > asTypedParameters (
152- McpSchema . JsonSchema schema , Map < String , Object > parameters ) {
153- Map < String , Object > properties = schema . properties ();
154- Map < String , Object > typedParameters = new LinkedHashMap <>( properties . size ());
155-
156- properties . forEach (
157- ( parameterName , parameterProperties ) -> {
158- Object parameterValue = parameters .get (parameterName );
159- // Fill in a default value when the parameter is not specified
160- // to ensure that the parameter type is correct when calling method.invoke()
161- Map < String , Object > map = ( Map < String , Object >) parameterProperties ;
162- final String jsonSchemaType = map . getOrDefault ( "type" , Strings . EMPTY ). toString ();
163- Object typedParameterValue = Types .convert (parameterValue , jsonSchemaType );
164- typedParameters . put ( parameterName , typedParameterValue );
165- });
166-
167- return typedParameters ;
149+ private List < Object > asTypedParameterValues ( Method method , Map < String , Object > parameters ) {
150+ Parameter [] methodParams = method . getParameters ();
151+ List < Object > typedValues = new ArrayList <>( methodParams . length );
152+
153+ for ( Parameter param : methodParams ) {
154+ Object rawValue = null ;
155+ if ( param . isAnnotationPresent ( McpToolParam . class )) {
156+ McpToolParam toolParam = param . getAnnotation ( McpToolParam . class );
157+ rawValue = parameters .get (toolParam . name () );
158+ }
159+ // Fill in a default value when the parameter is not specified or unannotated
160+ // to ensure that the parameter type is correct when calling method.invoke()
161+ Class <?> targetType = param . getType ();
162+ Object typed = Types .convert (rawValue , targetType );
163+ typedValues . add ( typed );
164+ }
165+
166+ return typedValues ;
168167 }
169168}
0 commit comments