Skip to content

Commit afd6cf7

Browse files
committed
add mcp list-tools to list available tool calls
1 parent 4c6a6bd commit afd6cf7

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
@@ -5,6 +5,7 @@ import (
55
_ "embed"
66
"encoding/json"
77
"fmt"
8+
"strings"
89

910
"github.com/sourcegraph/sourcegraph/lib/errors"
1011
)
@@ -86,7 +87,8 @@ func LoadToolDefinitions(data []byte) (map[string]*MCPToolDef, error) {
8687
parser := &parser{}
8788

8889
for _, t := range defs.Tools {
89-
tools[t.Name] = &MCPToolDef{
90+
name := normalizeToolName(t.Name)
91+
tools[name] = &MCPToolDef{
9092
Name: t.Name,
9193
Description: t.Description,
9294
InputSchema: parser.parseRootSchema(t.InputSchema),
@@ -165,3 +167,9 @@ func (p *parser) parseProperties(props map[string]json.RawMessage) map[string]Sc
165167
}
166168
return res
167169
}
170+
171+
// normalizeToolName takes mcp tool names like 'sg_keyword_search' and normalizes it to 'keyword-search"
172+
func normalizeToolName(toolName string) string {
173+
toolName, _ = strings.CutPrefix(toolName, "sg_")
174+
return strings.ReplaceAll(toolName, "_", "-")
175+
}

0 commit comments

Comments
 (0)