Skip to content

[FEATURE]: Filter which tools are loaded from MCP servers (includeTools/excludeTools) #7399

@marcusquinn

Description

@marcusquinn

Feature hasn't been suggested before.

  • I have verified this feature I'm about to request hasn't been suggested before.

Describe the enhancement you want to request

Problem

MCP servers often expose many tools, but agents typically need only a subset. Currently, enabling an MCP loads all its tools into the context window, adding significant token overhead.

Example: The chrome-devtools MCP provides 26 tools (~17k tokens). A UI preview agent might only need 4 of them (~1.5k tokens).

Proposed Solution

Add includeTools and/or excludeTools to MCP configuration:

{
  "mcp": {
    "chrome-devtools": {
      "command": "npx",
      "args": ["-y", "chrome-devtools-mcp@latest"],
      "includeTools": ["navigate_page", "take_screenshot", "new_page", "list_pages"]
    }
  }
}

Or with glob patterns:

{
  "mcp": {
    "github": {
      "includeTools": ["create_*", "list_*"],
      "excludeTools": ["*_dangerous_*"]
    }
  }
}

Per-Agent Override

Combined with per-agent MCP enabling, this allows fine-grained control:

{
  "mcp": {
    "chrome-devtools": {
      "enabled": false,
      "includeTools": ["navigate_page", "take_screenshot", "new_page", "list_pages"]
    }
  },
  "agent": {
    "ui-preview": {
      "mcp": {
        "chrome-devtools": { "enabled": true }
      }
    }
  }
}

Prior Art

Amp recently shipped this feature: Lazy-load MCP with Skills

Their implementation uses a companion mcp.json file per skill. The approach proposed here integrates with OpenCode's existing centralized config pattern.

Benefits

  • Token savings: Load only needed tools (17k → 1.5k in the chrome-devtools example)
  • Reduced confusion: LLM sees only relevant tools
  • Backward compatible: No includeTools = all tools (current behavior)

Related Issues

Contribution

Happy to submit a PR for this if the approach is acceptable. We're tracking this in aidevops and can implement a workaround in the meantime, but native OpenCode support would be cleaner.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions