@@ -142,7 +142,10 @@ func getTools(ctx context.Context, session *ClientSession) ([]*Tool, error) {
142142}
143143
144144func updateTools(cfg *config.ConfigStore, name string, tools []*Tool) int {
145− tools = filterDisabledTools(cfg, name, tools)
145+ mcpCfg, ok := cfg.Config().MCP[name]
146+ if ok {
147+ tools = filterTools(mcpCfg, tools)
148+ }
146149 if len(tools) == 0 {
147150 allTools.Del(name)
148151 return 0
@@ -151,20 +154,30 @@ func updateTools(cfg *config.ConfigStore, name string, tools []*Tool) int {
151154 return len(tools)
152155}
153156
154−// filterDisabledTools removes tools that are disabled via config.
155−func filterDisabledTools(cfg *config.ConfigStore, mcpName string, tools []*Tool) []*Tool {
156− mcpCfg, ok := cfg.Config().MCP[mcpName]
157− if !ok || len(mcpCfg.DisabledTools) == 0 {
158− return tools
157+// filterTools filters tools based on enabled_tools (allow list) and
158+// disabled_tools (deny list) from the MCP config.
159+func filterTools(mcpCfg config.MCPConfig, tools []*Tool) []*Tool {
160+ if len(mcpCfg.EnabledTools) > 0 {
161+ filtered := make([]*Tool, 0, len(mcpCfg.EnabledTools))
162+ for _, tool := range tools {
163+ if slices.Contains(mcpCfg.EnabledTools, tool.Name) {
164+ filtered = append(filtered, tool)
165+ }
166+ }
167+ tools = filtered
159168 }
160169
161− filtered := make([]*Tool, 0, len(tools))
162− for _, tool := range tools {
163− if !slices.Contains(mcpCfg.DisabledTools, tool.Name) {
164− filtered = append(filtered, tool)
170+ if len(mcpCfg.DisabledTools) > 0 {
171+ filtered := make([]*Tool, 0, len(tools))
172+ for _, tool := range tools {
173+ if !slices.Contains(mcpCfg.DisabledTools, tool.Name) {
174+ filtered = append(filtered, tool)
175+ }
165176 }
177+ tools = filtered
166178 }
167− return filtered
179+
180+ return tools
168181}
169182
170183// ensureRawBytes normalizes MCP media data into raw binary bytes.