From f4607853cb933b30ac2c1641e90a5c3f91613531 Mon Sep 17 00:00:00 2001 From: William Bezuidenhout Date: Wed, 24 Dec 2025 16:43:38 +0200 Subject: [PATCH 1/4] add -json flag for all tools --- internal/mcp/mcp_args.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/mcp/mcp_args.go b/internal/mcp/mcp_args.go index bdd7af6ef7..1313725992 100644 --- a/internal/mcp/mcp_args.go +++ b/internal/mcp/mcp_args.go @@ -93,5 +93,7 @@ func BuildArgFlagSet(tool *ToolDef) (*flag.FlagSet, map[string]any, error) { } } + flagVars["json"] = fs.String("json", "", "provide all arguments as an json object") + return fs, flagVars, nil } From 86c4867cc948807deae23252c3c8c1e03467cfd5 Mon Sep 17 00:00:00 2001 From: William Bezuidenhout Date: Wed, 24 Dec 2025 16:44:05 +0200 Subject: [PATCH 2/4] initial version of accepting args as json --- cmd/src/mcp.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cmd/src/mcp.go b/cmd/src/mcp.go index 812d181b54..bb23ee331f 100644 --- a/cmd/src/mcp.go +++ b/cmd/src/mcp.go @@ -5,6 +5,7 @@ import ( "encoding/json" "flag" "fmt" + "maps" "strings" "github.com/sourcegraph/src-cli/internal/mcp" @@ -76,6 +77,17 @@ func mcpMain(args []string) error { } mcp.DerefFlagValues(flags, vars) + if val, ok := vars["json"]; ok { + if jsonVal, ok := val.(string); ok && len(jsonVal) > 0 { + m := make(map[string]any) + if err := json.Unmarshal([]byte(jsonVal), &m); err != nil { + return err + } + maps.Copy(vars, m) + } + delete(vars, "json") + } + if err := validateToolArgs(tool.InputSchema, args, vars); err != nil { return err } From 61dbc7ea3155570da4dc8fb72d279d4539b7116f Mon Sep 17 00:00:00 2001 From: William Bezuidenhout Date: Tue, 6 Jan 2026 15:43:57 +0200 Subject: [PATCH 3/4] update usage for --json flag - include note section where we mention the precedence --- cmd/src/mcp.go | 6 ++++++ internal/mcp/mcp_args.go | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/src/mcp.go b/cmd/src/mcp.go index bb23ee331f..7380653b43 100644 --- a/cmd/src/mcp.go +++ b/cmd/src/mcp.go @@ -30,6 +30,12 @@ func mcpUsage() { fmt.Println(" src mcp schema View the input/output schema of a tool") fmt.Println(" src mcp Invoke a tool with the given flags") fmt.Println(" src mcp -h List the available flags of a tool") + fmt.Println("\nCOMMON FLAGS:") + fmt.Println(" --json '{...}' Provide all tool arguments as a JSON object (recommended for agents)") + fmt.Println("\nNOTE:") + fmt.Println(" When both --json and explicit flags are provided, values from --json take precedence.") + fmt.Println("\nEXAMPLE:") + fmt.Println(" src mcp --json '{\"arg1\": \"value1\", \"arg2\": \"value2\"}'") } func mcpMain(args []string) error { diff --git a/internal/mcp/mcp_args.go b/internal/mcp/mcp_args.go index 1313725992..e492a645ef 100644 --- a/internal/mcp/mcp_args.go +++ b/internal/mcp/mcp_args.go @@ -93,7 +93,7 @@ func BuildArgFlagSet(tool *ToolDef) (*flag.FlagSet, map[string]any, error) { } } - flagVars["json"] = fs.String("json", "", "provide all arguments as an json object") + flagVars["json"] = fs.String("json", "", "provide all arguments as a JSON object") return fs, flagVars, nil } From 8b0bec1400cd93339abb4b576ec4d2f94ec57f9c Mon Sep 17 00:00:00 2001 From: William Bezuidenhout Date: Tue, 6 Jan 2026 16:28:06 +0200 Subject: [PATCH 4/4] add comments --- cmd/src/mcp.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/src/mcp.go b/cmd/src/mcp.go index 7380653b43..2d40ef3d6b 100644 --- a/cmd/src/mcp.go +++ b/cmd/src/mcp.go @@ -83,14 +83,17 @@ func mcpMain(args []string) error { } mcp.DerefFlagValues(flags, vars) + // arguments provided via a JSON object take precedence over explicit values provided from flags if val, ok := vars["json"]; ok { if jsonVal, ok := val.(string); ok && len(jsonVal) > 0 { m := make(map[string]any) if err := json.Unmarshal([]byte(jsonVal), &m); err != nil { return err } + // copy overrides existing keys maps.Copy(vars, m) } + // we delete "json" from vars, otherwise it will be sent as a argument to the tool call delete(vars, "json") }