详解 MCP:协议解释和几个配置类型列举

介绍MCP:

在 MCP 出现之前,如果你想让一个 AI 访问你的 GitHub 仓库、查询你的数据库、或者读取你本地的文件,你得为每一个工具单独写一套集成代码。每个 AI 产品有自己的插件系统,每个工具有自己的 API 格式,互相之间完全不通用。

MCP(Model Context Protocol)做的事情很简单:它定义了一套标准的通信协议,让 AI 客户端和外部工具之间可以用同一种”语言”对话。你可以把它想象成 AI 世界的 USB-C 接口——不管你是什么设备,插上就能用。

Anthropic 在 2024 年初把 MCP 开源发布,紧接着 OpenAI 在 2025 年 3 月宣布在 ChatGPT 中支持 MCP,Google 也在 4 月确认了 Gemini 的支持计划。到今天,Block、Replit、Sourcegraph 等一大批公司都已经有了自己的 MCP 实现。这个协议已经从 Anthropic 的”自家标准”变成了行业共识。

架构很简单:Client、Server、Protocol

MCP 的架构其实并不复杂,核心就三个角色。

MCP Client 就是你正在用的 AI 应用,比如 Claude Desktop、Claude Code、Cursor、VS Code 里的 Copilot,或者 OpenAI 的 Codex CLI。它负责向外发送请求,问 MCP Server 要信息或者执行操作。

MCP Server 就是那个提供能力的”适配器”。它可以是一个本地运行的小程序,也可以是一个远程部署的 HTTP 服务。它把某个工具的功能——比如查 GitHub Issue、读本地文件、查数据库——包装成标准化的接口暴露出来。

所有通信都基于 JSON-RPC 2.0 协议。Client 发一个请求,Server 返回一个响应,格式统一,逻辑清晰。

一个典型的连接生命周期是这样的:Client 先发一个初始化请求,告诉 Server 自己支持什么版本和能力;Server 回复自己的版本和能力;Client 确认收到,然后正常的消息交换就开始了。

传输层:三种方式,怎么选

这是很多人最困惑的地方。MCP 定义了几种不同的传输方式,每种适用于不同的场景。

stdio:本地开发的首选

stdio 是最简单也最常用的传输方式。它的工作原理就跟你在终端里运行一个命令行程序差不多:Client 把 MCP Server 作为一个子进程启动,然后通过标准输入(stdin)发送消息,通过标准输出(stdout)接收消息。

这种方式的好处很明显。启动快、延迟低、不需要网络配置、不需要端口管理。你在本地装一个 npm 包或者 Python 包,直接就能用。绝大多数你在社区看到的 MCP Server,默认走的都是 stdio。

但它的局限性也很明显——只能在本地用。MCP Server 必须安装在你自己的机器上,没法多人共享,也没法部署到云端。

SSE:已经过时的远程方案

SSE(Server-Sent Events)是 MCP 最早期的远程传输方案,定义在 2024 年 11 月的协议版本中。它需要两个端点:一个 SSE 端点用于建立持久连接让 Server 推送消息,一个 HTTP POST 端点用于 Client 向 Server 发送请求。

这个方案的问题在于,它要求维持一条永久的连接。连接一旦断开,所有状态都会丢失。而且两个端点的设计增加了部署和调试的复杂度。

2025 年 3 月的协议更新已经把 SSE 标记为”已弃用”,取而代之的是 Streamable HTTP。但你在现有的很多教程和配置里还会看到 SSE 的身影,因为不少 MCP Server 还没来得及迁移。

Streamable HTTP:现在的推荐方案

Streamable HTTP 在 2025 年 3 月 26 日的协议版本中被引入,是目前推荐的远程传输方式。它解决了 SSE 的所有痛点:只需要一个 HTTP 端点,同时支持 POST 和 GET 方法,支持可选的 SSE 流式传输,还有 Session ID 机制来维护状态。

具体来说,Client 向一个统一的 MCP 端点发送 HTTP POST 请求,Server 可以直接返回 HTTP 响应,也可以选择用 SSE 流式推送多条消息。这种设计让简单的请求-响应交互和复杂的流式通信都能在同一个架构下实现。

如果你现在要构建一个新的远程 MCP Server,直接用 Streamable HTTP 就行。如果你有已经在线运行的 SSE Server,可以同时支持两种传输方式来保持向后兼容。TypeScript SDK 从 1.10.0 版本开始就支持 Streamable HTTP 了。

简单总结一下选择逻辑:本地工具用 stdio,远程服务用 Streamable HTTP,SSE 只在兼容老服务器时才用。

各工具的 MCP 配置:大同中有小异

虽然所有工具都在用 MCP 协议,但每个工具的配置方式却各有各的风格。下面我把主流工具的配置方式拆开来讲。

Claude Desktop:JSON 配置文件

Claude Desktop 的 MCP 配置通过一个 JSON 文件来管理。在 macOS 上,这个文件的路径是 ~/Library/Application Support/Claude/claude_desktop_config.json,在 Windows 上是 %APPDATA%\Claude\claude_desktop_config.json

一个典型的配置长这样:

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx"
      }
    }
  }
}

注意 Claude Desktop 传统上主要支持 stdio 方式的本地 Server。如果你想连远程 SSE Server,需要借助 mcp-remote 这样的 npm 包做桥接。不过随着协议的演进,Claude Desktop 现在也可以通过”连接器(Connectors)”功能添加远程 Server。

每次修改配置之后,必须重启 Claude Desktop 才能生效。

Claude Code:CLI 优先,三种作用域

Claude Code 的 MCP 配置方式最灵活,也最适合开发者的工作流。它提供了命令行工具来管理 MCP Server,同时支持三种作用域(scope)。

添加一个 Server 最简单的方式:

# stdio 本地 Server
claude mcp add github -- npx -y @modelcontextprotocol/server-github

# HTTP 远程 Server
claude mcp add --transport http notion https://mcp.notion.com/mcp

# SSE(已弃用,但仍可用)
claude mcp add --transport sse asana https://mcp.asana.com/sse

三种作用域的区别很重要:

Local 作用域(默认):配置存储在 ~/.claude.json 中,按项目路径区分。只对你自己、在当前项目中生效。适合实验性质的配置或者包含敏感凭证的场景。

Project 作用域:配置存储在项目根目录的 .mcp.json 文件中。这个文件可以提交到 Git,团队成员都能共享。适合团队标准工具,比如共用的 Sentry 监控或者项目数据库。

User 作用域:配置存储在全局 ~/.claude.json 中,所有项目通用。适合你个人常用的工具,比如 Perplexity 搜索或者 Context7 文档查询。

作用域的优先级是 Local > Project > User。这意味着你可以在 .mcp.json 里放团队共享的 Server 配置,然后在本地用 Local 作用域覆盖认证凭证,保持 Server 名称一致的同时让密钥保持私有。

Claude Code 还有一个巧妙的能力:它可以同时当 MCP Client 和 MCP Server。运行 claude mcp serve,其他工具比如 Cursor 或者 Claude Desktop 就可以通过 MCP 协议调用 Claude Code 的内置工具(文件编辑、Bash 执行、搜索等)。

另外值得一提的是 Claude Code 的 Tool Search 功能。当你配置了很多 MCP Server 时,所有工具的定义会占用上下文窗口。Tool Search 会动态加载需要的工具,而不是一股脑全部塞进去,大幅减少上下文消耗。

OpenAI Codex CLI:TOML 格式,统一配置

OpenAI 的 Codex CLI 在 2025 年 9 月正式支持了 MCP,但它的配置方式和 Claude Code 有明显区别。

首先,Codex 使用 TOML 格式的配置文件,而不是 JSON。配置文件在 ~/.codex/config.toml,CLI 和 VS Code 扩展共享同一个配置文件。这意味着你只需要配置一次,两个客户端都能用。但也意味着一旦 TOML 语法出错,两个客户端会同时挂掉。

配置的写法像这样:

[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp"]

[mcp_servers.figma]

url = “https://mcp.figma.com/mcp” bearer_token_env_var = “FIGMA_OAUTH_TOKEN”

Codex 同样支持 stdio 和 Streamable HTTP 两种传输方式。命令行管理用 codex mcp add。有趣的一点是,Codex 自己也可以作为 MCP Server 运行(codex mcp-server),暴露 codex()codex-reply() 两个工具,供其他 Agent 调用。

和 Claude Code 的三层作用域不同,Codex 的作用域相对简单:全局配置在 ~/.codex/config.toml,项目级配置在 .codex/config.toml(仅限受信任的项目)。

Codex 还有一些独有的配置选项,比如 enabled_toolsdisabled_tools 白名单/黑名单、startup_timeout_sectool_timeout_sec 超时控制、以及 mcp_oauth_callback_port OAuth 回调端口设置。这些精细控制在 Claude Code 中需要通过环境变量或者其他方式间接实现。

VS Code (Copilot) 和 Cursor:配置大同小异

VS Code 和 Cursor 的 MCP 配置格式略有不同。

VS Code 的配置文件是 .vscode/mcp.json,格式是这样的:

{
  "mcp": {
    "servers": {
      "server-name": {
        "command": "npx",
        "args": ["-y", "some-package"]
      }
    }
  }
}

注意外层多了一个 "mcp" 包裹。

Cursor 的配置文件是 .cursor/mcp.json,格式和 Claude Desktop 更像:

{
  "mcpServers": {
    "server-name": {
      "command": "npx",
      "args": ["-y", "some-package"]
    }
  }
}

VS Code 有一个方便的功能:它可以自动发现其他工具已安装的 MCP Server,比如你在 Claude Desktop 里配置过的 Server。Cursor 则更直接,配置风格和 Claude 系的产品保持一致。

最关键的区别在于内部的 commandargsenv 结构,这部分在所有工具中几乎完全一样。所以实际上,一旦你理解了一个 Server 的配置方式,切换到其他工具时只需要调整一下外层格式和配置文件路径就行。

远程 Server 的认证:OAuth 2.1

对于本地的 stdio Server,认证通常很简单——直接在环境变量里放 API Key 就行。但远程 Server 就不一样了,它需要一套正式的认证流程。

MCP 在 2025 年 3 月的协议更新中引入了标准的 OAuth 2.1 认证机制。在 2025 年 6 月的更新中,这套机制又做了重要的完善:MCP Server 被正式定义为 OAuth 的”资源服务器(Resource Server)”,而认证逻辑交给独立的”授权服务器(Authorization Server)”处理。

认证的大致流程是这样的:Client 首次连接远程 Server 时,Server 返回 401 未授权状态码,同时告诉 Client 到哪里去找授权信息(通过一个 Protected Resource Metadata 文档)。Client 拿到授权服务器的地址后,发起标准的 OAuth 授权码流程(强制使用 PKCE),获取 Access Token,然后在后续的请求中通过 Authorization 头部携带这个 Token。

对于 Claude Code 用户来说,认证远程 Server 可以通过 /mcp 命令交互式完成。Codex CLI 提供了 codex mcp login 命令来处理 OAuth 流程。

6 月的规范更新还引入了一个重要的安全措施:Resource Indicators(资源指示器)。它要求 Client 在请求 Token 时明确指定 Token 的目标 Server,防止一个恶意 Server 拿到的 Token 被滥用到其他服务上。

实战:配一个 GitHub MCP Server

说了这么多理论,来走一遍实际操作。以 GitHub MCP Server 为例,看看在不同工具中怎么配置。

Claude Code 里:

# 方法一:HTTP 远程(推荐)
claude mcp add --transport http github \
  https://api.githubcopilot.com/mcp \
  --header "Authorization: Bearer YOUR_TOKEN"

# 方法二:本地 Docker
claude mcp add github \
  -e GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxxx \
  -- docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN \
  ghcr.io/github/github-mcp-server

Codex CLI 里:

codex mcp add github -- docker run -i --rm \
  -e GITHUB_PERSONAL_ACCESS_TOKEN \
  ghcr.io/github/github-mcp-server

或者直接编辑 ~/.codex/config.toml

[mcp_servers.github]
command = "docker"
args = ["run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server"]

Claude Desktop 里:

编辑 claude_desktop_config.json

{
  "mcpServers": {
    "github": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "GITHUB_PERSONAL_ACCESS_TOKEN",
        "ghcr.io/github/github-mcp-server"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx"
      }
    }
  }
}

你会发现,核心的 Server 启动参数在所有工具中都是一样的,区别只在配置文件的格式和位置。

团队协作中的最佳实践

当 MCP 从个人工具变成团队基础设施时,有几个实践值得注意。

第一,善用 Project 作用域。在项目根目录的 .mcp.json 中定义团队共用的 Server,提交到 Git。比如 Sentry 错误监控、项目数据库连接、CI/CD 相关的工具。认证凭证通过环境变量引用,而不是直接写死:

{
  "mcpServers": {
    "sentry": {
      "type": "http",
      "url": "https://mcp.sentry.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${SENTRY_AUTH_TOKEN}"
      }
    }
  }
}

每个开发者在本地设置自己的 SENTRY_AUTH_TOKEN 环境变量,或者用 Local 作用域覆盖认证信息。

第二,注意上下文消耗。每个启用的 MCP Server 都会在上下文窗口中占用空间,因为 AI 需要知道每个工具的定义和用法。如果你配了十几个 Server,光工具定义就可能吃掉几万个 Token。Claude Code 的 Tool Search 功能可以缓解这个问题,但其他工具目前还没有类似的机制。建议只启用当前任务真正需要的 Server。

第三,Windows 用户的特殊注意事项。在原生 Windows(不是 WSL)上使用 npx 启动的 MCP Server 时,需要加上 cmd /c 前缀。否则 Windows 无法直接执行 npx,会报”连接已关闭”的错误。

写在最后

MCP 的出现是 AI 工具生态中的一个重要里程碑。它做的事情看起来不性感——无非就是定义了一套通信协议——但正是这种”无聊”的标准化工作,让整个生态能够快速生长。

从协议层面看,Streamable HTTP 取代 SSE 成为远程传输的标准,OAuth 2.1 成为认证的基础,这些都在往更成熟、更安全的方向演进。从工具层面看,Claude Code 的三层作用域设计和 Tool Search 机制展示了很好的工程思考,Codex 的 TOML 统一配置则体现了另一种简洁的设计哲学。

对于开发者来说,好消息是学习成本没有看起来那么高。核心的 Server 配置模式在所有工具中几乎一样,差别只在外层的包装格式。掌握了 stdio 和 Streamable HTTP 两种传输方式、理解了作用域和认证机制,你就能在任何 MCP Client 中游刃有余了。

MCP 的协议仍然在快速演进中——2025 年 3 月和 6 月两次大的规范更新就足以说明这一点。如果你在生产环境中依赖 MCP,记得持续关注协议变更。但总体的方向是清晰的:AI 工具的能力边界正在被打开,而 MCP 就是那把钥匙。


发布于

分类

作者

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注