@@ -6,8 +6,10 @@ import (
66 "fmt"
77 "iter"
88 "log/slog"
9+ "slices"
910 "strings"
1011
12+ "github.com/charmbracelet/crush/internal/config"
1113 "github.com/charmbracelet/crush/internal/csync"
1214 "github.com/modelcontextprotocol/go-sdk/mcp"
1315)
@@ -119,10 +121,10 @@ func RefreshTools(ctx context.Context, name string) {
119121 return
120122 }
121123
122− updateTools(name, tools)
124+ toolCount := updateTools(name, tools)
123125
124126 prev, _ := states.Get(name)
125− prev.Counts.Tools = len(tools)
127+ prev.Counts.Tools = toolCount
126128 updateState(name, StateConnected, nil, session, prev.Counts)
127129}
128130
@@ -137,10 +139,29 @@ func getTools(ctx context.Context, session *mcp.ClientSession) ([]*Tool, error)
137139 return result.Tools, nil
138140}
139141
140−func updateTools(name string, tools []*Tool) {
142+func updateTools(name string, tools []*Tool) int {
143+ tools = filterDisabledTools(name, tools)
141144 if len(tools) == 0 {
142145 allTools.Del(name)
143− return
146+ return 0
144147 }
145148 allTools.Set(name, tools)
149+ return len(tools)
150+}
151+
152+// filterDisabledTools removes tools that are disabled via config.
153+func filterDisabledTools(mcpName string, tools []*Tool) []*Tool {
154+ cfg := config.Get()
155+ mcpCfg, ok := cfg.MCP[mcpName]
156+ if !ok || len(mcpCfg.DisabledTools) == 0 {
157+ return tools
158+ }
159+
160+ filtered := make([]*Tool, 0, len(tools))
161+ for _, tool := range tools {
162+ if !slices.Contains(mcpCfg.DisabledTools, tool.Name) {
163+ filtered = append(filtered, tool)
164+ }
165+ }
166+ return filtered
146167}