MCP(模型上下文协议)核心架构解析
创作时间:
作者:
@小白创作中心
MCP(模型上下文协议)核心架构解析
引用
1
来源
1.
https://www.bilibili.com/opus/1022254559229116469
MCP(Model Context Protocol)是一种基于灵活且可扩展架构的通信协议,能够在LLM应用程序和各类集成之间实现无缝通信。本文将详细介绍MCP的核心架构组件及相关概念,包括协议层、传输层、消息类型、连接生命周期、错误处理等内容,并提供具体的实现示例和最佳实践建议。
概述
MCP采用客户端-服务器架构,其中:
- Host(主机):指发起连接的LLM应用(如Claude Desktop或IDE)
- Clients(客户端):在主机应用程序内部,维护与服务器的一对一连接
- Servers(服务器):为客户端提供上下文、工具及提示(prompts)
核心组件
协议层(Protocol layer)
协议层负责处理消息的封装、请求/响应关联,以及高级通信模式。
TypeScript实现
class Protocol<Request, Notification, Result> {
// 处理传入请求
setRequestHandler<T>(schema: T, handler: (request: T, extra: RequestHandlerExtra) => Promise<Result>): void
// 处理传入通知
setNotificationHandler<T>(schema: T, handler: (notification: T) => Promise<void>): void
// 发送请求并等待响应
request<T>(request: Request, schema: T, options?: RequestOptions): Promise<T>
// 发送单向通知
notification(notification: Notification): Promise<void>
}
Python实现
class Session(BaseSession[RequestT, NotificationT, ResultT]):
async def send_request(
self,
request: RequestT,
result_type: type[Result]
) -> Result:
"""发送请求并等待响应。如果响应中包含错误,将抛出McpError。"""
# 请求处理的具体实现
async def send_notification(
self,
notification: NotificationT
) -> None:
"""发送不需要响应的单向通知。"""
# 通知处理的具体实现
async def _received_request(
self,
responder: RequestResponder[ReceiveRequestT, ResultT]
) -> None:
"""处理对端发来的请求。"""
# 请求处理的具体实现
async def _received_notification(
self,
notification: ReceiveNotificationT
) -> None:
"""处理对端发来的通知。"""
# 通知处理的具体实现
关键类包括:
- Protocol
- Client
- Server
传输层(Transport layer)
传输层负责在客户端和服务器之间进行实际的数据通信。MCP支持多种传输机制:
- tdio传输(Stdio transport)
- 使用标准输入/输出进行通信
- 适用于本地进程通信
- 基于HTTP + SSE的传输(HTTP with SSE transport)
- 通过Server-Sent Events实现服务器到客户端的消息传输
- 通过HTTP POST实现客户端到服务器的请求
所有传输都使用JSON-RPC 2.0来交换消息。详细的Model Context Protocol消息格式请参阅规范。
消息类型
MCP有以下主要消息类型:
Requests(请求):期待对端返回响应
interface Request { method: string; params?: { ... }; }
Results(结果):对请求的成功响应
interface Result { [key: string]: unknown; }
Errors(错误):表示请求失败
interface Error { code: number; message: string; data?: unknown; }
Notifications(通知):单向消息,不期待响应
interface Notification { method: string; params?: { ... }; }
连接生命周期
- 初始化(Initialization)
- 消息交换
初始化完成后,支持以下模式:
- Request-Response(请求-响应):客户端或服务器发起请求,对方返回响应
- Notifications(通知):任意一方可以发送单向消息
- 终止(Termination)
任何一方都可以终止连接:
- 通过close()进行正常关闭
- 传输层断开连接
- 遇到错误导致关闭
错误处理
MCP定义了以下标准错误码:
enum ErrorCode {
// JSON-RPC标准错误码
ParseError = -32700,
InvalidRequest = -32600,
MethodNotFound = -32601,
InvalidParams = -32602,
InternalError = -32603
}
SDK和应用程序可以定义大于-32000的自定义错误码。
错误会通过以下方式进行传播:
- 请求的错误响应
- 传输层错误事件
- 协议层的错误处理器
实现示例
下面展示了一个实现MCP服务器的简单示例:
TypeScript实现
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server({
name: "example-server",
version: "1.0.0"
}, {
capabilities: {
resources: {}
}
});
// 处理请求
server.setRequestHandler(ListResourcesRequestSchema, async () => {
return {
resources: [
{
uri: "example://resource",
name: "Example Resource"
}
]
};
});
// 连接传输层
const transport = new StdioServerTransport();
await server.connect(transport);
Python实现
import asyncio
import mcp.types as types
from mcp.server import Server
from mcp.server.stdio import stdio_server
app = Server("example-server")
@app.list_resources()
async def list_resources() -> list[types.Resource]:
return [
types.Resource(
uri="example://resource",
name="Example Resource"
)
]
async def main():
async with stdio_server() as streams:
await app.run(
streams[0],
streams[1],
app.create_initialization_options()
)
if __name__ == "__main__":
asyncio.run(main)
最佳实践
传输层选择
- 本地通信
- 对于本地进程建议使用Stdio传输
- 适合同一台机器上的高效通信
- 进程管理简单
- 远程通信
- 对需要HTTP兼容的场景可使用SSE
- 注意安全性,包括认证和授权
消息处理
- 请求处理
- 严格验证输入
- 使用类型安全的模式(schema)
- 正确处理错误
- 实现超时机制
- 进度报告
- 对耗时操作使用进度标识(progress token)
- 按阶段报告进度
- 如果已知总进度,应提供进度总值
- 错误管理
- 使用合适的错误码
- 提供有用的错误信息
- 在错误时清理资源
安全注意事项
- 传输安全
- 远程连接使用TLS
- 验证连接来源
- 必要时实现身份认证
- 消息验证
- 验证所有传入消息
- 对输入进行清理
- 检查消息大小限制
- 确保符合JSON-RPC格式
- 资源保护
- 实现访问控制
- 校验资源路径
- 监控资源使用情况
- 进行请求速率限制
- 错误处理
- 不要泄漏敏感信息
- 记录安全相关的错误
- 实现正确的清理工作
- 考虑拒绝服务(DoS)风险
调试和监控
- 日志记录
- 记录协议事件
- 跟踪消息流向
- 监控性能
- 记录错误
- 诊断
- 实现健康检查(health checks)
- 监控连接状态
- 跟踪资源使用
- 性能剖析(profiling)
- 测试
- 测试不同传输方式
- 验证错误处理
- 检查边界情况
- 对服务器进行负载测试
热门推荐
探访北京古寺:潭柘寺与雍和宫的文化宝藏
泰山:25亿年地质变迁塑造“五岳之首”
五步训练法:让你的德国牧羊犬成为合格搜救犬
罗技G HUB调节绝地求生鼠标灵敏度,新手必看设置指南
高热量食物增肥挑战,一周胖十斤?
首位诺奖中国作家莫言:从功利到艺术的创作之路
冬游九寨沟:80元门票看冰雪世界,附最佳游览攻略
USB 3.0传输快10倍,供电增近一倍
德天跨国大瀑布:丰水期 vs 枯水期,哪个更值得打卡?
12306购票攻略:荆州到厦门需在武汉中转
额济纳旗胡杨林和巴丹吉林沙漠,打卡最美自然景观
为什么恋人会表现得冷漠?从依恋理论解读情感疏远
赤大师养生茶:酸枣仁粉的升级版
混动车VS燃油车:购车贵2-5万,6年使用反省钱
东北大乱炖:从满族传统到现代创新,一锅炖煮百年饮食文化
绿豆汤新CP,让你少往医院跑
苏打粉泡水喝,真的能调理肠胃吗?
冬季开车省油秘籍:哈弗H6车主必看!
那香海:威海最美拍照打卡地
“欧罗巴快船”启程:揭秘木卫二的宜居之谜
明清坐榻收藏热:从拍卖市场看其价值与鉴别要点
黄圣依:婚姻里的"受害者"还是"心机者"
旅游业增10%、金融业蓬勃发展,迪拜双轮驱动模式显成效
运城市公交升级,智能便捷又舒适
掩耳盗铃:从古代寓言到现代心理困境
墨西哥发现奇特盲眼鱼:脸部味蕾随年龄增长而增多
告别尬聊:让微信对话充满乐趣与共鸣的实用指南
新年贺词如何写?4个实用技巧+2个成功案例,让祝福更有温度
直播带货益生菌减肥神话破灭:专家称效果有限,过度依赖反伤身
金昌至拉萨15天壮丽之旅:穿越戈壁雪山高原