
MCP 从入门到进阶
1. MCP 是什么
Model Context Protocol(模型上下文协议,简称 MCP) 是一个开放标准(协议),用于把 AI 应用(如 Claude、ChatGPT、VS Code 等)连接到外部系统——数据源、工具、工作流。
官方有一个很形象的比喻:MCP 就像 AI 应用的「USB-C 接口」。
就像 USB-C 让你用一个统一的接口连接各种外设(充电器、显示器、硬盘),MCP 让你用一个统一的标准接口连接各种外部系统(数据库、API、文件系统、Git 仓库……),而不用为每一个数据源或工具写一套单独的集成。
关键事实
| 项目 | 内容 |
|---|---|
| 创造者 | Anthropic |
| 发明人 | David Soria Parra、Justin Spahr-Summers |
| 开源时间 | 2024 年 11 月 25 日 |
| 当前治理 | 已捐献给 Linux Foundation(LF Projects, LLC),采用开放治理 |
| 当前规范版本 | 2026-07-28(版本号用日期表示) |
| 许可 | 代码与规范用 Apache 2.0;文档用 CC BY 4.0(各 SDK 仓库多为 MIT) |
一句话理解
- 没有 MCP 之前:每个 AI 应用要连 N 个工具,每个工具要适配 M 个 AI 应用,结果是 M × N 套重复的定制集成。
- 有了 MCP 之后:工具方只需要实现一次 MCP 服务器,任何支持 MCP 的 AI 应用都能直接连接,变成 M + N。
2. 为什么需要 MCP
以「让 AI 助手读取本地文件」为例:
传统做法:为每个 AI 应用单独写插件/连接器,Claude 一套、ChatGPT 一套、某个 IDE 又一套,逻辑重复、维护成本高。
MCP 做法:写一个「文件系统 MCP 服务器」,通过标准协议暴露 read_file、list_directory 等工具。所有支持 MCP 的客户端都能复用同一个服务器。
MCP 解决的核心问题是:
- 统一接口——一套协议连接所有外部能力。
- 可复用——一个服务器服务多个客户端。
- 可组合——一个 AI 应用可以同时连接多个 MCP 服务器。
- 标准化安全——内置了认证、授权、作用域等机制。
3. 核心架构:Host / Client / Server
MCP 有三个核心参与者:
| 角色 | 说明 | 例子 |
|---|---|---|
| Host(宿主) | 承载 AI 的应用程序,管理一个或多个 Client | Claude Desktop、VS Code、Cursor、某个 IDE |
| Client(客户端) | Host 创建的一个组件,与一个 Server 保持 1:1 连接,把上下文转给 Host | Claude Desktop 内部为每个服务器创建的连接 |
| Server(服务器) | 一个程序,向客户端暴露能力(工具、资源、提示词) | Filesystem 服务器、Git 服务器、GitHub 服务器 |
关系可以理解为:
Host(AI 应用)
├── Client A ──── 1:1 ──── Server A(例如文件系统)
├── Client B ──── 1:1 ──── Server B(例如数据库)
└── Client C ──── 1:1 ──── Server C(例如远程 API)
- 本地服务器:通过 stdio 作为子进程运行。
- 远程服务器:作为独立进程在网络上运行,通过 HTTP(S) 暴露(Streamable HTTP)。
4. 三大服务器原语:Resources / Tools / Prompts
服务器向模型提供三种核心「能力」。
4.1 Resources(资源)
只读的、可用 URI 寻址的上下文/数据,例如文件内容、数据库记录、API 响应。
- 带有 MIME 类型。
- 支持模板 URI(例如
file:///logs/{date})。 - 对应方法:
resources/list、resources/read。
类比:Resources 是「可以读的东西」,AI 用来获取信息,但不会改变它。
4.2 Tools(工具)
模型可以调用的可执行函数,用来执行动作。
- 由模型控制(模型决定何时调用)。
- 输入输出有类型(JSON Schema)。
- 对应方法:
tools/list、tools/call。
类比:Tools 是「可以做的事情」,比如查询天气、发邮件、写入数据库。
4.3 Prompts(提示词)
可复用的、由用户调用的指令/模板工作流。
- 由用户控制(用户选择使用)。
- 对应方法:
prompts/list、prompts/get。
类比:Prompts 是「预设好的指令模板」,比如「帮我写一份周报」「按此格式总结这份代码」。
快速对比
| 原语 | 谁触发 | 用途 | 典型方法 |
|---|---|---|---|
| Resources | 模型读取 | 提供只读数据 | resources/list、resources/read |
| Tools | 模型调用 | 执行动作 | tools/list、tools/call |
| Prompts | 用户调用 | 复用指令模板 | prompts/list、prompts/get |
5. 客户端原语与已废弃的能力
5.1 Elicitation(信息征求)——当前推荐
服务器请求用户提供额外输入或确认的机制,是「服务器发起请求」的现代替代方案。
- 表单模式(form):用结构化 schema 让客户端渲染表单收集输入。
- URL 模式:跳转到外部链接(例如 OAuth 授权、填写凭证)。
它是 Sampling / Roots 等旧机制的替代者——新的服务器若需要「反过来问用户」,应该用 Elicitation。
5.2 已废弃的能力(2026-07-28 起)
| 能力 | 原用途 | 现状与替代 |
|---|---|---|
| Roots | 客户端告知服务器的文件系统边界(file:// URI 列表) |
已废弃,且只是「建议性」的,不是安全边界 |
| Sampling | 服务器通过客户端请求模型生成补全 | 已废弃,新服务器应直接调用 LLM API |
| Logging | 服务器向客户端发日志消息 | 已废弃,stdio 下用 stderr,或用 OpenTelemetry |
⚠️ 如果你在旧教程里看到 Sampling / Roots / Logging,请注意:新的开发不应该再基于它们构建功能。
5.3 其他概念
- Structured output(结构化输出):工具可以声明
outputSchema,除纯文本content外还能返回structuredContent。 - Pagination(分页):
*/list方法支持基于游标(cursor)的分页,用于工具/资源/提示词很多时。 - Parameter completion(参数补全):给资源/提示词参数提供候选值(原
completion/complete被重构为「参数补全」)。
6. 传输方式:stdio 与 Streamable HTTP
传输方式决定客户端和服务器之间如何「对话」。
6.1 stdio(本地子进程)
- 客户端把服务器作为子进程启动。
- 消息是 换行分隔的 JSON-RPC,走 stdin/stdout。
stderr用于日志。- 特点:本地、简单、无网络开销、一个进程一个客户端。
绝大多数本地 MCP 服务器都用 stdio。
6.2 Streamable HTTP(远程,当前推荐)
- 服务器暴露一个 HTTP 端点,接受 POST。
- 每条客户端消息是一次独立的 POST。
- 服务器回复:单个 JSON 对象,或一个请求作用域的 SSE 流。
- 长期变更通知通过
subscriptions/listen流。 - 支持标准 HTTP 认证(Bearer token、API key、自定义头;推荐 OAuth)。
- 要求校验
Origin,并镜像MCP-Protocol-Version、Mcp-Method、Mcp-Name头。
这是远程/部署服务器的推荐传输方式。
6.3 HTTP+SSE(已废弃)
- 2024-11-05 起的旧传输方式(单独 SSE 端点 +
endpoint事件)。 - 已废弃,仅保留向后兼容。
对比
传输场景特点stdio本地子进程、简单、无网络Streamable HTTP远程单端点、多客户端、可联网HTTP+SSE旧版已废弃,仅兼容
7. 快速上手:写第一个 MCP 服务器
下面分别用 Python(SDK v2) 和 TypeScript(SDK v2) 写一个最小服务器。
7.1 Python 版
先安装(需要 Python 3.10+):
pip install "mcp[cli]"
# 或使用 uv
uv add "mcp[cli]"
一个「加法工具 + 问候资源」的最小服务器:
from mcp.server import MCPServer
mcp = MCPServer("Demo")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers."""
return a + b
@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
"""Greet someone by name."""
return f"Hello, {name}!"
本地开发/运行:
# 开发模式
uv run mcp dev server.py
# 以 Streamable HTTP 方式运行
uv run mcp run server.py --transport streamable-http
7.2 TypeScript 版
安装(SDK v2 拆分为 server / client 包):
npm install @modelcontextprotocol/server @modelcontextprotocol/client
# 以及 schema 校验库(示例用 zod v4)
npm install zod
一个「greet 工具」的最小服务器(stdio):
import { McpServer } from '@modelcontextprotocol/server';
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
import * as z from 'zod/v4';
const server = new McpServer({ name: 'greeting-server', version: '1.0.0' });
server.registerTool(
'greet',
{
description: 'Greet someone by name',
inputSchema: z.object({ name: z.string() }),
},
async ({ name }) => ({
content: [{ type: 'text', text: `Hello, ${name}!` }],
})
);
async function main() {
await server.connect(new StdioServerTransport());
}
main();
说明:上面的 API 是 SDK v2 的写法(
MCPServer、registerTool、StdioServerTransport)。旧教程里常见的Server/setRequestHandler/StdioServerTransport来自 v1(@modelcontextprotocol/sdk)。
8. 在客户端注册服务器
写好了服务器,需要在客户端(Host)里「注册」它,客户端才会启动并连接。
8.1 Claude Desktop
配置文件 claude_desktop_config.json:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"weather": {
"command": "uv",
"args": ["--directory", "/ABSOLUTE/PATH/TO/weather", "run", "weather.py"]
}
}
}
- Node 服务器:
"command": "node","args": ["/abs/path/build/index.js"]。 - HTTP 服务器:用
"url": "https://..."替代command(可配bearerTokenEnvVar引用环境变量)。
8.2 通用 mcp.json
很多工具(Claude Code、VS Code 等)用同一个 mcpServers 结构,写在项目级 .mcp.json 里。Python SDK 的 mcp install 命令也能自动写入。
一个 HTTP 服务器(使用环境变量里的静态 Bearer Token):
{
"mcpServers": {
"my-remote": {
"url": "https://mcp.example.com/mcp",
"bearerTokenEnvVar": "MY_MCP_TOKEN"
}
}
}
注意:stdio 条目会在会话启动时启动子进程,因此项目级配置应只放在可信的仓库里。
9. 认证与授权(OAuth 2.1 / Bearer Token)
重要:授权是可选的。只有服务器真正需要鉴权时才实现。
9.1 基本规则
- HTTP 传输:按 MCP 授权规范走 OAuth 2.1。
- stdio 传输:不要套用 OAuth 规范,改为从环境变量读取凭证。
9.2 角色对应
MCP 角色OAuth 角色MCP 服务器资源服务器(Resource Server)MCP 客户端客户端(Client)(独立的)授权服务授权服务器(Authorization Server)
9.3 基于的标准
MCP 授权基于 OAuth 2.1 的一个子集,并引用多个 RFC:
- OAuth 2.1(draft-ietf-oauth-v2-1)——核心框架
- RFC 6750——Bearer Token
- RFC 8414——授权服务器元数据
- RFC 8707——资源指示符(resource 参数)
- RFC 9728——受保护资源元数据
- RFC 9207——签发者标识
- RFC 7591——动态客户端注册(已被 Client ID Metadata Documents 取代)
- OIDC——发现与注册
9.4 双方要实现什么
服务器(资源服务器)必须:
- 提供受保护资源元数据(RFC 9728)
- 校验 token 的受众(audience,按 RFC 8707)
- 正确处理
401/403/400 - 在
WWW-Authenticate挑战中给出scope指引
客户端必须:
- 发现资源/授权服务器元数据
- 使用 PKCE
- 在授权与 token 请求中带
resource参数 - 校验签发者(RFC 9207)
- 每次请求用
Authorization: Bearer ...头(绝不能放在 URL 查询串里) - 处理
insufficient_scope时的 step-up / scope 合并
9.5 安全要点
- PKCE 对公共客户端是必须的。
- Refresh token 可选,不要默认假设存在。
- 永远不要把 token 写在 URL 里。
- 不要把密钥明文写进
mcp.json——HTTP 服务器用bearerTokenEnvVar引用环境变量;stdio 若必须在env里内联密钥,务必先评估风险。
10. 进阶主题
10.1 当前版本(2026-07-28)的重大变化
这一版是一次大型重构,如果你读过旧资料,重点注意这些变化:
- 无状态/无会话(stateless/sessionless)协议。
- 按请求元数据(
_meta+ HTTP 头)取代initialize握手。 server/discover取代initialize。- Multi Round-Trip Requests(MRTR):服务器→客户端的多轮交互。
- 弃用 Sampling、Roots、Logging(见第 5 节)。
- 新可选扩展:Tasks、MCP Apps、Skills over MCP。
- 默认 JSON Schema 方言升级为 2020-12。
10.2 结构化输出(Structured Output)
工具除了返回文本,还可以返回结构化结果,方便程序处理:
from pydantic import BaseModel
class WeatherResult(BaseModel):
temperature: float
condition: str
@mcp.tool()
def get_weather(city: str) -> WeatherResult:
"""Get current weather for a city."""
return WeatherResult(temperature=22.5, condition="sunny")
客户端可以通过 result.structured_content 拿到结构化对象。
10.3 分页
当工具/资源/提示词很多时,*/list 支持游标分页:
- 请求带
cursor参数。 - 响应返回
nextCursor。
10.4 远程 MCP 与托管服务器
- 本地服务器:stdio 子进程。
- 远程/托管服务器:独立进程,通过网络用 Streamable HTTP 暴露(常由公司/平台托管,如 Sentry)。
10.5 MCP Registry(官方注册中心)
存在官方集中式元数据仓库:https://registry.modelcontextprotocol.io。
- 由 Anthropic、GitHub、PulseMCP、Microsoft 支持。
- 提供 REST API + OpenAPI 规范,供宿主应用/聚合器/市场使用。
- 命名用反向 DNS(如
io.github.user/server)。 - 支持开源与闭源服务器;不支持私有服务器(私有可自建 registry)。
11. 官方 SDK 与生态
11.1 官方 SDK 分级
- Tier 1:TypeScript、Python、C#、Go、Rust
- Tier 2:Java、Ruby
- Tier 3:Kotlin、Swift、PHP
11.2 版本速查(截至 2026-08 检索)
| 语言 | 最新版本 | 安装 | 备注 |
|---|---|---|---|
| TypeScript/JS | 2.0.0(v2 拆包) |
npm i @modelcontextprotocol/server @modelcontextprotocol/client |
v2 拆分 server/client + 中间件 |
| Python | 2.1.1 |
pip install "mcp[cli]" |
v2 大改版,包名 mcp |
| C# | 2.2.0 |
NuGet | .NET 8+ |
| Go | 1.7.0 |
Go module | Go 1.24+ |
| Rust | rmcp v3.1.4 |
crate rmcp |
Rust 1.70+ |
| Java | 2.0.1 |
Spring AI 协作 | Java 17+ |
| Ruby | 1.3.0 |
gem mcp |
Ruby 2.7+ |
| Kotlin | 0.15.0 |
JetBrains 协作 | — |
| Swift | 0.12.1 |
Swift Package | — |
| PHP | 0.8.0 |
Composer | — |
11.3 生态亮点
- 主要客户端/宿主:Claude(Desktop、Code、Claude.ai)、ChatGPT/OpenAI、VS Code、Cursor 等。
- 官方参考服务器:Filesystem、Git、Memory、Fetch、Sequential Thinking、Time、Everything。
- 官方集成:GitHub、Slack、Google Drive、Postgres、Sentry 等(位于
modelcontextprotocol/servers仓库)。
12. 安全要点与常见坑
12.1 写给初学者的「别踩的坑」
- stdio 服务器里不要用
print()/console.log()输出到 stdout。 —— 这会污染 JSON-RPC 流。日志请写到 stderr(或文件)。 - 工具 = 任意代码执行。 —— 不要把工具描述/注解当作可信输入;宿主在调用工具前应取得用户明确同意。
- Streamable HTTP 必须校验
Origin头,防止 DNS rebinding。 —— 本地服务器请绑定127.0.0.1,不要绑0.0.0.0。 - Token 永远不放 URL 查询串,用
Authorization: Bearer头;校验 token 的 audience;公共客户端用 PKCE。 - Roots 只是建议,不是安全边界。 —— 真正的限制要靠操作系统权限/沙箱。
- Sampling / Roots / Logging 已废弃,不要在新的功能上依赖它们。
- stdio 服务器不要套 OAuth 规范,凭证从环境变量读。
- 版本协商现在是按请求的(
_meta.protocolVersion/MCP-Protocol-Version头),initialize已是旧机制;新服务器请基于server/discover构建。 - 服务器描述、资源内容、提示词内容都应视为不可信输入。
13. 版本历史与治理
13.1 版本号怎么读
MCP 用日期字符串作为版本号(YYYY-MM-DD),表示「最后一次向后不兼容变更」的日期。
13.2 主要版本里程碑
| 版本 | 关键变化 |
|---|---|
2024-11-05 |
初始公开规范(stdio + HTTP+SSE) |
2025-03-26 |
引入 Streamable HTTP(会话式:Mcp-Session-Id、SSE 流、可恢复) |
2025-06-18 |
大版本:传输级授权(OAuth 2.1)、Elicitation、结构化输出 |
2025-11-25 |
Streamable HTTP 细化 |
2026-07-28 |
当前:无状态协议、按请求元数据、server/discover、MRTR、弃用 Sampling/Roots/Logging、新增 Tasks/MCP Apps/Skills over MCP、默认 JSON Schema 2020-12 |
13.3 治理
- 归属 Linux Foundation(LF Projects, LLC)。
- 开放治理:Contributors → Maintainers → Core Maintainers → Lead Maintainers/BDFL。
- 通过 SEP(Specification Enhancement Proposal) 流程演进。
- 当前 Lead Maintainers:David Soria Parra、Den Delimarsky;荣誉退休:Justin Spahr-Summers。
14. 学习资源
- 官网:https://modelcontextprotocol.io/
- 规范仓库(原
modelcontextprotocol/specification已重定向):https://github.com/modelcontextprotocol/modelcontextprotocol - TypeScript SDK:https://github.com/modelcontextprotocol/typescript-sdk
- Python SDK:https://github.com/modelcontextprotocol/python-sdk
- 官方示例服务器:https://modelcontextprotocol.io/examples
- 官方集成仓库:https://github.com/modelcontextprotocol/servers
- 注册中心:https://registry.modelcontextprotocol.io/
- 创始介绍(Anthropic):https://www.anthropic.com/news/model-context-protocol
本文基于 2026-08 检索到的官方文档与规范整理,关键版本与 API 请以官方最新页面为准。版本演进较快,动手实践前建议再次核对官网对应版本的 SDK 文档。
评论 (0)
还没有评论,来写第一条吧~