前言
在人工智能应用日益复杂的今天,大语言模型(LLM)需要与外部工具和数据源进行高效、安全的交互。Model Context Protocol (MCP) 协议应运而生,它通过标准化的方式解决了这一集成难题。本文将深入探讨 MCP 中基于 Server-Sent Events (SSE) 的通信过程,解析这一"双通道"架构如何实现高效的双向通信。
一、核心概念简介
1. MCP (Model Context Protocol)
MCP 是一个开放协议,旨在标准化 LLM 与外部数据源和工具的集成方式。它采用客户端-服务器架构:
- MCP 客户端:通常内置于 AI 应用程序中,负责管理连接和转发请求
- MCP 服务器:提供具体的工具功能或数据访问接口
- MCP 主机:运行 AI 模型并管理用户交互的环境
2. SSE (Server-Sent Events)
SSE 是一种基于 HTTP 的服务器向客户端单向推送事件的技术。与 WebSocket 不同,SSE 是单向的(服务器到客户端),使用 HTTP 长连接,并内置自动重连机制。
二、通信架构:双通道模型
MCP over SSE 采用独特的"双通道"架构实现双向通信:
- SSE 长连接(推送通道):服务器 → 客户端的单向持久连接
- HTTP POST 请求(控制通道):客户端 → 服务器的单向短连接
这种设计实现了请求与响应的完全解耦,下面通过一个完整时序图展示这一过程:
三、详细通信过程分析
阶段一:连接建立与端点交换
通信始于 SSE 长连接的建立,而最关键的第一步是服务器返回消息端点:
客户端发起 SSE 连接:
GET /sse HTTP/1.1 Host: localhost:8080 Accept: text/event-stream Cache-Control: no-cache Connection: keep-alive
服务器响应并保持连接:
HTTP/1.1 200 OK Content-Type: text/event-stream Transfer-Encoding: chunked Connection: keep-alive
服务器立即推送 endpoint 事件:
event: endpoint data: {"uri": "/messages?sessionId=szN2CtIyxmYqjDAAAAAF", "protocol": "ssE"}
或者更简洁的形式:
event: endpoint data: /messages?sessionId=szN2CtIyxmYqjDAAAAAF
这个端点 URI 包含了唯一的会话标识符(session_id),客户端必须使用此端点来发送所有后续的 POST 请求。
阶段二:能力交换与会话初始化
获取端点后,客户端通过独立的 POST 请求初始化会话:
客户端发送初始化请求(使用获取的端点):
POST /messages?sessionId=szN2CtIyxmYqjDAAAAAF HTTP/1.1 Content-Type: application/json Mcp-Session-Id: szN2CtIyxmYqjDAAAAAF
请求体:
{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2024.11.05", "capabilities": { "tools": {} } } }
服务器立即确认:
HTTP/1.1 202 Accepted
服务器通过 SSE 通道返回实际响应:
event: message data: {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024.11.05","capabilities":{}}}
阶段三:工具发现与调用
工具发现
客户端请求工具列表(使用相同端点):
POST /messages?sessionId=szN2CtIyxmYqjDAAAAAF HTTP/1.1 Content-Type: application/json Mcp-Session-Id: szN2CtIyxmYqjDAAAAAF
请求体:
{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }
服务器通过 SSE 返回工具列表:
event: message data: {"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"get_weather","description":"获取天气信息"}]}}
工具调用
客户端调用工具:
POST /messages?sessionId=szN2CtIyxmYqjDAAAAAF HTTP/1.1 Content-Type: application/json Mcp-Session-Id: szN2CtIyxmYqjDAAAAAF
请求体:
{ "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "get_weather", "arguments": { "location": "北京" } } }
服务器流式返回结果:
event: message data: {"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"北京的天气是..."}],"isComplete":false}} event: message data: {"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"28°C,晴天"}],"isComplete":true}}
阶段四:连接维持与管理
为了保持 SSE 长连接活跃,客户端会定期发送心跳:
POST /messages?sessionId=szN2CtIyxmYqjDAAAAAF HTTP/1.1
Content-Type: application/json
Mcp-Session-Id: szN2CtIyxmYqjDAAAAAF
{
"jsonrpc": "2.0",
"method": "ping"
}
服务器通过 SSE 通道回应:
event: message
data: {"jsonrpc":"2.0","method":"pong"}
四、技术优势与设计理念
1. 端点发现机制的重要性
- 动态路由:服务器可以动态分配不同的端点路径,实现灵活的负载均衡
- 会话隔离:每个会话有唯一标识,确保多会话间的数据隔离和安全
- 协议演进:端点机制为协议未来扩展提供了灵活性
2. 异步通信模式
- 非阻塞处理:客户端发送请求后立即释放,无需等待响应
- 高效资源利用:单条 SSE 连接处理多个请求的响应
- 实时性能:服务器可以随时推送数据,适合流式内容
3. 解耦设计
- 职责分离:发送请求与接收响应完全分离
- 独立扩展:客户端和服务器可以独立扩展和优化
4. 网络友好性
- HTTP 兼容:基于标准 HTTP 协议,易于穿越防火墙
- 重连机制:SSE 内置自动重连,处理网络不稳定的情况
五、实际应用场景
1. 实时数据查询
// 调用股票查询工具
{
"method": "tools/call",
"params": {
"name": "get_stock_price",
"arguments": {
"symbol": "AAPL"
}
}
}
2. 流式内容生成
// 服务器流式返回代码生成结果
data: {"result":{"content":[{"type":"text","text":"function"}],"isComplete":false}}
data: {"result":{"content":[{"type":"text","text":" calculate() {"}],"isComplete":false}}
data: {"result":{"content":[{"type":"text","text":" return 1+1;"}],"isComplete":false}}
data: {"result":{"content":[{"type":"text","text":"}"}],"isComplete":true}}
3. 长时间运行任务
// 服务器定期推送任务进度
data: {"result":{"progress":30,"status":"processing"}}
data: {"result":{"progress":60,"status":"processing"}}
data: {"result":{"progress":100,"status":"completed","result":"任务完成"}}
六、总结
MCP over SSE 的通信过程展示了一种高效、实用的双向通信模式,其中端点发现机制是整个流程的起点和关键:
- SSE 连接建立后,服务器首先返回唯一的消息端点 URI
- SSE 长连接作为服务器向客户端推送数据的专用通道
- HTTP POST 请求使用获取的端点作为客户端向服务器发送指令的控制通道
- 异步处理模式实现了请求与响应的完全解耦
- 流式响应能力特别适合大模型和工具调用的场景
这种设计不仅提供了技术上的优势,还为构建复杂 AI 应用提供了可扩展、易维护的通信基础。随着 MCP 协议的不断发展,这种基于 SSE 的通信模式有望成为 AI 系统集成的标准方式之一。
希望本文能够帮助您深入理解 MCP over SSE 的通信过程,为您在开发 AI 应用时提供参考和指导。