第 6 章 · 01 MCP 架构与传输方式 本节摘要:MCP 是"让 Claude Code 接上外部世界"的标准化插座。先分清它与记忆的分工(实时数据 vs 静态偏好),再看清三层架构(Claude → MCP Server → 外部服务),最后选对传输方式:远程服务用 HTTP,本地进程用 stdio,SSE 已被 HTTP 取代。本节还覆盖 注入与 Windows 上的启动特例。 学习目标 阅读完本节,你应当能够: 用"MCP vs 记忆"决策矩阵判断一个数据需求该走哪条路。 画出 MCP 架构三部分并解释每层的职责。 说出三种传输方式各自适用场景,并写出 HTTP/stdio 的添加命令。 解释 对 stdio 服务器的意义,以及 Windows 上 npx 命令要加 的原因。
本节摘要:MCP 是"让 Claude Code 接上外部世界"的标准化插座。先分清它与记忆的分工(实时数据 vs 静态偏好),再看清三层架构(Claude → MCP Server → 外部服务),最后选对传输方式:远程服务用 HTTP,本地进程用 stdio,SSE 已被 HTTP 取代。本节还覆盖
CLAUDE_PROJECT_DIR注入与 Windows 上的启动特例。
阅读完本节,你应当能够:
CLAUDE_PROJECT_DIR 对 stdio 服务器的意义,以及 Windows 上 npx 命令要加 cmd /c 的原因。MCP(Model Context Protocol)是 Claude Code 访问外部工具、API 与实时数据源的标准化方式。它的关键特性一句话:实时访问——与第 3 章的记忆不同,记忆存放的是"不太变化的数据"(偏好、上下文、历史),而 MCP 连接的是"一直在变的数据"(GitHub 的 issue、数据库的行、Slack 的消息)。
这两者的分工可以用一个决策矩阵记忆:
需要外部数据吗? ├─ 不需要 → 用记忆(存偏好/上下文/历史) └─ 需要 → 数据变化频繁吗? ├─ 不变/很少变 → 用记忆 └─ 频繁变化 → 用 MCP(实时 API/数据库/服务)
例子:用户的编码偏好存在记忆里;今天 GitHub 上开了哪些 PR、数据库里订单表的最新行——这些必须走 MCP,因为它们是实时查询,不是存下来的快照。
MCP 的架构只有三个角色:
┌─────────┐ 请求(list_issues) ┌─────────────┐ 查询 ┌──────────────┐ │ Claude │ ────────────────────→ │ MCP Server │ ────────→ │ External │ │ (宿主) │ ←──────────────────── │ (中间层) │ ←──────── │ Service │ └─────────┘ 响应(数据) └─────────────┘ 结果 └──────────────┘
list_prs、create_issue 等一整套工具)。这个分层的好处:Claude 不需要知道每个服务的私有 API 怎么调,只要对接 MCP 标准;新增一个服务 = 新增一个 MCP Server,宿主端零改动。
MCP Server 与宿主之间通过"传输"连接,Claude Code 支持三种:
远程服务的首选,一条命令接入:
# 基本 HTTP 连接 claude mcp add --transport http notion https://mcp.notion.com/mcp # 带认证头 claude mcp add --transport http secure-api https://api.example.com/mcp \ --header "Authorization: Bearer your-token"
本机跑的 MCP Server(比如 npx 拉起的 Node 进程):
# 本地 Node.js 服务器 claude mcp add --transport stdio myserver -- npx @myorg/mcp-server # 带环境变量 claude mcp add --transport stdio myserver --env KEY=value -- npx server
CLAUDE_PROJECT_DIR 注入(v2.1.139+):每个 stdio 服务器启动时,环境里已预设 CLAUDE_PROJECT_DIR=<仓库根目录绝对路径>(与 hooks 同一约定)。插件和项目的 .mcp.json 可以在 command/args/env 里引用 ${CLAUDE_PROJECT_DIR},替换发生在进程启动之前:
{ "mcpServers": { "repo-tools": { "type": "stdio", "command": "node", "args": ["${CLAUDE_PROJECT_DIR}/.claude/mcp/repo-tools.js"], "env": { "REPO_ROOT": "${CLAUDE_PROJECT_DIR}" } } } }
什么时候用?当你的 stdio 服务器需要相对仓库根目录读文件,而 Claude Code 可能从任意目录启动时。
Server-Sent Events 已弃用,由 http 取代,但兼容保留:
claude mcp add --transport sse legacy-server https://example.com/sse
原生 Windows(非 WSL)上跑 npx 命令,必须用 cmd /c 包裹:
claude mcp add --transport stdio my-server -- cmd /c npx -y @some/package
MCP 服务器可以通过 roots/list 请求发现当前会话的工作目录(启动目录 + 所有 --add-dir/additionalDirectories 条目);目录集合变化时,服务器会收到 notifications/roots/list_changed 通知(v2.1.203+)。同一版本起,空闲超时(30 分钟)也适用于 stdio 服务器,每个服务器可用 timeout 字段设置空闲下限——长时间不用的服务器会被回收,而不是无限挂着。
MCP 是 Claude Code 的"实时数据插座":记忆管静态偏好,MCP 管动态数据。架构上,宿主只管与标准 Server 对话,Server 负责包装外部服务;接线上,远程用 HTTP、本地用 stdio、旧配置用 SSE。stdio 服务器自带 CLAUDE_PROJECT_DIR 锚定仓库根,Windows 用户记得 cmd /c。下一步:把服务器接进来之后,怎么用 CLI 和配置文件管理它们。
下一节预告:第 2 节讲
claude mcp命令族、三种配置作用域与 JSON 语法——把 MCP 真正装进你的项目。