Skip to content

Commit 43aca8f

Browse files
authored
chore: separate the LoadSession function in the MCP loader (#966)
enhance: add the ability to specify allow tools for MCP servers Signed-off-by: Donnie Adams <[email protected]>
1 parent ed2fc20 commit 43aca8f

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

pkg/mcp/loader.go

Lines changed: 23 additions & 3 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,18 +100,31 @@ func (l *Local) Load(ctx context.Context, tool types.Tool) (result []types.Tool,
99100
}
100101

101102
for server := range maps.Keys(servers.MCPServers) {
102-
session, err := l.loadSession(servers.MCPServers[server])
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
}
106107

107-
return l.sessionToTools(ctx, session, tool.Name)
108+
return tools, nil
108109
}
109110

110111
// This should never happen, but just in case
111112
return nil, fmt.Errorf("no MCP server configuration found in tool instructions: %s", configData)
112113
}
113114

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+
120+
session, err := l.loadSession(server)
121+
if err != nil {
122+
return nil, err
123+
}
124+
125+
return l.sessionToTools(ctx, session, toolName, allowedTools)
126+
}
127+
114128
func (l *Local) Close() error {
115129
if l == nil {
116130
return nil
@@ -139,7 +153,9 @@ func (l *Local) Close() error {
139153
return errors.Join(errs...)
140154
}
141155

142-
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+
143159
tools, err := session.Client.ListTools(ctx, mcp.ListToolsRequest{})
144160
if err != nil {
145161
return nil, fmt.Errorf("failed to list tools: %w", err)
@@ -149,6 +165,10 @@ func (l *Local) sessionToTools(ctx context.Context, session *Session, toolName s
149165
var toolNames []string
150166

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

154174
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)