Skip to content

Commit da5a963

Browse files
chore: separate toolset creation from init and use typed error
1 parent 9dd6fc5 commit da5a963

File tree

3 files changed

+45
-4
lines changed

3 files changed

+45
-4
lines changed

pkg/github/tools.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ type GetGQLClientFn func(context.Context) (*githubv4.Client, error)
1515

1616
var DefaultTools = []string{"all"}
1717

18-
func InitToolsets(passedToolsets []string, readOnly bool, getClient GetClientFn, getGQLClient GetGQLClientFn, t translations.TranslationHelperFunc) (*toolsets.ToolsetGroup, error) {
19-
// Create a new toolset group
18+
func DefaultToolsetGroup(readOnly bool, getClient GetClientFn, getGQLClient GetGQLClientFn, t translations.TranslationHelperFunc) *toolsets.ToolsetGroup {
2019
tsg := toolsets.NewToolsetGroup(readOnly)
2120

2221
// Define all available features with their default state (disabled)
@@ -116,8 +115,14 @@ func InitToolsets(passedToolsets []string, readOnly bool, getClient GetClientFn,
116115
tsg.AddToolset(secretProtection)
117116
tsg.AddToolset(notifications)
118117
tsg.AddToolset(experiments)
119-
// Enable the requested features
120118

119+
return tsg
120+
}
121+
122+
func InitToolsets(passedToolsets []string, readOnly bool, getClient GetClientFn, getGQLClient GetGQLClientFn, t translations.TranslationHelperFunc) (*toolsets.ToolsetGroup, error) {
123+
// Create a new toolset group
124+
tsg := DefaultToolsetGroup(readOnly, getClient, getGQLClient, t)
125+
// Enable the requested features
121126
if err := tsg.EnableToolsets(passedToolsets); err != nil {
122127
return nil, err
123128
}

pkg/toolsets/toolsets.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,28 @@ import (
77
"github.com/mark3labs/mcp-go/server"
88
)
99

10+
type ToolsetDoesNotExistError struct {
11+
Name string
12+
}
13+
14+
func (e *ToolsetDoesNotExistError) Error() string {
15+
return fmt.Sprintf("toolset %s does not exist", e.Name)
16+
}
17+
18+
func (e *ToolsetDoesNotExistError) Is(target error) bool {
19+
if target == nil {
20+
return false
21+
}
22+
if _, ok := target.(*ToolsetDoesNotExistError); ok {
23+
return true
24+
}
25+
return false
26+
}
27+
28+
func NewToolsetDoesNotExistError(name string) *ToolsetDoesNotExistError {
29+
return &ToolsetDoesNotExistError{Name: name}
30+
}
31+
1032
func NewServerTool(tool mcp.Tool, handler server.ToolHandlerFunc) server.ServerTool {
1133
return server.ServerTool{Tool: tool, Handler: handler}
1234
}
@@ -150,7 +172,7 @@ func (tg *ToolsetGroup) EnableToolsets(names []string) error {
150172
func (tg *ToolsetGroup) EnableToolset(name string) error {
151173
toolset, exists := tg.Toolsets[name]
152174
if !exists {
153-
return fmt.Errorf("toolset %s does not exist", name)
175+
return NewToolsetDoesNotExistError(name)
154176
}
155177
toolset.Enabled = true
156178
tg.Toolsets[name] = toolset
@@ -162,3 +184,13 @@ func (tg *ToolsetGroup) RegisterTools(s *server.MCPServer) {
162184
toolset.RegisterTools(s)
163185
}
164186
}
187+
188+
func (tg *ToolsetGroup) GetToolset(name string) (*Toolset, error) {
189+
toolset, exists := tg.Toolsets[name]
190+
if !exists {
191+
return nil, NewToolsetDoesNotExistError(name)
192+
}
193+
toolset.Enabled = true
194+
tg.Toolsets[name] = toolset
195+
return toolset, nil
196+
}

pkg/toolsets/toolsets_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package toolsets
22

33
import (
4+
"errors"
45
"testing"
56
)
67

@@ -151,6 +152,9 @@ func TestEnableToolsets(t *testing.T) {
151152
if err == nil {
152153
t.Error("Expected error when enabling list with non-existent toolset")
153154
}
155+
if !errors.Is(err, NewToolsetDoesNotExistError("non-existent")) {
156+
t.Errorf("Expected ToolsetDoesNotExistError when enabling non-existent toolset, got: %v", err)
157+
}
154158

155159
// Test with empty list
156160
err = tsg.EnableToolsets([]string{})

0 commit comments

Comments
 (0)