Skip to content

Commit 2612c77

Browse files
committed
add mcp list-tools to list available tool calls
1 parent 89494c8 commit 2612c77

2 files changed

Lines changed: 54 additions & 1 deletion

File tree

cmd/src/mcp.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
)
7+
8+
func init() {
9+
flagSet := flag.NewFlagSet("mcp", flag.ExitOnError)
10+
handler := func(args []string) error {
11+
return mcpMain(args)
12+
}
13+
14+
commands = append(commands, &command{
15+
flagSet: flagSet,
16+
handler: handler,
17+
})
18+
}
19+
func mcpMain(args []string) error {
20+
fmt.Println("NOTE: This command is still experimental")
21+
tools, err := LoadMCPToolDefinitions(mcpToolListJSON)
22+
if err != nil {
23+
return err
24+
}
25+
26+
subcmd := args[0]
27+
if subcmd == "list-tools" {
28+
fmt.Println("Available tools")
29+
for name := range tools {
30+
fmt.Printf("- %s\n", name)
31+
}
32+
return nil
33+
}
34+
35+
tool, ok := tools[subcmd]
36+
if !ok {
37+
return fmt.Errorf("tool definition for %q not found - run src mcp list-tools to see a list of available tools", subcmd)
38+
}
39+
return handleMcpTool(tool, args[1:])
40+
}
41+
42+
func handleMcpTool(tool *MCPToolDef, args []string) error {
43+
fmt.Printf("handling tool %q args: %+v", tool.Name, args)
44+
return nil
45+
}

internal/mcp/mcp_parse.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
_ "embed"
55
"encoding/json"
66
"fmt"
7+
"strings"
78

89
"github.com/sourcegraph/sourcegraph/lib/errors"
910
)
@@ -80,7 +81,8 @@ func LoadToolDefinitions(data []byte) (map[string]*ToolDef, error) {
8081
decoder := &decoder{}
8182

8283
for _, t := range defs.Tools {
83-
tools[t.Name] = &ToolDef{
84+
name := normalizeToolName(t.Name)
85+
tools[name] = &ToolDef{
8486
Name: t.Name,
8587
Description: t.Description,
8688
InputSchema: decoder.decodeRootSchema(t.InputSchema),
@@ -157,3 +159,9 @@ func (d *decoder) decodeProperties(props map[string]json.RawMessage) map[string]
157159
}
158160
return res
159161
}
162+
163+
// normalizeToolName takes mcp tool names like 'sg_keyword_search' and normalizes it to 'keyword-search"
164+
func normalizeToolName(toolName string) string {
165+
toolName, _ = strings.CutPrefix(toolName, "sg_")
166+
return strings.ReplaceAll(toolName, "_", "-")
167+
}

0 commit comments

Comments
 (0)