@@ -36,9 +36,10 @@ public static Object invokeMethod(Class<?> clazz, Method method) throws Exceptio
3636        return  method .invoke (object );
3737    }
3838
39-     public  static  Object  invokeMethod (Class <?> clazz , Method  method , Map <String , Object > parameters ) throws  Exception  {
39+     public  static  Object  invokeMethod (Class <?> clazz , Method  method , List < McpSchema . PromptArgument >  arguments ,  Map <String , Object > parameters ) throws  Exception  {
4040        Object  object  = clazz .getDeclaredConstructor ().newInstance ();
41-         return  method .invoke (object , parameters .values ().toArray ());
41+         Map <String , Object > typedParameters  = asTypedParameters (method , arguments , parameters );
42+         return  method .invoke (object , typedParameters .values ().toArray ());
4243    }
4344
4445    public  static  Object  invokeMethod (Class <?> clazz , Method  method , McpSchema .JsonSchema  schema , Map <String , Object > parameters ) throws  Exception  {
@@ -47,27 +48,55 @@ public static Object invokeMethod(Class<?> clazz, Method method, McpSchema.JsonS
4748        return  method .invoke (object , typedParameters .values ().toArray ());
4849    }
4950
51+     private  static  Map <String , Object > asTypedParameters (Method  method , List <McpSchema .PromptArgument > arguments , Map <String , Object > parameters ) {
52+         Class <?>[] parameterTypes  = method .getParameterTypes ();
53+         Map <String , Object > typedParameters  = new  LinkedHashMap <>(parameters .size ());
54+ 
55+         for  (int  i  = 0 , size  = arguments .size (); i  < size ; i ++) {
56+             final  String  parameterName  = arguments .get (i ).name ();
57+             final  Object  parameterValue  = parameters .get (parameterName );
58+             // Fill in a default value when the parameter is not specified 
59+             // to ensure that the parameter type is correct when calling method.invoke() 
60+             Class <?> parameterType  = parameterTypes [i ];
61+             if  (String .class  == parameterType ) {
62+                 typedParameters .put (parameterName , parameterValue  == null  ? StringHelper .EMPTY  : parameterValue .toString ());
63+             } else  if  (int .class  == parameterType  || Integer .class  == parameterType ) {
64+                 typedParameters .put (parameterName , parameterValue  == null  ? 0  : Integer .parseInt (parameterValue .toString ()));
65+             } else  if  (long .class  == parameterType  || Long .class  == parameterType ) {
66+                 typedParameters .put (parameterName , parameterValue  == null  ? 0  : Long .parseLong (parameterValue .toString ()));
67+             } else  if  (float .class  == parameterType  || Float .class  == parameterType ) {
68+                 typedParameters .put (parameterName , parameterValue  == null  ? 0.0  : Float .parseFloat (parameterValue .toString ()));
69+             } else  if  (double .class  == parameterType  || Double .class  == parameterType ) {
70+                 typedParameters .put (parameterName , parameterValue  == null  ? 0.0  : Double .parseDouble (parameterValue .toString ()));
71+             } else  if  (boolean .class  == parameterType  || Boolean .class  == parameterType ) {
72+                 typedParameters .put (parameterName , parameterValue  != null  && Boolean .parseBoolean (parameterValue .toString ()));
73+             } else  {
74+                 typedParameters .put (parameterName , parameterValue );
75+             }
76+         }
77+ 
78+         return  typedParameters ;
79+     }
80+ 
5081    @ SuppressWarnings ("unchecked" )
5182    private  static  Map <String , Object > asTypedParameters (McpSchema .JsonSchema  schema , Map <String , Object > parameters ) {
5283        Map <String , Object > properties  = schema .properties ();
5384        Map <String , Object > typedParameters  = new  LinkedHashMap <>(properties .size ());
5485
5586        properties .forEach ((parameterName , parameterProperties ) -> {
5687            Object  parameterValue  = parameters .get (parameterName );
57-             if  (parameterValue  == null ) {
58-                 Map <String , Object > map  = (Map <String , Object >) parameterProperties ;
59-                 final  String  jsonSchemaType  = map .getOrDefault ("type" , StringHelper .EMPTY ).toString ();
60-                 if  (jsonSchemaType .isEmpty ()) {
61-                     typedParameters .put (parameterName , null );
62-                 } else  if  (isTypeOf (String .class , jsonSchemaType )) {
63-                     typedParameters .put (parameterName , StringHelper .EMPTY );
64-                 } else  if  (isTypeOf (Integer .class , jsonSchemaType )) {
65-                     typedParameters .put (parameterName , 0 );
66-                 } else  if  (isTypeOf (Number .class , jsonSchemaType )) {
67-                     typedParameters .put (parameterName , 0.0 );
68-                 } else  if  (isTypeOf (Boolean .class , jsonSchemaType )) {
69-                     typedParameters .put (parameterName , false );
70-                 }
88+             // Fill in a default value when the parameter is not specified 
89+             // to ensure that the parameter type is correct when calling method.invoke() 
90+             Map <String , Object > map  = (Map <String , Object >) parameterProperties ;
91+             final  String  jsonSchemaType  = map .getOrDefault ("type" , StringHelper .EMPTY ).toString ();
92+             if  (String .class .getSimpleName ().equalsIgnoreCase (jsonSchemaType )) {
93+                 typedParameters .put (parameterName , parameterValue  == null  ? StringHelper .EMPTY  : parameterValue .toString ());
94+             } else  if  (Integer .class .getSimpleName ().equalsIgnoreCase (jsonSchemaType )) {
95+                 typedParameters .put (parameterName , parameterValue  == null  ? 0  : Integer .parseInt (parameterValue .toString ()));
96+             } else  if  (Number .class .getSimpleName ().equalsIgnoreCase (jsonSchemaType )) {
97+                 typedParameters .put (parameterName , parameterValue  == null  ? 0.0  : Double .parseDouble (parameterValue .toString ()));
98+             } else  if  (Boolean .class .getSimpleName ().equalsIgnoreCase (jsonSchemaType )) {
99+                 typedParameters .put (parameterName , parameterValue  != null  && Boolean .parseBoolean (parameterValue .toString ()));
71100            } else  {
72101                typedParameters .put (parameterName , parameterValue );
73102            }
@@ -76,8 +105,4 @@ private static Map<String, Object> asTypedParameters(McpSchema.JsonSchema schema
76105        return  typedParameters ;
77106    }
78107
79-     private  static  boolean  isTypeOf (Class <?> clazz , String  jsonSchemaType ) {
80-         return  clazz .getName ().equalsIgnoreCase (jsonSchemaType ) || clazz .getSimpleName ().equalsIgnoreCase (jsonSchemaType );
81-     }
82- 
83108}
0 commit comments