跳到主要内容

MCP 服务器

MCP(Model Context Protocol)服务器给 AI CLI 提供额外的工具能力——读文件、查数据库、调 API。问题在于:同一个 MCP 服务器,在 11 个客户端里要写 11 遍,而且写法各不相同。 配置文件位置不同,格式有 JSON、TOML、YAML,服务器列表的键名不同,传输类型的表达方式也不同。

AI Switch 的 MCP 管理解决的就是这一件事:你写一份规范定义,选中要生效的客户端,它负责翻译成每个客户端认得的形状并写进对应文件。

支持的 11 个客户端

以下路径都是各客户端公开的配置文件位置——AI Switch 只是按这些公开的文件格式读写。

客户端配置文件格式服务器列表键
Codex CLI$CODEX_HOME/config.toml(默认 ~/.codex/config.tomlTOMLmcp_servers
Claude Code~/.claude.jsonJSONmcpServers
Gemini CLI~/.gemini/settings.jsonJSONmcpServers
Grok$GROK_HOME/config.toml(默认 ~/.grok/config.tomlTOMLmcp_servers
OpenCode~/.config/opencode/opencode.jsonJSONmcpServers(兼容旧 mcp
OpenClaw~/.openclaw/openclaw.jsonJSONmcp.servers(嵌套)
Hermes Agent$HERMES_HOME/config.yaml(默认 ~/.hermes/config.yamlYAMLmcp_servers
Cline~/.cline/data/settings/cline_mcp_settings.jsonJSONmcpServers
Cursor~/.cursor/mcp.jsonJSONmcpServers
Kimi Code$KIMI_CODE_HOME/mcp.json(默认 ~/.kimi-code/mcp.jsonJSONmcpServers
CodeBuddy~/.codebuddy.jsonJSONmcpServers

四个客户端支持环境变量覆盖主目录(CODEX_HOMEGROK_HOMEHERMES_HOMEKIMI_CODE_HOME),AI Switch 会先读环境变量再回落到默认路径。

Claude Code 和 CodeBuddy 还各有一个辅助文件(~/.claude/settings.json~/.codebuddy/settings.json),用于插件启用状态;AI Switch 在需要时一并维护。

一份规范定义

界面上你填的是一个 JSON 对象,这是 AI Switch 自己的规范形状(canonical spec),不是任何某个客户端的原生格式:

json
{
  "type": "stdio",
  "command": "npx",
  "args": ["-y", "@modelcontextprotocol/server-filesystem", "."]
}

type 有三个取值:

type需要的字段说明
stdiocommand,可选 argsenvcwd本地进程,通过标准输入输出通信
sseurl,可选 headersServer-Sent Events 远程服务器
httpurl,可选 headers可流式 HTTP 远程服务器

完整字段:

字段适用传输说明
commandstdio可执行文件
argsstdio参数数组
envstdio环境变量对象
cwdstdio工作目录
urlsse / http服务器地址
headerssse / http请求头对象,常用于放 token

JSON 语法错误会在保存前被拦下(mcp.invalidJson),字段不合法则由后端返回 mcp.invalid_spec

服务器 ID 也有校验:不能为空,不能含路径分隔符或其他会破坏配置文件结构的字符,否则返回 mcp.invalid_server_id

规范化解决了什么

这是这个功能真正的价值所在。同一份定义写进不同客户端时,会按各客户端公开的配置格式做以下调整:

差异具体处理
文件格式JSON / TOML / YAML 三种序列化器,各自保留原文件里的其他配置段
服务器列表键名mcpServers / mcp_servers / 嵌套的 mcp.servers 三种写法
传输字段名有的用 type,有的用 transport,有的干脆不写传输字段
HTTP 的叫法部分客户端把可流式 HTTP 写成 streamableHttp 而不是 http
请求头键名Codex 的 TOML 里叫 http_headers,双向映射到规范里的 headers
命令的表达OpenCode 的旧式 mcp 段把命令写成数组 [命令, ...参数],环境变量键叫 environment
多余字段Cursor 只保留它认识的键;Grok 的条目里的 enabledrequired 等额外键在改写时原样保留

有一个能力差异必须显式处理:Codex CLI 不支持 SSE 传输。 给它写 type: "sse" 的服务器会被拒绝,错误码 mcp.unsupported_transport。想让 Codex 用同一个远程服务器,改成 http 传输(如果对方支持)或用 stdio 代理。

如果选中的客户端里没有一个能接受当前定义,会返回 mcp.no_compatible_client

写入是原子的

改配置文件这件事有风险——用户可能正在用那个 CLI,写一半崩了就把配置弄坏了。所以写入流程是:

  1. 读现有文件。文件不存在等同于空对象,不会报错,也不会因此丢掉本来没有的其他配置。
  2. 在内存里的数据结构上只改 MCP 相关的那一段,其他配置段原样保留。
  3. 序列化,写进同目录下的临时文件(名字形如 .config.toml.ai-switch-<uuid>)。
  4. 重命名覆盖目标文件。

同目录内的 rename 在主流文件系统上是原子操作,所以任何时刻读到的都是完整的旧文件或完整的新文件。

读文件失败(权限、磁盘)返回 mcp.config_io;文件存在但解析不出来(手工改坏了)返回 mcp.config_invalid——这种情况 AI Switch 不会猜着修复,它宁可报错也不覆盖你可能还想抢救的内容。

手工改过的配置文件

如果某个客户端的配置文件里有语法错误(比如 TOML 里少了引号),AI Switch 无法写入该客户端并会报 mcp.config_invalid。先用编辑器修好语法,再回来重试。

本地服务器管理

MCP 界面分「本地」和「市场」两个视图。本地视图管你已经配置的服务器。

每张服务器卡片显示:服务器 ID、传输类型徽标、commandurl、以及一排客户端标签——标签就是这个服务器当前生效于哪些客户端

新建或编辑时需要填三样:

  1. 服务器 ID:在各客户端配置文件里作为键名。
  2. 规范 JSON:上一节那个对象。
  3. 目标客户端:至少选一个。默认勾选 Codex CLI 和 Claude Code。

ID 为空或没勾任何客户端时保存按钮是禁用的。删除会先弹确认框,因为它会同时从所有相关客户端的配置文件里移除该条目。

市场

市场视图接了两个来源:

来源说明
官方 MCP 注册表Model Context Protocol 官方的服务器注册表
Smithery第三方 MCP 服务器目录

搜索单次返回最多 30 条。点开一条会进详情弹窗,里面有描述、主页链接、目标客户端选择器,以及两块由市场元数据驱动的动态内容:

  • 传输选择:一个服务器可能同时提供 stdio 和远程安装方式,多于一种时给出选择。
  • 参数表单:市场声明的每个参数会渲染成对应控件——枚举变成下拉框,布尔变成复选框,JSON 变成多行文本框,密钥类型变成密码框,数字类型变成数字输入。任何必填参数没填,安装按钮就是禁用的。

安装本质上就是"帮你把规范定义填好,然后走和手工新建完全相同的写入流程",之后它和手工配的服务器没有任何区别。

市场相关错误:网络失败 mcp.marketplace_network,返回数据不合法 mcp.marketplace_invalid,找不到指定服务器 mcp.marketplace_not_found

市场里的服务器不是 AI Switch 审核过的

市场只是把上游目录的内容列出来。装一个 MCP 服务器意味着让你的 AI CLI 能执行它提供的工具,等同于运行第三方代码。装之前看一眼它的主页和源码,尤其是需要填密钥的那些。

生效时机

MCP 配置是客户端启动时读取的。AI Switch 写完文件之后,已经在运行的 CLI 进程不会自动感知。

所以正确的顺序是:先在 AI Switch 里配好,再启动(或重启)CLI。在 Vibe 终端 里改完配置之后新开一个标签,就自然满足这个顺序。

下一步

基于 MIT 许可发布