@@ -6,8 +6,10 @@ import (
12+ "github.com/charmbracelet/crush/internal/config"
11 "github.com/charmbracelet/crush/internal/csync"
13 "github.com/charmbracelet/crush/internal/csync"
12 "github.com/modelcontextprotocol/go-sdk/mcp"
14 "github.com/modelcontextprotocol/go-sdk/mcp"
@@ -119,10 +121,10 @@ func RefreshTools(ctx context.Context, name string) {
122− updateTools(name, tools)
124+ toolCount := updateTools(name, tools)
124 prev, _ := states.Get(name)
126 prev, _ := states.Get(name)
125− prev.Counts.Tools = len(tools)
127+ prev.Counts.Tools = toolCount
126 updateState(name, StateConnected, nil, session, prev.Counts)
128 updateState(name, StateConnected, nil, session, prev.Counts)
@@ -137,10 +139,29 @@ func getTools(ctx context.Context, session *mcp.ClientSession) ([]*Tool, error)
137 return result.Tools, nil
139 return result.Tools, nil
140−func updateTools(name string, tools []*Tool) {
142+func updateTools(name string, tools []*Tool) int {
143+ tools = filterDisabledTools(name, tools)
141 if len(tools) == 0 {
144 if len(tools) == 0 {
142 allTools.Del(name)
145 allTools.Del(name)
145 allTools.Set(name, tools)
148 allTools.Set(name, tools)
152+// filterDisabledTools removes tools that are disabled via config.
153+func filterDisabledTools(mcpName string, tools []*Tool) []*Tool {
155+ mcpCfg, ok := cfg.MCP[mcpName]
156+ if !ok || len(mcpCfg.DisabledTools) == 0 {
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)