@@ -15,7 +15,9 @@ import (
15
15
"strings"
16
16
17
17
"github.com/pb33f/libopenapi"
18
+ "github.com/pb33f/libopenapi/datamodel/high/base"
18
19
v3 "github.com/pb33f/libopenapi/datamodel/high/v3"
20
+ "gopkg.in/yaml.v3"
19
21
20
22
"github.com/loopwork-ai/emcee/internal"
21
23
"github.com/loopwork-ai/emcee/jsonrpc"
@@ -293,8 +295,11 @@ func (s *Server) handleToolsList(request *ToolsListRequest) (*ToolsListResponse,
293
295
if paramSchema .Pattern != "" {
294
296
schema ["pattern" ] = paramSchema .Pattern
295
297
}
298
+ // Add enum values to description if they exist
299
+ schema ["description" ] = buildSchemaDescription (param .Description , paramSchema )
300
+ } else {
301
+ schema ["description" ] = param .Description
296
302
}
297
- schema ["description" ] = param .Description
298
303
inputSchema .Properties [param .Name ] = schema
299
304
if param .Required != nil && * param .Required {
300
305
inputSchema .Required = append (inputSchema .Required , param .Name )
@@ -317,8 +322,11 @@ func (s *Server) handleToolsList(request *ToolsListRequest) (*ToolsListResponse,
317
322
if paramSchema .Pattern != "" {
318
323
schema ["pattern" ] = paramSchema .Pattern
319
324
}
325
+ // Add enum values to description if they exist
326
+ schema ["description" ] = buildSchemaDescription (param .Description , paramSchema )
327
+ } else {
328
+ schema ["description" ] = param .Description
320
329
}
321
- schema ["description" ] = param .Description
322
330
inputSchema .Properties [param .Name ] = schema
323
331
if param .Required != nil && * param .Required {
324
332
inputSchema .Required = append (inputSchema .Required , param .Name )
@@ -341,9 +349,11 @@ func (s *Server) handleToolsList(request *ToolsListRequest) (*ToolsListResponse,
341
349
if len (propSchema .Type ) > 0 {
342
350
schemaType = propSchema .Type [0 ]
343
351
}
352
+ // Add enum values to description if they exist
353
+ description := buildSchemaDescription ("" , propSchema )
344
354
inputSchema .Properties [propName ] = map [string ]interface {}{
345
355
"type" : schemaType ,
346
- "description" : propSchema . Description ,
356
+ "description" : description ,
347
357
}
348
358
}
349
359
}
@@ -672,3 +682,43 @@ func (s *Server) findOperationByToolName(toolName string) (method, path string,
672
682
}
673
683
return "" , "" , nil , nil , false
674
684
}
685
+
686
+ // buildSchemaDescription builds a description string from parameter and schema descriptions, and enum values
687
+ func buildSchemaDescription (paramDesc string , paramSchema * base.Schema ) string {
688
+ description := paramDesc
689
+
690
+ if paramSchema .Description != "" {
691
+ if description != "" && description != paramSchema .Description {
692
+ description = fmt .Sprintf ("%s. %s" , description , paramSchema .Description )
693
+ } else {
694
+ description = paramSchema .Description
695
+ }
696
+ }
697
+
698
+ var enumValues []string
699
+ if len (paramSchema .Enum ) > 0 {
700
+ enumValues = getEnumValues (paramSchema .Enum )
701
+ }
702
+
703
+ if len (enumValues ) > 0 {
704
+ if description != "" {
705
+ description = fmt .Sprintf ("%s (Allowed values: %s)" , description , strings .Join (enumValues , ", " ))
706
+ } else {
707
+ description = fmt .Sprintf ("Allowed values: %s" , strings .Join (enumValues , ", " ))
708
+ }
709
+ }
710
+
711
+ return description
712
+ }
713
+
714
+ // getEnumValues extracts enum values from a schema's enum field
715
+ func getEnumValues (enum []* yaml.Node ) []string {
716
+ if len (enum ) == 0 {
717
+ return nil
718
+ }
719
+ values := make ([]string , len (enum ))
720
+ for i , v := range enum {
721
+ values [i ] = v .Value
722
+ }
723
+ return values
724
+ }
0 commit comments