Model Context Protocol (MCP) 中的传输层为 clients 和 servers 之间的通信提供基础。传输层处理消息发送和接收的底层机制。
消息格式
MCP 使用 JSON-RPC 2.0 作为其传输格式。传输层负责将 MCP 协议消息转换为 JSON-RPC 格式进行传输,并将接收到的 JSON-RPC 消息转换回 MCP 协议消息。
使用的 JSON-RPC 消息有三种类型:
{
jsonrpc : "2.0" ,
id : number | string ,
method : string ,
params ?: object
}
{
jsonrpc : "2.0" ,
id : number | string ,
result ?: object ,
error ?: {
code: number ,
message: string ,
data? : unknown
}
}
{
jsonrpc : "2.0" ,
method : string ,
params ?: object
}
内置传输层种类
MCP 包含两个标准传输实现:
标准输入输出 (stdio)
stdio 传输通过标准输入和输出流进行通信。这对于本地集成和命令行工具特别有用。
在以下情况下使用 stdio:
构建命令行工具
实现本地集成
需要简单的进程通信
使用 shell 脚本
TypeScript (Server) TypeScript (Client) Python (Server) Python (Client) const server = new Server ({
name: "example-server" ,
version: "1.0.0"
}, {
capabilities: {}
});
const transport = new StdioServerTransport ();
await server . connect ( transport );
服务器发送事件 (SSE)
SSE 传输通过 HTTP POST 请求实现服务器到客户端的流式通信。
在以下情况下使用 SSE:
仅需要 server-to-client 的流式通信
在受限网络中工作
实现简单更新
TypeScript (Server) TypeScript (Client) Python (Server) Python (Client) import express from "express" ;
const app = express ();
const server = new Server ({
name: "example-server" ,
version: "1.0.0"
}, {
capabilities: {}
});
let transport : SSEServerTransport | null = null ;
app . get ( "/sse" , ( req , res ) => {
transport = new SSEServerTransport ( "/messages" , res );
server . connect ( transport );
});
app . post ( "/messages" , ( req , res ) => {
if ( transport ) {
transport . handlePostMessage ( req , res );
}
});
app . listen ( 3000 );
自定义传输层
MCP 使得为特定需求实现自定义传输层变得简单。任何传输层实现只需符合 Transport 接口:
你可以为以下情况实现自定义传输:
自定义网络协议
专用通信通道
与现有系统集成
性能优化
interface Transport {
// 开始处理消息
start () : Promise < void >;
// 发送 JSON-RPC 消息
send ( message : JSONRPCMessage ) : Promise < void >;
// 关闭连接
close () : Promise < void >;
// 回调函数
onclose ?: () => void ;
onerror ?: ( error : Error ) => void ;
onmessage ?: ( message : JSONRPCMessage ) => void ;
}
错误处理
传输实现应处理各种错误场景:
连接错误
消息解析错误
协议错误
网络超时
资源清理
错误处理示例:
class ExampleTransport implements Transport {
async start () {
try {
// 连接逻辑
} catch ( error ) {
this . onerror ?.( new Error ( `连接失败: ${ error } ` ));
throw error ;
}
}
async send ( message : JSONRPCMessage ) {
try {
// 发送逻辑
} catch ( error ) {
this . onerror ?.( new Error ( `消息发送失败: ${ error } ` ));
throw error ;
}
}
}
最佳实践
在实现或使用 MCP 传输时:
正确处理连接生命周期
实现适当的错误处理
在连接关闭时清理资源
使用适当的超时
在发送前验证消息
记录传输事件以便调试
在适当时实现重连逻辑
处理消息队列中的背压
监控连接健康状况
实现适当的安全措施
安全考虑
在实现传输时:
认证和授权
实现适当的认证机制
验证客户端凭据
使用安全的令牌处理
实现授权检查
数据安全
使用 TLS 进行网络传输
加密敏感数据
验证消息完整性
实现消息大小限制
对输入数据 sanitize
网络安全
实现速率限制
使用适当的超时
处理拒绝服务场景
监控异常模式
实施适当的防火墙规则
调试传输
一些 Debug 传输层问题的提示:
启用调试日志
监控消息流
检查连接状态
验证消息格式
测试错误场景
使用网络分析工具
实现健康检查
监控资源使用
测试边界情况
使用适当的错误跟踪