跳到主要内容

传输

模型上下文协议(MCP)中的传输为客户端和服务器之间的通信提供基础。传输处理消息发送和接收的底层机制。

消息格式

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脚本
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:

  • 只需要服务器到客户端的流式传输
  • 在受限网络中工作
  • 实现简单的更新
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使得为特定需求实现自定义传输变得容易。任何传输实现只需要符合传输接口:

你可以为以下情况实现自定义传输:

  • 自定义网络协议
  • 专门的通信通道
  • 与现有系统集成
  • 性能优化
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;
}

最佳实践

在实现传输时:

  1. 确保可靠的消息传递
  2. 实现适当的错误处理
  3. 处理连接生命周期
  4. 考虑性能优化
  5. 实现重连机制
  6. 添加日志记录
  7. 处理超时
  8. 实现心跳机制
  9. 考虑安全性
  10. 测试边界情况

安全考虑

在实现传输时:

  • 加密通信
  • 验证消息完整性
  • 实现访问控制
  • 防止消息注入
  • 处理敏感数据
  • 监控异常活动
  • 实现速率限制
  • 审计传输日志