前言¶
在 DeepSeek Harness(DSH)中,MCP 客户端是以进程全局的方式注册工具的。这意味着 @deepseek-ai/dsh-mcp-client 会将所有 MCP 服务器的工具列表注入到 ctx.tools,并以 mcp__<serverName>__<toolName> 的形式存在。因此,即使一个会话仅用于处理 Jira 任务,它也可能携带了三个数据库服务器和一个浏览器驱动,不仅占用了上下文窗口,还可能被误调用。
dsh-mcp-workspace-scope 插件通过目录维度对 MCP 工具注入进行限制。它允许你定义一个目录白名单,子目录自动继承该规则,同时提供会话级别的临时开关,在规则之外按需启用服务。
插件简介¶
- 名称: dsh-mcp-workspace-scope
- 维护者: felix-lj-ct
- 类别: admin-security
- 许可: MIT
该插件通过隐藏工具和拒绝调用两种机制,在保持 MCP 服务运行的同时,为每个项目提供清晰的工具边界。
核心功能¶
- 目录级白名单: 定义每个目录允许使用的 MCP 服务器列表,子目录自动继承父级规则。
- 双重拒绝机制: 不仅隐藏工具,还在调用时进行拒绝(
guard),提供硬性边界。 - 会话级临时开关: 在 Composer 中提供 Pill 组件,允许在当前会话中临时启用或禁用特定服务器。
- 状态诚实读出: 显示服务器的运行时状态,能够识别“已允许但已死”的服务器。
- 可视化编辑器: 提供设置页面的规则编辑器,支持从已知工作区下拉选择。
安装与启用¶
安装插件需要指定 profile(例如 web)。安装后需要重启 profile 才能生效。
dsh plugin --profile web add dsh-mcp-workspace-scope
重启 profile:
dsh --profile web
安装后,插件会在 profile 的 cordis.patch.yml 中挂载 Host 层。默认配置文件路径为 ~/.dsh/mcp-workspace-scope.json。若不存在该文件,插件将不生效,所有会话仍将注入所有 MCP 服务器。
规则配置¶
规则文件采用 JSON 格式,包含 default 和 rules 两个顶层字段。
- default: 控制未匹配到任何规则的目录(即根目录或未被显式覆盖的路径)的行为。可以是
"*"(注入全部)、[](注入全部禁用)或一个服务器名称数组。 - rules: 数组,每一项包含
path(目录)和servers(允许的服务器列表)。
配置示例 (~/.dsh/mcp-workspace-scope.json)
{
"default": "*",
"rules": [
{
"path": "D:/work/frontend",
"servers": ["playwright", "context7"]
},
{
"path": "D:/work/master-data-management",
"servers": ["atlassian", "bigquery"]
}
]
}
匹配规则
- 子目录继承父目录规则。
- 采用最长路径匹配优先原则。
- 相同长度的规则中,后定义的优先。
- 规则修改会立即应用于正在运行会话(可通过配置
applyToRunningSessions冻结此行为)。
使用与交互¶
- 启用/禁用: 在 Composer 中,会话旁边会出现 MCP Scope Pill。点击 Pill 可以在当前会话中临时启用或禁用特定服务器,无需修改全局规则。
- UI 编辑: 在设置页面的 “MCP scope” 区域,可以直接通过 UI 编辑器添加规则、选择目录和服务器。
限制与注意¶
- 不可凭空启用: 该插件仅支持“减法”操作,不能启用在 profile 中已被禁用的服务器。
- 内存占用: 被隐藏的服务器仍在运行并占用内存。若需完全停止服务,应将其移至 Agent Preset。
- 子代理隔离: 子代理的范围由其自身的工作目录决定,不继承父代理的限制。
- 运行时重载: 规则变更(无论是通过 UI 保存还是直接编辑文件)会立即重新计算并应用于当前会话。
总结¶
dsh-mcp-workspace-scope 解决了 DSH 环境中 MCP 工具污染上下文的问题。它通过目录继承和会话级开关,帮助开发者构建更干净的上下文边界。
- GitHub 仓库: https://github.com/felix-lj-ct/dsh-mcp-workspace-scope
- 插件目录: https://www.skillhub.cn/plugins/felix-lj-ct/dsh-mcp-workspace-scope