MCP 协议详解
MCP(Model Context Protocol,模型上下文协议)是由Anthropic于2024年11月发布的开源标准协议,旨在为AI应用(如大型语言模型LLM)和外部数据源、工具、系统之间提供标准化、安全的双向连接接口。它解决了传统AI集成中的“N×M”问题(每个AI模型需为每个数据源开发自定义连接器),类似于AI领域的“USB-C端口”。MCP基于JSON-RPC 2.0传输,支持stdio和HTTP传输,已被OpenAI、Google DeepMind等主要AI提供商采用。
1. MCP 协议概述
基本概念
- 作用:标准化AI模型与外部系统(如数据库、文件系统、API、开发工具)的交互,实现上下文注入、数据检索和工具调用
- 端口:无固定端口,支持stdio(本地)或HTTP(网络,默认无TLS)
- 传输层:JSON-RPC 2.0 over stdio/HTTP,支持双向消息(请求、响应、通知)
- 工作模式:客户端-服务器架构,AI应用作为MCP客户端,数据源作为MCP服务器
- 开源标准:GitHub仓库托管,鼓励社区贡献连接器
MCP vs 传统AI集成
特性 | MCP | 传统函数调用(如OpenAI API) |
---|
标准化 | 是(开源协议) | 供应商特定 |
双向通信 | 支持(通知、流式响应) | 主要单向 |
上下文管理 | 内置(元数据标签、提示仓库) | 手动注入 |
安全性 | 可选TLS/OAuth | 依赖供应商 |
扩展性 | 生态系统(连接器共享) | 自定义开发 |
适用场景 | AI代理、工具链 | 简单API调用 |
MCP 的核心优势
- 简化集成:开发者无需为每个AI模型重写连接器,一次实现全平台兼容
- 增强AI能力:AI可动态访问实时数据,提升代理(如Claude、ChatGPT)的实用性
- 生态构建:支持数据源暴露(如GitHub仓库、业务工具),AI应用消费(如代码生成、数据分析)
2. MCP 架构
核心组件
AI应用 (MCP Client) ↔ 传输层 (JSON-RPC) ↔ MCP Server ↔ 外部系统 (数据/工具)
↓ ↓ ↓
- 请求/通知 - 消息转换 - 数据检索/工具执行
- 上下文注入 - 错误处理 - 安全访问控制
角色分工
- MCP Client:AI模型侧(如Claude 3.5 Sonnet),发起请求,处理响应
- MCP Server:数据源侧,实现协议接口,暴露资源(如文件读取、数据库查询)
- 传输层:处理消息序列化、错误恢复,支持中断重连
传输方法
方法 | 描述 | 适用场景 |
---|
stdio | 标准输入/输出,本地进程间通信 | 本地工具集成(如VS Code插件) |
HTTP | 网络传输,默认明文(可选TLS) | 远程数据源(如云数据库) |
WebSocket | 扩展支持,双向流式 | 实时交互(如视频会议工具) |
消息类型(JSON-RPC 2.0)
- Request:客户端→服务器,带ID和参数(如”read_file”)
- Response:服务器→客户端,带结果或错误
- Notification:无响应通知(如状态更新)
3. MCP 消息格式
基本JSON-RPC结构
{
"jsonrpc": "2.0",
"id": "unique_request_id",
"method": "mcp.method_name",
"params": {
"context": "user_prompt",
"data_source": "file://path/to/file.txt",
"filters": {"source": "specific_ip"}
}
}
核心方法示例
方法 | 描述 | 参数示例 |
---|
initialize | 初始化连接,协商版本 | {"protocol_version": "1.0"} |
read_context | 读取数据源上下文 | {"source": "database", "query": "SELECT * FROM users"} |
execute_tool | 调用外部工具 | {"tool": "calculator", "input": "2+2"} |
shutdown | 关闭连接 | 无参数 |
错误响应格式
{
"jsonrpc": "2.0",
"id": "request_id",
"error": {
"code": -32600,
"message": "Invalid Request",
"data": {"details": "Unknown method"}
}
}
4. MCP 通信流程
初始化和交互示例
1. 客户端发送initialize请求
→ Server响应协议版本和能力
2. 客户端发送read_context请求
→ Server查询数据源,返回结构化上下文(JSON + 元数据)
3. 客户端注入上下文到AI提示
→ AI生成响应,可能触发execute_tool通知
4. Server执行工具,返回结果
→ 客户端更新AI上下文,继续交互
5. 异常处理:传输中断时重连,错误时回滚状态
完整会话示例(JSON)
// 客户端: 初始化
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"version":"1.0"}}
// 服务器: 确认
{"jsonrpc":"2.0","id":1,"result":{"supported_methods":["read_context","execute_tool"]}}
// 客户端: 读取文件
{"jsonrpc":"2.0","id":2,"method":"read_context","params":{"path":"/data/report.txt","format":"json"}}
// 服务器: 返回数据
{"jsonrpc":"2.0","id":2,"result":{"content":"报告数据...","metadata":{"timestamp":"2025-10-13T00:00:00Z"}}}
// 通知: 工具执行
{"jsonrpc":"2.0","method":"notification","params":{"tool":"search","query":"AI trends 2025"}}
5. MCP 扩展功能
上下文管理
- 元数据标签:自动添加时间戳、来源、权限标签
- 提示仓库:服务器端预定义提示模板,提升AI响应一致性
- 流式响应:支持实时数据注入,避免上下文窗口溢出
安全增强
- OAuth 2.1集成:Cloudflare等提供库,支持第三方授权
- TLS可选:默认HTTP,推荐启用加密防窃听
- 权限控制:细粒度访问(如只读数据库)
工具集成示例
- 数据源:文件系统、SQL数据库、Git仓库
- 工具:计算器、搜索引擎、代码执行器
- 工作流:自动化链(如数据分析→报告生成)
6. MCP 安全考虑
潜在风险
风险 | 描述 | 缓解 |
---|
凭据泄露 | MCP服务器暴露敏感API密钥 | 使用OAuth,加密传输 |
提示注入 | 恶意上下文篡改AI行为 | 输入验证,沙箱执行 |
供应链攻击 | 恶意MCP包下载执行 | 签名验证,静态分析 |
暴露服务器 | 互联网上无认证MCP服务器 | 访问控制,网络隔离 |
DoS | 洪泛请求耗尽资源 | 速率限制,认证令牌 |
最佳实践
- 强制TLS:所有网络连接启用加密
- 最小权限:服务器只暴露必要方法
- 审计日志:记录所有请求/响应
- 扫描工具:定期检查暴露服务器(如Knostic 2025年扫描发现2000+无认证实例)
7. MCP 实现示例
Python MCP服务器(简化)
import json
import sys
from jsonrpcserver import Success, serve
# MCP方法实现
methods = {
"initialize": lambda params: Success({"version": "1.0", "capabilities": ["read_context"]}),
"read_context": lambda params: Success({"content": "示例数据", "metadata": {"source": "file"}})
}
# JSON-RPC服务器(stdio模式)
request = json.loads(sys.stdin.readline())
response = methods.get(request.get("method"), lambda _: Success({"error": "Unknown method"}))(request.get("params"))
print(json.dumps(response))
sys.stdout.flush()
客户端集成(AI代理)
import requests
import json
def mcp_request(server_url, method, params):
payload = {
"jsonrpc": "2.0",
"id": 1,
"method": method,
"params": params
}
response = requests.post(server_url, json=payload)
return response.json()["result"]
# 示例:读取上下文
context = mcp_request("http://mcp-server:8080", "read_context", {"path": "/data.txt"})
print(f"注入AI提示: {context['content']}")
8. MCP 生态和工具
主要实现
- Anthropic SDK:Claude原生支持
- OpenAI集成:2025年3月宣布兼容
- Cloudflare OAuth库:授权提供者
- 社区连接器:GitHub、数据库驱动
开发资源
- 规范:modelcontextprotocol.io
- GitHub:anthropic/mcp-spec
- 测试工具:MCP模拟器,验证连接器
9. MCP 的未来发展
当前状态(2025年10月)
- 采用率:主要AI提供商支持,生态快速增长
- 挑战:安全标准化(如强制TLS),供应链风险
- 扩展:支持更多传输(如WebSocket),AI代理工作流
潜在影响
- AI代理革命:标准化工具调用,提升自动化
- 企业集成:无缝连接遗留系统,减少开发成本
- 安全焦点:2025年报告显示暴露服务器问题,需加强防护
MCP协议通过标准化接口桥接AI与现实世界系统,推动了AI从“智能”向“行动”的转变。作为开源标准,它促进了生态协作,但开发者需优先考虑安全实现,以避免新兴风险。更多细节可参考Anthropic官方文档。