Skip to content

Commit 509f8ae

Browse files
committed
initial handleMcpTool method
- validate flags with inputSchema
1 parent e6bddfd commit 509f8ae

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
)
@@ -47,6 +48,33 @@ func mcpMain(args []string) error {
4748
}
4849

4950
func handleMcpTool(tool *mcp.ToolDef, args []string) error {
50-
fmt.Printf("handling tool %q args: %+v", tool.Name, args)
51+
fs, vars, err := buildArgFlagSet(tool)
52+
if err != nil {
53+
return err
54+
}
55+
56+
if err := fs.Parse(args); err != nil {
57+
return err
58+
}
59+
60+
inputSchema := tool.InputSchema
61+
62+
for _, reqName := range inputSchema.Required {
63+
if vars[reqName] == nil {
64+
return fmt.Errorf("no value provided for required flag --%s", reqName)
65+
}
66+
}
67+
68+
if len(args) < len(inputSchema.Required) {
69+
return fmt.Errorf("not enough arguments provided - the following flags are required:\n%s", strings.Join(inputSchema.Required, "\n"))
70+
}
71+
72+
derefFlagValues(vars)
73+
74+
fmt.Println("Flags")
75+
for name, val := range vars {
76+
fmt.Printf("--%s=%v\n", name, val)
77+
}
78+
5179
return nil
5280
}

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)