Skip to content

Commit 4baaca0

Browse files
authored
feat(mcp): only set variables for set flags (#1234)
Previously we had code which tried to detect nil values. But for example if a flag is an integer that wouldn't work. Instead we use a more robust approach of only setting variables if the flag was passed in as an argument. Test Plan: this command actually returns results now. Previously it wouldn't since it would have limit set to 0. go run ./cmd/src -v mcp list-repos -query 'cloud'
1 parent 81fac14 commit 4baaca0

File tree

3 files changed

+13
-21
lines changed

3 files changed

+13
-21
lines changed

cmd/src/mcp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func mcpMain(args []string) error {
7676
if err := flags.Parse(flagArgs); err != nil {
7777
return err
7878
}
79-
mcp.DerefFlagValues(vars)
79+
mcp.DerefFlagValues(flags, vars)
8080

8181
if err := validateToolArgs(tool.InputSchema, args, vars); err != nil {
8282
return err

internal/mcp/mcp_args.go

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,36 +24,28 @@ func (s *strSliceFlag) String() string {
2424
return strings.Join(s.vals, ",")
2525
}
2626

27-
func DerefFlagValues(vars map[string]any) {
27+
func DerefFlagValues(fs *flag.FlagSet, vars map[string]any) {
28+
setFlags := make(map[string]bool)
29+
fs.Visit(func(f *flag.Flag) {
30+
setFlags[f.Name] = true
31+
})
32+
2833
for k, v := range vars {
34+
if !setFlags[k] {
35+
delete(vars, k)
36+
continue
37+
}
2938
rfl := reflect.ValueOf(v)
3039
if rfl.Kind() == reflect.Pointer {
3140
vv := rfl.Elem().Interface()
3241
if slice, ok := vv.(strSliceFlag); ok {
3342
vv = slice.vals
3443
}
35-
if isNil(vv) {
36-
delete(vars, k)
37-
} else {
38-
vars[k] = vv
39-
}
44+
vars[k] = vv
4045
}
4146
}
4247
}
4348

44-
func isNil(v any) bool {
45-
if v == nil {
46-
return true
47-
}
48-
rv := reflect.ValueOf(v)
49-
switch rv.Kind() {
50-
case reflect.Slice, reflect.Map, reflect.Pointer, reflect.Interface:
51-
return rv.IsNil()
52-
default:
53-
return false
54-
}
55-
}
56-
5749
func BuildArgFlagSet(tool *ToolDef) (*flag.FlagSet, map[string]any, error) {
5850
if tool == nil {
5951
return nil, nil, errors.New("cannot build flagset on nil Tool Definition")

internal/mcp/mcp_args_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func TestFlagSetParse(t *testing.T) {
6363
if err := flagSet.Parse(args); err != nil {
6464
t.Fatalf("flagset parsing failed: %v", err)
6565
}
66-
DerefFlagValues(vars)
66+
DerefFlagValues(flagSet, vars)
6767

6868
if v, ok := vars["repos"].([]string); ok {
6969
if len(v) != 2 {

0 commit comments

Comments
 (0)