MCP 通信机制
模型上下文协议 (MCP) 中的传输层为客户端和服务器之间的通信提供了基础。传输层处理消息发送和接收的底层机制。
通信机制
MCP 目前主要有三种通信机制:
- 标准输入输出流(stdio)
- 可流式HTTP(Streamable HTTP)
- 服务器发送事件(Server-Sent Events, SSE)
1. 标准输入/输出 (stdio)
stdio
传输支持通过标准输入/输出流进行通信。这对于本地集成和命令行工具尤其有用。
使用场景
在以下情况下使用 stdio:
- 构建命令行工具
- 实现本地集成
- 需要简单的进程通信
- 使用 Shell 脚本
配置示例
拿github的mcp服务配置为例,配置文件如下所示:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
}
}
}
}
2. 可流式 HTTP (Streamable HTTP)
可流式HTTP利用HTTP协议的分块传输编码(chunked transfer encoding)特性,允许服务器在生成完整响应前开始发送数据块。
使用场景
- 构建基于 Web 的集成,比如在在浏览器中显示AI生成内容的应用
- 需要通过 HTTP 进行客户端与服务器通信,比如进行AI模型的文本扩写等类似功能,需要实时反馈的流式UI更新
- 需要有状态会话,比如在多轮对话系统中保持上下文连贯性,此时可以使用基于HTTP的会话管理机制。
- 支持多个并发客户端,比如在大规模部署的AI服务中,需要同时处理来自不同用户的请求,或者需要跨多台服务器的AI处理。
- 实现可断点续传连接,比如在网络不稳定环境下确保大型AI模型生成任务的连续性。
配置示例
以代码安全扫描MCP服务为例,需要注意的是type
配置为http
,配置如下:
{
"mcpServers": {
"qihoo-code-security2": {
"type": "http",
"url": "http://code-security.mcp.qihoo.net:8887/mcp"
}
}
}
3. 服务器发送事件(Server-Sent Events, SSE)
SSE
也是一种基于HTTP
的服务器推送技术,允许服务器向客户端推送数据。SSE
是HTML5
规范的一部分,使用EventSource API
实现。传统的 SSE 传输支持服务器到客户端的流式处理,其中包含用于客户端到服务器通信的 HTTP POST
请求。
SSE
作为独立传输自协议版本 2024-11-05 起已弃用。它已被 Streamable HTTP
取代,后者将 SSE
作为可选的流机制。
配置示例
以代码安全扫描MCP服务为例,需要注意的是type
配置为sse
,配置如下:
{
"mcpServers": {
"qihoo-code-security": {
"type": "sse",
"url": "http://code-security.mcp.qihoo.net:8888/sse",
"timeout": 300
}
}
}
三种通信机制的对比分析
针对三种通信机制从通信方向、扩展性、安全性等多个特性进行对比分析,具体细节见下表:
特性 | stdio | Streamable HTTP | SSE |
---|---|---|---|
概念 | 标准输入输出流 | 可流式HTTP | 服务器发送事件 |
通信方向 | 双向 (基于进程) | 双向 (请求-响应) | 单向 (server→client) |
部署复杂度 | 低 | 中 | 中 |
网络支持 | 仅本地 | 全面支持网络通信 | 支持网络通信 |
断线重连 | 不支持 | 需手动实现 | 内置支持 |
流式能力 | 有限,本地高性能,协议灵活 | 强大,双向流式,协议通用,流控能力强 | 有限,仅适合轻量级Web推送 |
扩展性 | 差 (局限于本地) | 极强 (可自定义transport) | 有限 |
浏览器兼容性 | 不适用 | 广泛支持 | 大多数现代浏览器 |
安全机制 | 依赖运行环境和权限隔离 | 协议层集成多种安全手段,可通过HTTPS加密 | 需手动实现,可通过HTTPS加密 |
双向通信 | 支持 (需自定义协议) | 支持 (设计更完善) | 客户端到服务端需额外HTTP POST |
标准化 | 非网络标准 | 正在标准化,未来主推 | 非正式Web标准 |
性能 | 本地高性能 | 良好,支持HTTP/1/2 | 一般,仅支持HTTP/1 |
适用场景 | 本地开发、CLI工具、容器、无网络环境 | 微服务、API、Web应用、云服务、高并发场景 | 简单Web推送、页面实时更新 |
未来发展 | 稳定,本地场景持续使用 | 持续发展,主流解决方案 | 逐渐被淘汰 |
选择建议
- Stdio: 本地进程间通信,简单高效
- Streamable HTTP: 现代 Web 应用、高性能 API 和网络服务(支持HTTP/2),以及安全敏感场景的最佳流式通信解决方案,也是 SSE 实现迁移的理想目标。
- SSE: 适合于 Web 应用,将逐步被Streamable HTTP 替代。