Skip to content

Commit b4391c0

Browse files
committed
Allow unknown toolsets to be ignored
1 parent f9343e6 commit b4391c0

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

internal/ghmcp/server.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/github/github-mcp-server/pkg/github"
1818
mcplog "github.com/github/github-mcp-server/pkg/log"
1919
"github.com/github/github-mcp-server/pkg/raw"
20+
"github.com/github/github-mcp-server/pkg/toolsets"
2021
"github.com/github/github-mcp-server/pkg/translations"
2122
gogithub "github.com/google/go-github/v74/github"
2223
"github.com/mark3labs/mcp-go/mcp"
@@ -142,7 +143,7 @@ func NewMCPServer(cfg MCPServerConfig) (*server.MCPServer, error) {
142143

143144
// Create default toolsets
144145
tsg := github.DefaultToolsetGroup(cfg.ReadOnly, getClient, getGQLClient, getRawClient, cfg.Translator, cfg.ContentWindowSize)
145-
err = tsg.EnableToolsets(enabledToolsets)
146+
err = tsg.EnableToolsets(enabledToolsets, &toolsets.EnableToolsetsOptions{})
146147

147148
if err != nil {
148149
return nil, fmt.Errorf("failed to enable toolsets: %w", err)

pkg/toolsets/toolsets.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,23 +203,33 @@ func (tg *ToolsetGroup) IsEnabled(name string) bool {
203203
return feature.Enabled
204204
}
205205

206-
func (tg *ToolsetGroup) EnableToolsets(names []string) error {
206+
type EnableToolsetsOptions struct {
207+
IgnoreUnknown bool
208+
}
209+
210+
func (tg *ToolsetGroup) EnableToolsets(names []string, options *EnableToolsetsOptions) error {
211+
if options == nil {
212+
options = &EnableToolsetsOptions{
213+
IgnoreUnknown: false,
214+
}
215+
}
216+
207217
// Special case for "all"
208218
for _, name := range names {
209219
if name == "all" {
210220
tg.everythingOn = true
211221
break
212222
}
213223
err := tg.EnableToolset(name)
214-
if err != nil {
224+
if err != nil && !options.IgnoreUnknown {
215225
return err
216226
}
217227
}
218228
// Do this after to ensure all toolsets are enabled if "all" is present anywhere in list
219229
if tg.everythingOn {
220230
for name := range tg.Toolsets {
221231
err := tg.EnableToolset(name)
222-
if err != nil {
232+
if err != nil && !options.IgnoreUnknown {
223233
return err
224234
}
225235
}

pkg/toolsets/toolsets_test.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func TestEnableToolsets(t *testing.T) {
134134
tsg.AddToolset(toolset2)
135135

136136
// Test enabling multiple toolsets
137-
err := tsg.EnableToolsets([]string{"toolset1", "toolset2"})
137+
err := tsg.EnableToolsets([]string{"toolset1", "toolset2"}, &EnableToolsetsOptions{})
138138
if err != nil {
139139
t.Errorf("Expected no error when enabling toolsets, got: %v", err)
140140
}
@@ -148,23 +148,28 @@ func TestEnableToolsets(t *testing.T) {
148148
}
149149

150150
// Test with non-existent toolset in the list
151-
err = tsg.EnableToolsets([]string{"toolset1", "non-existent"})
151+
err = tsg.EnableToolsets([]string{"toolset1", "non-existent"}, &EnableToolsetsOptions{})
152152
if err == nil {
153153
t.Error("Expected error when enabling list with non-existent toolset")
154154
}
155155
if !errors.Is(err, NewToolsetDoesNotExistError("non-existent")) {
156156
t.Errorf("Expected ToolsetDoesNotExistError when enabling non-existent toolset, got: %v", err)
157157
}
158158

159+
err = tsg.EnableToolsets([]string{"toolset1", "non-existent"}, &EnableToolsetsOptions{IgnoreUnknown: true})
160+
if err != nil {
161+
t.Errorf("Expected no error when ignoring unknown toolsets, got: %v", err)
162+
}
163+
159164
// Test with empty list
160-
err = tsg.EnableToolsets([]string{})
165+
err = tsg.EnableToolsets([]string{}, &EnableToolsetsOptions{})
161166
if err != nil {
162167
t.Errorf("Expected no error with empty toolset list, got: %v", err)
163168
}
164169

165170
// Test enabling everything through EnableToolsets
166171
tsg = NewToolsetGroup(false)
167-
err = tsg.EnableToolsets([]string{"all"})
172+
err = tsg.EnableToolsets([]string{"all"}, &EnableToolsetsOptions{})
168173
if err != nil {
169174
t.Errorf("Expected no error when enabling 'all', got: %v", err)
170175
}
@@ -187,14 +192,14 @@ func TestEnableEverything(t *testing.T) {
187192
}
188193

189194
// Enable "all"
190-
err := tsg.EnableToolsets([]string{"all"})
195+
err := tsg.EnableToolsets([]string{"all"}, &EnableToolsetsOptions{})
191196
if err != nil {
192-
t.Errorf("Expected no error when enabling 'eall', got: %v", err)
197+
t.Errorf("Expected no error when enabling 'all', got: %v", err)
193198
}
194199

195200
// Verify everythingOn was set
196201
if !tsg.everythingOn {
197-
t.Error("Expected everythingOn to be true after enabling 'eall'")
202+
t.Error("Expected everythingOn to be true after enabling 'all'")
198203
}
199204

200205
// Verify the previously disabled toolset is now enabled
@@ -212,7 +217,7 @@ func TestIsEnabledWithEverythingOn(t *testing.T) {
212217
tsg := NewToolsetGroup(false)
213218

214219
// Enable "all"
215-
err := tsg.EnableToolsets([]string{"all"})
220+
err := tsg.EnableToolsets([]string{"all"}, &EnableToolsetsOptions{})
216221
if err != nil {
217222
t.Errorf("Expected no error when enabling 'all', got: %v", err)
218223
}

0 commit comments

Comments
 (0)