Model Context Protocol 介绍
Model Context Protocol(MCP)是一种开放协议,旨在实现大型语言模型(LLM)应用程序与外部数据源和工具之间的无缝集成。无论您是在构建 AI 驱动的 IDE、增强聊天界面,还是创建自定义 AI 工作流,MCP 都提供了一种标准化的方式将 LLM 与它们所需的上下文连接起来。
本文档内容基于 MCP 官方规范 2025-11-25 和 官方文档网站。2025-06-18 和 2024-11-05 版本仍受支持。
什么是 MCP?
MCP(Model Context Protocol)由 Anthropic(Claude 的开发公司)于 2024 年底推出,是一种开放标准,用于连接 LLM 与各种工具和数据源。它的设计理念类似于 USB-C——为 AI 提供一个统一的接口,让它可以连接到任何需要的外部系统。
MCP 解决什么问题?
在 MCP 出现之前,开发者需要为每个 LLM 集成单独编写代码:
# 以前的方式:为每个数据源单独编写集成代码
def get_weather():
# 调用天气 API
pass
def search_github():
# 调用 GitHub API
pass
def query_database():
# 连接数据库查询
pass
# 每个集成都是独立的,需要单独维护
有了 MCP 之后,所有集成都遵循同一个协议:
# MCP 方式:标准化接口
# 只需要实现一次 MCP 服务器
# 任何兼容 MCP 的客户端都可以使用
MCP 的核心优势
| 特性 | 传统方式 | MCP 方式 |
|---|---|---|
| 工具发现 | 静态配置 | 运行时动态发现 |
| 安全控制 | 临时处理 | 内置用户授权机制 |
| 连接方式 | 无状态 REST | 有状态连接 |
| 交换服务 | 常常破坏集成 | 模块化热插拔 |
| 文档 | 外部且不一致 | 嵌入服务器响应中 |
MCP 的核心组件
MCP 架构包含三个主要角色:
- Host(主机):启动连接的 LLM 应用程序,如 Claude Desktop、VS Code、Cursor、Windsurf 等
- Client(客户端):主机内部的连接器,负责与 Server 通信
- Server(服务器):提供上下文和能力的服务,如 GitHub Server、Filesystem Server 等
分层架构
MCP 由两个核心层组成:
数据层:定义基于 JSON-RPC 的协议,包括:
- 生命周期管理:连接初始化、能力协商、连接终止
- 服务器原语:Tools(工具)、Resources(资源)、Prompts(提示)
- 客户端原语:Sampling(采样)、Elicitation(用户交互)、Logging(日志)
- 工具功能:实时更新的通知、长时间操作的进度跟踪
传输层:定义通信机制,包括:
- STDIO 传输:使用标准输入/输出流进行本地进程间通信
- Streamable HTTP 传输:使用 HTTP POST 和 Server-Sent Events 支持远程服务器通信
协议层次
MCP 由几个关键组件协同工作:
- 基础协议:核心 JSON-RPC 2.0 消息类型
- 生命周期管理:连接初始化、能力协商、会话控制
- 服务器原语:Resources、Prompts、Tools
- 客户端原语:Sampling、Elicitation、Logging
- 工具功能:通知、进度跟踪、取消操作等跨领域功能
MCP 核心原语
MCP 定义了服务器和客户端可以互相提供的原语(Primitives):
服务器原语(Server → Client):
| 功能 | 说明 | 典型应用 |
|---|---|---|
| Tools(工具) | AI 模型可以调用的函数 | 执行计算、API调用、文件操作 |
| Resources(资源) | 可共享的上下文和数据 | 文件内容、数据库记录、配置信息 |
| Prompts(提示) | 预定义的提示模板和工作流 | 代码审查、文档生成、问题诊断 |
客户端原语(Client → Server):
| 功能 | 说明 | 典型应用 |
|---|---|---|
| Sampling(采样) | 服务器请求 LLM 进行推理 | 递归 LLM 交互、代理行为 |
| Elicitation(用户交互) | 服务器请求用户输入或确认 | 敏感操作确认、获取额外信息 |
| Logging(日志) | 服务器向客户端发送日志消息 | 调试和监控 |
传输层
MCP 支持两种传输机制:
STDIO 传输
STDIO 传输使用标准输入/输出流进行本地进程间通信,适用于同一台机器上运行的本地服务器。这种传输方式没有网络开销,性能最优。
# STDIO 传输的 MCP 服务器
from mcp.server.stdio import stdio_server
async def main():
async with stdio_server() as streams:
await app.run(streams[0], streams[1], options)
Streamable HTTP 传输
Streamable HTTP 传输使用 HTTP POST 进行客户端到服务器的消息传递,可选 Server-Sent Events(SSE)实现流式能力。这种传输方式支持远程服务器通信,可以使用标准的 HTTP 认证方法。
# HTTP 传输的 MCP 服务器
from mcp.server.http import HTTPServer
server = HTTPServer(app, host="0.0.0.0", port=8080)
server.run()
两种传输方式的选择取决于部署场景:本地工具使用 STDIO,远程服务使用 HTTP。详细说明请参阅 传输层 章节。
协议基础
MCP 基于 JSON-RPC 2.0 消息格式,定义了三种基本消息类型:
| 类型 | 说明 | 要求 |
|---|---|---|
Requests | 发起操作的消息 | 必须包含唯一 ID 和方法名 |
Responses | 回复请求的消息 | 必须包含与请求相同的 ID |
Notifications | 单向消息,无需回复 | 不能包含 ID |
消息示例
// 请求
{
"jsonrpc": "2.0",
"id": "req-001",
"method": "tools/list",
"params": {}
}
// 成功响应
{
"jsonrpc": "2.0",
"id": "req-001",
"result": {
"tools": [...]
}
}
// 错误响应
{
"jsonrpc": "2.0",
"id": "req-001",
"error": {
"code": -32600,
"message": "Invalid Request"
}
}
MCP 的应用场景
1. AI 驱动的 IDE 增强
通过 MCP,AI 助手可以:
- 读取项目文件和代码
- 执行 Git 操作
- 运行代码和测试
- 搜索代码库
2. 聊天界面扩展
MCP 让聊天机器人可以:
- 访问实时数据
- 调用外部 API
- 操作数据库
- 管理文件系统
3. 自定义 AI 工作流
开发者可以构建:
- 自动化任务流水线
- 多系统集成
- 智能数据处理管道
4. 企业知识库
- 连接内部文档系统
- 访问企业数据库
- 集成业务工具
快速开始
安装 MCP SDK 开始开发:
# Python
pip install mcp
# TypeScript
npm install @modelcontextprotocol/sdk
查看 环境配置 了解详细设置步骤,或直接参考 快速入门 构建你的第一个 MCP 服务器。
安全原则
MCP 设计强调安全性,核心原则包括:
用户授权
- 主机必须在暴露用户数据前获得明确同意
- 用户必须能够审查和授权所有操作
工具安全
工具代表任意代码执行,需要谨慎处理:
- 不信任服务器提供的工具描述
- 实施适当的访问控制
- 提供清晰的 UI 展示工具执行情况
- 敏感操作需要用户确认
数据保护
- 不在未经用户同意的情况下传输数据
- 验证所有工具输入
- 实施速率限制
- 清理工具输出