Skip to content

Commit 619a3a0

Browse files
committed
initial handleMcpTool method
- validate flags with inputSchema
1 parent 2fbf9a7 commit 619a3a0

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
"github.com/sourcegraph/src-cli/internal/mcp"
89
)
@@ -38,6 +39,33 @@ func mcpMain(args []string) error {
3839
}
3940

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

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)