# dsh-mcp-master

[English](README.md) | 中文

**面向 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的 MCP Master。** 按会话选择要使用的 MCP 服务器 —— 来自**全局**列表和工作区的**项目**列表。选择器就在输入框工具栏、模型选择器的左边：新建会话时选，会话开始后也能像切换模型一样随时切换。

- **项目服务器**来自其他 Agent 已在使用的文件：`.mcp.json`（Claude Code）、`.cursor/mcp.json`、`.vscode/mcp.json`、`.dsh/mcp.json`。
- **全局服务器**来自 `~/.dsh/mcp-master/mcp.json`（同样的 `mcpServers` 格式）。同名时项目服务器覆盖全局服务器。

## 选择器

`[ 🔌 MCP 2 ● ]  [ 模型 ▾ ]  [ ➤ ]` —— 出现在每个会话（包括刚新建、还没发消息的会话）的输入框工具栏中。

- **不用时零占位**：没有任何全局或项目服务器时不显示。
- **标签**：本会话启用的服务器数量 + 一个汇总状态点（绿：已连接 · 黄：需要登录 · 红：出错 · 闪烁：启动中）。小蓝点表示有待确认信任的项目服务器。
- **面板**（点击标签打开；Esc / 点击外部关闭）：分「项目」「全局」两组。每行的**勾选框 = 在本会话中使用**，另有状态、传输方式、`默认` 标记，以及行内「登录 / 重试」。展开一行可查看命令/URL（配置原文，不展开变量）、认证方式、服务端版本、工具列表、日志，以及重新连接、退出登录、撤销信任。
- **底栏**：显示新会话默认启用哪些服务器；「设为新会话默认」把当前选择保存为该工作区默认（「恢复按配置文件」回到文件中 `enabled` 标记的默认值）。
- 只使用主题 token（跟随亮/暗色），文案跟随「设置 → 通用 → 语言」。

## 会话如何获得服务器

| 主题 | 说明 |
|---|---|
| 新会话 | 从工作区默认开始：已保存的默认；否则为所有已信任、且在文件中未标记 `"enabled": false` / `"disabled": true` 的服务器。 |
| 分叉与子 Agent | 继承父会话（`parentSession`）的选择。 |
| 会话中切换 | 勾选/取消只在**本会话**注册/注销该服务器的工具，从下一步开始生效。工具的增减由 DSH 自己记录在会话日志中（`developer/message` 的 tool-addition/removal），因此历史、恢复和重放保持一致 —— 这与 Agent preset 不同：preset 是整套插件组合，会话开始后就被锁定。 |
| 持久化 | 选择、默认值、信任与 OAuth 令牌保存在 `~/.dsh/mcp-master/state.json`（0600），不会修改任何配置文件。 |
| 进程生命周期 | 只要有活动会话（或在界面中打开但尚未开始的会话）选中某服务器，它就保持运行；最后一个会话取消选择 2 分钟后停止；工作区没有会话也没人查看 15 分钟后整体关闭。 |

## 信任（项目服务器）

克隆下来的仓库里的 `.mcp.json` 可以运行任意命令，所以项目服务器必须先**信任**才能运行（与 Claude Code 对项目级服务器的审批一致）。勾选未信任的服务器时会展示确切的命令/URL，点击「信任并启用」。信任按工作区保存并绑定配置原文：命令、参数、环境变量、URL 或请求头一旦变化，服务器会变为「配置已变更」，需要再次确认。全局服务器由你自己维护，始终受信任。`autoTrust: true` 可跳过确认。

## 传输与认证

- **stdio**（独立进程组，连同子进程回收；工作目录为工作区根目录）、**Streamable HTTP**（会话 ID、SSE 响应、`list_changed` 推送）、**旧版 HTTP+SSE**（自动回退）；会响应服务端的 `ping` / `roots/list`。
- **OAuth** 遵循 MCP 授权规范：RFC 9728 → RFC 8414/OIDC 发现 → RFC 7591 动态客户端注册 → 授权码 + PKCE(S256)（携带 RFC 8707 `resource`），之后自动刷新。令牌按服务器 URL 保存，登录一次所有工作区通用。显式配置的 `Authorization` 头原样使用；不支持动态注册的服务商可配置 `"oauth": { "clientId", "clientSecret", "scope" }`。
- **变量**：`${VAR}`、`${VAR:-默认值}`、`${env:VAR}`、`${workspaceFolder}`，取值来自 DSH 进程环境叠加登录 shell 环境（`~/.zshrc` 中导出的变量和 shell `PATH` 在桌面版中同样可用）。
- **工具**命名为 `mcp__<服务器>__<工具>`，与内置 MCP 客户端一致；输入 schema 会折叠为注册表支持的 JSON Schema 子集；带 `readOnlyHint` 的工具可并行执行。

## 配置（可选）

见 [README.md](README.md#configuration-optional)。

## 开发

```sh
pnpm install
pnpm run verify          # 构建 + 类型检查 + 测试
```

重新构建已安装的副本后需要重启 DSH：Host 模块是 ES module，不会被原地重新加载。

## 许可

MIT
