Skip to content

Commit c6d1745

Browse files
committed
initial handleMcpTool method
- validate flags with inputSchema
1 parent c9ba57e commit c6d1745

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

cmd/src/mcp.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"flag"
55
"fmt"
6+
"strings"
67
)
78

89
func init() {
@@ -40,6 +41,33 @@ func mcpMain(args []string) error {
4041
}
4142

4243
func handleMcpTool(tool *MCPToolDef, args []string) error {
43-
fmt.Printf("handling tool %q args: %+v", tool.Name, args)
44+
fs, vars, err := buildArgFlagSet(tool)
45+
if err != nil {
46+
return err
47+
}
48+
49+
if err := fs.Parse(args); err != nil {
50+
return err
51+
}
52+
53+
inputSchema := tool.InputSchema
54+
55+
for _, reqName := range inputSchema.Required {
56+
if vars[reqName] == nil {
57+
return fmt.Errorf("no value provided for required flag --%s", reqName)
58+
}
59+
}
60+
61+
if len(args) < len(inputSchema.Required) {
62+
return fmt.Errorf("not enough arguments provided - the following flags are required:\n%s", strings.Join(inputSchema.Required, "\n"))
63+
}
64+
65+
derefFlagValues(vars)
66+
67+
fmt.Println("Flags")
68+
for name, val := range vars {
69+
fmt.Printf("--%s=%v\n", name, val)
70+
}
71+
4472
return nil
4573
}

cmd/src/mcp_args.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"flag"
55
"fmt"
6+
"reflect"
67
"strings"
78
)
89

@@ -21,6 +22,19 @@ func (s *strSliceFlag) String() string {
2122
return strings.Join(s.vals, ",")
2223
}
2324

25+
func derefFlagValues(vars map[string]any) {
26+
for k, v := range vars {
27+
rfl := reflect.ValueOf(v)
28+
if rfl.Kind() == reflect.Pointer {
29+
vv := rfl.Elem().Interface()
30+
if slice, ok := vv.(strSliceFlag); ok {
31+
vv = slice.vals
32+
}
33+
vars[k] = vv
34+
}
35+
}
36+
}
37+
2438
func buildArgFlagSet(tool *MCPToolDef) (*flag.FlagSet, map[string]any, error) {
2539
fs := flag.NewFlagSet(tool.Name(), flag.ContinueOnError)
2640
flagVars := map[string]any{}

0 commit comments

Comments
 (0)