@@ -275,6 +275,7 @@ using `$(echo $VAR)` syntax.
"args": ["/path/to/mcp-server.js"],
"timeout": 120,
"disabled": false,
+ "disabled_tools": ["some-tool-name"],
"env": {
"NODE_ENV": "production"
}
@@ -284,6 +285,7 @@ using `$(echo $VAR)` syntax.
"url": "https://api.githubcopilot.com/mcp/",
"timeout": 120,
"disabled": false,
+ "disabled_tools": ["create_issue", "create_pull_request"],
"headers": {
"Authorization": "Bearer $GH_PAT"
}
@@ -335,6 +337,26 @@ permissions. Use this with care.
You can also skip all permission prompts entirely by running Crush with the
`--yolo` flag. Be very, very careful with this feature.
+### Disabling Built-In Tools
+
+If you'd like to prevent Crush from using certain built-in tools entirely, you
+can disable them via the `options.disabled_tools` list. Disabled tools are
+completely hidden from the agent.
+
+```json
+{
+ "$schema": "https://charm.land/crush.json",
+ "options": {
+ "disabled_tools": [
+ "bash",
+ "sourcegraph"
+ ]
+ }
+}
+```
+
+To disable tools from MCP servers, see the [MCP config section](#mcps).
+
### Initialization
When you initialize a project, Crush analyzes your codebase and creates
@@ -388,6 +388,12 @@ func (c *coordinator) buildTools(ctx context.Context, agent config.Agent) ([]fan
}
for _, tool := range tools.GetMCPTools(c.permissions, c.cfg.WorkingDir()) {
+ // Check MCP-specific disabled tools.
+ if mcpCfg, ok := c.cfg.MCP[tool.MCP()]; ok {
+ if slices.Contains(mcpCfg.DisabledTools, tool.MCPToolName()) {
+ continue
+ }
+ }
if agent.AllowedMCP == nil {
// No MCP restrictions
filteredTools = append(filteredTools, tool)
@@ -144,13 +144,14 @@ const (
)
type MCPConfig struct {
- Command string `json:"command,omitempty" jsonschema:"description=Command to execute for stdio MCP servers,example=npx"`
- Env map[string]string `json:"env,omitempty" jsonschema:"description=Environment variables to set for the MCP server"`
- Args []string `json:"args,omitempty" jsonschema:"description=Arguments to pass to the MCP server command"`
- Type MCPType `json:"type" jsonschema:"required,description=Type of MCP connection,enum=stdio,enum=sse,enum=http,default=stdio"`
- URL string `json:"url,omitempty" jsonschema:"description=URL for HTTP or SSE MCP servers,format=uri,example=http://localhost:3000/mcp"`
- Disabled bool `json:"disabled,omitempty" jsonschema:"description=Whether this MCP server is disabled,default=false"`
- Timeout int `json:"timeout,omitempty" jsonschema:"description=Timeout in seconds for MCP server connections,default=15,example=30,example=60,example=120"`
+ Command string `json:"command,omitempty" jsonschema:"description=Command to execute for stdio MCP servers,example=npx"`
+ Env map[string]string `json:"env,omitempty" jsonschema:"description=Environment variables to set for the MCP server"`
+ Args []string `json:"args,omitempty" jsonschema:"description=Arguments to pass to the MCP server command"`
+ Type MCPType `json:"type" jsonschema:"required,description=Type of MCP connection,enum=stdio,enum=sse,enum=http,default=stdio"`
+ URL string `json:"url,omitempty" jsonschema:"description=URL for HTTP or SSE MCP servers,format=uri,example=http://localhost:3000/mcp"`
+ Disabled bool `json:"disabled,omitempty" jsonschema:"description=Whether this MCP server is disabled,default=false"`
+ DisabledTools []string `json:"disabled_tools,omitempty" jsonschema:"description=List of tools from this MCP server to disable,example=get-library-doc"`
+ Timeout int `json:"timeout,omitempty" jsonschema:"description=Timeout in seconds for MCP server connections,default=15,example=30,example=60,example=120"`
// TODO: maybe make it possible to get the value from the env
Headers map[string]string `json:"headers,omitempty" jsonschema:"description=HTTP headers for HTTP/SSE MCP servers"`
@@ -221,7 +222,7 @@ type Options struct {
DebugLSP bool `json:"debug_lsp,omitempty" jsonschema:"description=Enable debug logging for LSP servers,default=false"`
DisableAutoSummarize bool `json:"disable_auto_summarize,omitempty" jsonschema:"description=Disable automatic conversation summarization,default=false"`
DataDirectory string `json:"data_directory,omitempty" jsonschema:"description=Directory for storing application data (relative to working directory),default=.crush,example=.crush"` // Relative to the cwd
- DisabledTools []string `json:"disabled_tools" jsonschema:"description=Tools to disable"`
+ DisabledTools []string `json:"disabled_tools,omitempty" jsonschema:"description=List of built-in tools to disable and hide from the agent,example=bash,example=sourcegraph"`
DisableProviderAutoUpdate bool `json:"disable_provider_auto_update,omitempty" jsonschema:"description=Disable providers auto-update,default=false"`
Attribution *Attribution `json:"attribution,omitempty" jsonschema:"description=Attribution settings for generated content"`
DisableMetrics bool `json:"disable_metrics,omitempty" jsonschema:"description=Disable sending metrics,default=false"`
@@ -229,6 +229,16 @@
"description": "Whether this MCP server is disabled",
"default": false
},
+ "disabled_tools": {
+ "items": {
+ "type": "string",
+ "examples": [
+ "get-library-doc"
+ ]
+ },
+ "type": "array",
+ "description": "List of tools from this MCP server to disable"
+ },
"timeout": {
"type": "integer",
"description": "Timeout in seconds for MCP server connections",
@@ -386,10 +396,14 @@
},
"disabled_tools": {
"items": {
- "type": "string"
+ "type": "string",
+ "examples": [
+ "bash",
+ "sourcegraph"
+ ]
},
"type": "array",
- "description": "Tools to disable"
+ "description": "List of built-in tools to disable and hide from the agent"
},
"disable_provider_auto_update": {
"type": "boolean",
@@ -418,10 +432,7 @@
}
},
"additionalProperties": false,
- "type": "object",
- "required": [
- "disabled_tools"
- ]
+ "type": "object"
},
"Permissions": {
"properties": {