@@ -142,7 +142,10 @@ func getTools(ctx context.Context, session *ClientSession) ([]*Tool, error) {
144func updateTools(cfg *config.ConfigStore, name string, tools []*Tool) int {
144func updateTools(cfg *config.ConfigStore, name string, tools []*Tool) int {
145− tools = filterDisabledTools(cfg, name, tools)
145+ mcpCfg, ok := cfg.Config().MCP[name]
147+ tools = filterTools(mcpCfg, tools)
146 if len(tools) == 0 {
149 if len(tools) == 0 {
147 allTools.Del(name)
150 allTools.Del(name)
@@ -151,20 +154,30 @@ func updateTools(cfg *config.ConfigStore, name string, tools []*Tool) int {
151 return len(tools)
154 return len(tools)
154−// filterDisabledTools removes tools that are disabled via config.
157+// filterTools filters tools based on enabled_tools (allow list) and
155−func filterDisabledTools(cfg *config.ConfigStore, mcpName string, tools []*Tool) []*Tool {
158+// disabled_tools (deny list) from the MCP config.
156− mcpCfg, ok := cfg.Config().MCP[mcpName]
159+func filterTools(mcpCfg config.MCPConfig, tools []*Tool) []*Tool {
157− if !ok || len(mcpCfg.DisabledTools) == 0 {
160+ if len(mcpCfg.EnabledTools) > 0 {
158− return tools
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)
170+ if len(mcpCfg.DisabledTools) > 0 {
161− filtered := make([]*Tool, 0, len(tools))
171+ filtered := make([]*Tool, 0, len(tools))
162− for _, tool := range tools {
172+ for _, tool := range tools {
163− if !slices.Contains(mcpCfg.DisabledTools, tool.Name) {
173+ if !slices.Contains(mcpCfg.DisabledTools, tool.Name) {
164− filtered = append(filtered, tool)
174+ filtered = append(filtered, tool)
167− return filtered
180+ return tools
170// ensureRawBytes normalizes MCP media data into raw binary bytes.
183// ensureRawBytes normalizes MCP media data into raw binary bytes.