Skip to content

Commit a48bc5a

Browse files
committed
add mcp list-tools to list available tool calls
1 parent b795d99 commit a48bc5a

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

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+
}

cmd/src/mcp_parse.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/json"
77
"errors"
88
"fmt"
9+
"strings"
910
)
1011

1112
//go:embed mcp_tools.json
@@ -142,6 +143,12 @@ func (p *Parser) parseProperties(props map[string]json.RawMessage) map[string]Sc
142143
return res
143144
}
144145

146+
// normalizeToolName takes mcp tool names like 'sg_keyword_search' and normalizes it to 'keyword-search"
147+
func normalizeToolName(toolName string) string {
148+
toolName, _ = strings.CutPrefix(toolName, "sg_")
149+
return strings.ReplaceAll(toolName, "_", "-")
150+
}
151+
145152
func LoadMCPToolDefinitions(data []byte) (map[string]*MCPToolDef, error) {
146153
defs := struct {
147154
Tools []struct {
@@ -153,15 +160,15 @@ func LoadMCPToolDefinitions(data []byte) (map[string]*MCPToolDef, error) {
153160
}{}
154161

155162
if err := json.Unmarshal(data, &defs); err != nil {
156-
// TODO: think we should panic instead
157163
return nil, err
158164
}
159165

160166
tools := map[string]*MCPToolDef{}
161167
parser := &Parser{}
162168

163169
for _, t := range defs.Tools {
164-
tools[t.Name] = &MCPToolDef{
170+
name := normalizeToolName(t.Name)
171+
tools[name] = &MCPToolDef{
165172
Name: t.Name,
166173
Description: t.Description,
167174
InputSchema: parser.parseRootSchema(t.InputSchema),

0 commit comments

Comments
 (0)