焦点架构
了解MCP怎样毗连客户端、服务端和LLM
模型上下文协议(MCP)基于一个机动、可扩展的架构,使LLM应用步伐和集成之间的通讯无缝衔接。本文档涵盖了焦点架构组件和概念。
概述
MCP遵循客户端-服务端架构,此中:
- 主机是启动毗连的LLM应用步伐(如Claude桌面或IDE)
- 客户端与服务端保持1:1毗连,位于主机应用步伐内部
- 服务端向客户端提供上下文、工具和提示
焦点组件
协议层
协议层处置惩罚消息框架、哀求/响应链接和高级通讯模式。
Python 示例代码
- class Session(BaseSession[RequestT, NotificationT, ResultT]):
- async def send_request(
- self,
- request: RequestT,
- result_type: type[Result]
- ) -> Result:
- """
- Send request and wait for response. Raises McpError if response contains error.
- """
- # Request handling implementation
- async def send_notification(
- self,
- notification: NotificationT
- ) -> None:
- """Send one-way notification that doesn't expect response."""
- # Notification handling implementation
- async def _received_request(
- self,
- responder: RequestResponder[ReceiveRequestT, ResultT]
- ) -> None:
- """Handle incoming request from other side."""
- # Request handling implementation
- async def _received_notification(
- self,
- notification: ReceiveNotificationT
- ) -> None:
- """Handle incoming notification from other side."""
- # Notification handling implementation
复制代码 关键类包括:
传输层
传输层处置惩罚客户端和服务端之间的现实通讯。MCP支持多种传输机制:
- Stdio传输
- HTTP与SSE传输
- 利用服务端发送事件(SSE)进行服务端到客户端的消息传递
- 利用HTTP POST进行客户端到服务端的消息传递
全部传输都利用JSON-RPC 2.0来互换消息。有关模型上下文协议消息格式的详细信息,请参阅规范。
消息范例
MCP有以下主要范例的消息:
- interface Request {
- method: string;
- params?: { ... };
- }
复制代码- interface Result {
- [key: string]: unknown;
- }
复制代码- interface Error {
- code: number;
- message: string;
- data?: unknown;
- }
复制代码- interface Notification {
- method: string;
- params?: { ... };
- }
复制代码 毗连生命周期
1. 初始化
- 1. 客户端发送`initialize`请求,包含协议版本和能力
- 2. 服务端响应其协议版本和能力
- 3. 客户端发送`initialized`通知作为确认
- 4. 正常消息交换开始
复制代码 2. 消息互换
初始化后,支持以下模式:
- 哀求-响应:客户端或服务端发送哀求,另一方响应
- 关照:任一方发送单向消息
3. 终止
任一方都可以终止毗连:
- 通过close()进行干净关闭
- 传输断开
- 错误条件
错误处置惩罚
MCP定义了这些标准错误代码:
- enum ErrorCode {
- // 标准JSON-RPC错误代码
- ParseError = -32700,
- InvalidRequest = -32600,
- MethodNotFound = -32601,
- InvalidParams = -32602,
- InternalError = -32603
- }
复制代码 SDK和应用步伐可以在-32000以上定义自己的错误代码。
错误通过以下方式传播:
- 对哀求的错误响应
- 传输上的错误事件
- 协议级错误处置惩罚步伐
实现示例
以下是一个实现MCP服务端的根本示例:
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
- 考虑安全影响,包括身份验证和授权
消息处置惩罚
- 哀求处置惩罚
- 彻底验证输入
- 利用范例安全的模式
- 优雅地处置惩罚错误
- 实现超时
- 进度报告
- 对长时间操纵利用进度令牌
- 逐步报告进度
- 在已知时包括总进度
- 错误管理
- 利用适当的错误代码
- 包括有用的错误消息
- 在错误时清理资源
安全注意事项
- 传输安全
- 对远程毗连利用TLS
- 验证毗连来源
- 在必要时实现身份验证
- 消息验证
- 验证全部传入消息
- 清理输入
- 检查消息巨细限制
- 验证JSON-RPC格式
- 资源掩护
- 实现访问控制
- 验证资源路径
- 监控资源利用环境
- 限制哀求速率
- 错误处置惩罚
- 不要泄露敏感信息
- 记载与安全相关的错误
- 实现适当的清理
- 处置惩罚DoS场景
调试和监控
- 日志记载
- 诊断
- 实现健康检查
- 监控毗连状态
- 跟踪资源利用环境
- 分析性能
- 测试
- 测试不同的传输
- 验证错误处置惩罚
- 检查边沿环境
- 负载测试服务端
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |