Skip to content

Commit bf651d1

Browse files
committed
Add the ability to specify allowed tools for MCP servers
Signed-off-by: Donnie Adams <[email protected]>
1 parent 664d93c commit bf651d1

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

pkg/mcp/loader.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type ServerConfig struct {
5656
BaseURL string `json:"baseURL,omitempty"`
5757
Headers []string `json:"headers"`
5858
Scope string `json:"scope"`
59+
AllowedTools []string `json:"allowedTools"`
5960
}
6061

6162
func (s *ServerConfig) GetBaseURL() string {
@@ -99,7 +100,7 @@ func (l *Local) Load(ctx context.Context, tool types.Tool) (result []types.Tool,
99100
}
100101

101102
for server := range maps.Keys(servers.MCPServers) {
102-
tools, err := l.LoadSession(ctx, servers.MCPServers[server], tool.Name)
103+
tools, err := l.LoadTools(ctx, servers.MCPServers[server], tool.Name)
103104
if err != nil {
104105
return nil, fmt.Errorf("failed to load MCP session for server %s: %w", server, err)
105106
}
@@ -111,13 +112,17 @@ func (l *Local) Load(ctx context.Context, tool types.Tool) (result []types.Tool,
111112
return nil, fmt.Errorf("no MCP server configuration found in tool instructions: %s", configData)
112113
}
113114

114-
func (l *Local) LoadSession(ctx context.Context, server ServerConfig, toolName string) ([]types.Tool, error) {
115+
func (l *Local) LoadTools(ctx context.Context, server ServerConfig, toolName string) ([]types.Tool, error) {
116+
allowedTools := server.AllowedTools
117+
// Reset so we don't start a new MCP server, no reason to if one is already running and the allowed tools change.
118+
server.AllowedTools = nil
119+
115120
session, err := l.loadSession(server)
116121
if err != nil {
117122
return nil, err
118123
}
119124

120-
return l.sessionToTools(ctx, session, toolName)
125+
return l.sessionToTools(ctx, session, toolName, allowedTools)
121126
}
122127

123128
func (l *Local) Close() error {
@@ -148,7 +153,9 @@ func (l *Local) Close() error {
148153
return errors.Join(errs...)
149154
}
150155

151-
func (l *Local) sessionToTools(ctx context.Context, session *Session, toolName string) ([]types.Tool, error) {
156+
func (l *Local) sessionToTools(ctx context.Context, session *Session, toolName string, allowedTools []string) ([]types.Tool, error) {
157+
allToolsAllowed := len(allowedTools) == 0 || slices.Contains(allowedTools, "*")
158+
152159
tools, err := session.Client.ListTools(ctx, mcp.ListToolsRequest{})
153160
if err != nil {
154161
return nil, fmt.Errorf("failed to list tools: %w", err)
@@ -158,6 +165,10 @@ func (l *Local) sessionToTools(ctx context.Context, session *Session, toolName s
158165
var toolNames []string
159166

160167
for _, tool := range tools.Tools {
168+
if !allToolsAllowed && !slices.Contains(allowedTools, tool.Name) {
169+
continue
170+
}
171+
161172
var schema openapi3.Schema
162173

163174
schemaData, err := json.Marshal(tool.InputSchema)

pkg/tests/runner2_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ name: mcp
313313
],
314314
"type": "object"
315315
},
316-
"instructions": "#!sys.mcp.invoke.append_insight 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
316+
"instructions": "#!sys.mcp.invoke.append_insight c358c2eb93fa9a98631cd9e4f324d7b59f56aee11c7ae32a00984ad5844dc32c",
317317
"id": "inline:append_insight",
318318
"localTools": {
319319
"append_insight": "inline:append_insight",
@@ -346,7 +346,7 @@ name: mcp
346346
],
347347
"type": "object"
348348
},
349-
"instructions": "#!sys.mcp.invoke.create_table 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
349+
"instructions": "#!sys.mcp.invoke.create_table c358c2eb93fa9a98631cd9e4f324d7b59f56aee11c7ae32a00984ad5844dc32c",
350350
"id": "inline:create_table",
351351
"localTools": {
352352
"append_insight": "inline:append_insight",
@@ -379,7 +379,7 @@ name: mcp
379379
],
380380
"type": "object"
381381
},
382-
"instructions": "#!sys.mcp.invoke.describe_table 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
382+
"instructions": "#!sys.mcp.invoke.describe_table c358c2eb93fa9a98631cd9e4f324d7b59f56aee11c7ae32a00984ad5844dc32c",
383383
"id": "inline:describe_table",
384384
"localTools": {
385385
"append_insight": "inline:append_insight",
@@ -403,7 +403,7 @@ name: mcp
403403
"arguments": {
404404
"type": "object"
405405
},
406-
"instructions": "#!sys.mcp.invoke.list_tables 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
406+
"instructions": "#!sys.mcp.invoke.list_tables c358c2eb93fa9a98631cd9e4f324d7b59f56aee11c7ae32a00984ad5844dc32c",
407407
"id": "inline:list_tables",
408408
"localTools": {
409409
"append_insight": "inline:append_insight",
@@ -505,7 +505,7 @@ name: mcp
505505
],
506506
"type": "object"
507507
},
508-
"instructions": "#!sys.mcp.invoke.read_query 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
508+
"instructions": "#!sys.mcp.invoke.read_query c358c2eb93fa9a98631cd9e4f324d7b59f56aee11c7ae32a00984ad5844dc32c",
509509
"id": "inline:read_query",
510510
"localTools": {
511511
"append_insight": "inline:append_insight",
@@ -538,7 +538,7 @@ name: mcp
538538
],
539539
"type": "object"
540540
},
541-
"instructions": "#!sys.mcp.invoke.write_query 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
541+
"instructions": "#!sys.mcp.invoke.write_query c358c2eb93fa9a98631cd9e4f324d7b59f56aee11c7ae32a00984ad5844dc32c",
542542
"id": "inline:write_query",
543543
"localTools": {
544544
"append_insight": "inline:append_insight",

0 commit comments

Comments
 (0)